Merge branch 'master' of https://fuchsia.googlesource.com/third_party/openssh-portable into merge-i

Change-Id: I98fe3f288fde5baf38478869aecc6ec42baa9713
diff --git a/.depend b/.depend
new file mode 100644
index 0000000..7cc0bfd
--- /dev/null
+++ b/.depend
@@ -0,0 +1,175 @@
+# DO NOT DELETE
+
+addrmatch.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h match.h log.h
+atomicio.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h
+audit-bsm.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+audit-linux.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+audit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-bsdauth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-krb5.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h log.h sshbuf.h sshkey.h misc.h servconf.h uidswap.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+auth-options.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssherr.h log.h sshbuf.h misc.h sshkey.h match.h ssh2.h auth-options.h
+auth-pam.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-passwd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h sshbuf.h ssherr.h log.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h
+auth-rhosts.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h uidswap.h pathnames.h log.h misc.h sshbuf.h sshkey.h servconf.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+auth-shadow.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-sia.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-skey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h groupaccess.h log.h sshbuf.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h canohost.h uidswap.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h
+auth.o: authfile.h monitor_wrap.h ssherr.h compat.h channels.h
+auth2-chall.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh2.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h sshbuf.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h ssherr.h log.h misc.h servconf.h
+auth2-gss.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth2-hostbased.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h sshbuf.h log.h misc.h servconf.h compat.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h canohost.h monitor_wrap.h
+auth2-hostbased.o: pathnames.h ssherr.h match.h
+auth2-kbdint.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h hostfile.h auth.h auth-pam.h audit.h loginrec.h log.h misc.h servconf.h ssherr.h
+auth2-none.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h log.h misc.h servconf.h compat.h ssh2.h ssherr.h monitor_wrap.h
+auth2-passwd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h ssherr.h log.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h monitor_wrap.h misc.h servconf.h
+auth2-pubkey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h sshbuf.h log.h misc.h servconf.h compat.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h pathnames.h uidswap.h
+auth2-pubkey.o: auth-options.h canohost.h monitor_wrap.h authfile.h match.h ssherr.h channels.h session.h
+auth2.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h log.h sshbuf.h misc.h servconf.h compat.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h pathnames.h ssherr.h
+auth2.o: monitor_wrap.h digest.h
+authfd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h authfd.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h compat.h log.h atomicio.h misc.h ssherr.h
+authfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h ssh.h log.h authfile.h misc.h atomicio.h sshkey.h sshbuf.h ssherr.h krl.h
+bitmap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h bitmap.h
+canohost.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h log.h canohost.h misc.h
+chacha.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h chacha.h
+channels.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h ssherr.h sshbuf.h packet.h dispatch.h opacket.h log.h misc.h channels.h compat.h canohost.h sshkey.h authfd.h pathnames.h match.h
+cipher-aes.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h
+cipher-aesctr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher-aesctr.h rijndael.h
+cipher-chachapoly.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h sshbuf.h ssherr.h cipher-chachapoly.h chacha.h poly1305.h
+cipher-ctr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+cipher.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h misc.h sshbuf.h ssherr.h digest.h openbsd-compat/openssl-compat.h
+cleanup.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h
+clientloop.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h packet.h dispatch.h opacket.h sshbuf.h compat.h channels.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h
+clientloop.o: myproposal.h log.h misc.h readconf.h clientloop.h sshconnect.h authfd.h atomicio.h sshpty.h match.h msg.h ssherr.h hostfile.h
+compat.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h compat.h log.h match.h kex.h mac.h
+crc32.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crc32.h
+dh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+digest-libc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h digest.h
+digest-openssl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+dispatch.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh2.h log.h dispatch.h packet.h openbsd-compat/sys-queue.h opacket.h compat.h ssherr.h
+dns.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h ssherr.h dns.h log.h digest.h
+ed25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h ge25519.h fe25519.h sc25519.h
+entropy.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+fatal.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h
+fe25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h fe25519.h crypto_api.h
+ge25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h fe25519.h crypto_api.h sc25519.h ge25519.h ge25519_base.data
+groupaccess.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h groupaccess.h match.h log.h
+gss-genr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+gss-serv-krb5.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+gss-serv.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+hash.o: crypto_api.h includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h log.h ssherr.h
+hmac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h digest.h hmac.h
+hostfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h sshkey.h hostfile.h log.h misc.h ssherr.h digest.h hmac.h
+kex.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h log.h match.h misc.h monitor.h ssherr.h sshbuf.h
+kex.o: digest.h
+kexc25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h ssh2.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h log.h digest.h ssherr.h
+kexc25519c.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h log.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h ssh2.h sshbuf.h digest.h ssherr.h
+kexc25519s.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h kex.h mac.h log.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h ssh2.h sshbuf.h ssherr.h
+kexdh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexdhc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexdhs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexecdh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexecdhc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexecdhs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexgex.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexgexc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexgexs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+krl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h sshbuf.h ssherr.h sshkey.h authfile.h misc.h log.h digest.h bitmap.h krl.h
+log.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h
+loginrec.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h hostfile.h ssh.h loginrec.h log.h atomicio.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h canohost.h auth.h auth-pam.h audit.h sshbuf.h ssherr.h
+logintest.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h loginrec.h
+mac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h hmac.h umac.h mac.h misc.h ssherr.h sshbuf.h openbsd-compat/openssl-compat.h
+match.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h misc.h
+md5crypt.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h misc.h log.h ssh.h sshbuf.h ssherr.h
+moduli.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+monitor.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h atomicio.h xmalloc.h ssh.h sshkey.h sshbuf.h hostfile.h auth.h auth-pam.h audit.h loginrec.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h
+monitor.o: rijndael.h kex.h mac.h dh.h packet.h dispatch.h opacket.h auth-options.h sshpty.h channels.h session.h sshlogin.h canohost.h log.h misc.h servconf.h monitor.h monitor_wrap.h monitor_fdpass.h compat.h ssh2.h authfd.h match.h ssherr.h
+monitor_fdpass.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h monitor_fdpass.h
+monitor_wrap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+monitor_wrap.o: auth-options.h packet.h dispatch.h opacket.h log.h monitor.h monitor_wrap.h atomicio.h monitor_fdpass.h misc.h channels.h session.h servconf.h ssherr.h
+msg.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h ssherr.h log.h atomicio.h msg.h misc.h
+mux.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h log.h ssh.h ssh2.h pathnames.h misc.h match.h sshbuf.h channels.h msg.h packet.h dispatch.h opacket.h monitor_fdpass.h sshpty.h sshkey.h readconf.h clientloop.h ssherr.h
+nchan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h ssh2.h sshbuf.h ssherr.h packet.h dispatch.h opacket.h channels.h compat.h log.h
+opacket.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h log.h
+packet.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h crc32.h compat.h ssh2.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h digest.h log.h canohost.h misc.h channels.h ssh.h
+packet.o: packet.h dispatch.h opacket.h ssherr.h sshbuf.h
+platform-misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+platform-pledge.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+platform-tracing.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h
+platform.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+poly1305.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h poly1305.h
+progressmeter.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h progressmeter.h atomicio.h misc.h
+readconf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/glob.h xmalloc.h ssh.h ssherr.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h pathnames.h log.h sshkey.h misc.h readconf.h match.h kex.h mac.h uidswap.h
+readconf.o: myproposal.h digest.h
+readpass.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h misc.h pathnames.h log.h ssh.h uidswap.h
+rijndael.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h rijndael.h
+sandbox-capsicum.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-darwin.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-null.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-pledge.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-rlimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-seccomp-filter.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-solaris.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-systrace.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sc25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sc25519.h crypto_api.h
+scp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h atomicio.h pathnames.h log.h misc.h progressmeter.h utf8.h
+servconf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h log.h sshbuf.h misc.h servconf.h compat.h pathnames.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h match.h channels.h
+servconf.o: groupaccess.h canohost.h packet.h dispatch.h opacket.h ssherr.h hostfile.h auth.h auth-pam.h audit.h loginrec.h myproposal.h digest.h
+serverloop.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h packet.h dispatch.h opacket.h sshbuf.h log.h misc.h servconf.h canohost.h sshpty.h channels.h compat.h ssh2.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h
+serverloop.o: cipher-aesctr.h rijndael.h kex.h mac.h hostfile.h auth.h auth-pam.h audit.h loginrec.h session.h auth-options.h serverloop.h ssherr.h
+session.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h opacket.h sshbuf.h ssherr.h match.h uidswap.h compat.h channels.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h
+session.o: cipher-aesctr.h rijndael.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h authfd.h pathnames.h log.h misc.h servconf.h sshlogin.h serverloop.h canohost.h session.h kex.h mac.h monitor_wrap.h sftp.h atomicio.h
+sftp-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssherr.h sshbuf.h log.h atomicio.h progressmeter.h misc.h utf8.h sftp.h sftp-common.h sftp-client.h openbsd-compat/glob.h
+sftp-common.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssherr.h sshbuf.h log.h misc.h sftp.h sftp-common.h
+sftp-glob.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sftp.h sftp-common.h sftp-client.h openbsd-compat/glob.h
+sftp-server-main.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h sftp.h misc.h xmalloc.h
+sftp-server.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshbuf.h ssherr.h log.h misc.h match.h uidswap.h sftp.h sftp-common.h
+sftp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h pathnames.h misc.h utf8.h sftp.h ssherr.h sshbuf.h sftp-common.h sftp-client.h openbsd-compat/glob.h
+ssh-add.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h xmalloc.h ssh.h log.h sshkey.h sshbuf.h authfd.h authfile.h pathnames.h misc.h ssherr.h digest.h
+ssh-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h sshbuf.h sshkey.h authfd.h compat.h log.h misc.h digest.h ssherr.h match.h
+ssh-dss.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh-ecdsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh-ed25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h sshbuf.h sshkey.h ssherr.h ssh.h
+ssh-keygen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h authfile.h uuencode.h sshbuf.h pathnames.h log.h misc.h match.h hostfile.h dns.h ssh.h ssh2.h ssherr.h ssh-pkcs11.h atomicio.h krl.h digest.h utf8.h authfd.h
+ssh-keyscan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h compat.h myproposal.h packet.h dispatch.h opacket.h log.h
+ssh-keyscan.o: atomicio.h misc.h hostfile.h ssherr.h ssh_api.h ssh2.h dns.h
+ssh-keysign.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h sshkey.h ssh.h ssh2.h misc.h sshbuf.h authfile.h msg.h canohost.h pathnames.h readconf.h uidswap.h ssherr.h
+ssh-pkcs11-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh-pkcs11-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h sshbuf.h log.h misc.h sshkey.h authfd.h ssh-pkcs11.h ssherr.h
+ssh-pkcs11.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh-rsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh-xmss.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h canohost.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h packet.h dispatch.h opacket.h
+ssh.o: sshbuf.h channels.h sshkey.h authfd.h authfile.h pathnames.h clientloop.h log.h misc.h readconf.h sshconnect.h kex.h mac.h sshpty.h match.h msg.h version.h ssherr.h myproposal.h utf8.h
+ssh_api.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh_api.h openbsd-compat/sys-queue.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h ssh.h ssh2.h packet.h dispatch.h opacket.h compat.h log.h authfile.h misc.h
+ssh_api.o: version.h myproposal.h ssherr.h sshbuf.h
+sshbuf-getput-basic.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h
+sshbuf-getput-crypto.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h
+sshbuf-misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h
+sshbuf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h misc.h
+sshconnect.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h hostfile.h ssh.h sshbuf.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h compat.h sshkey.h sshconnect.h log.h misc.h readconf.h atomicio.h dns.h monitor_fdpass.h ssh2.h version.h authfile.h
+sshconnect.o: ssherr.h authfd.h
+sshconnect2.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshbuf.h packet.h dispatch.h opacket.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h myproposal.h
+sshconnect2.o: sshconnect.h authfile.h dh.h authfd.h log.h misc.h readconf.h match.h canohost.h msg.h pathnames.h uidswap.h hostfile.h ssherr.h utf8.h
+sshd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h opacket.h log.h sshbuf.h misc.h match.h servconf.h uidswap.h compat.h cipher.h cipher-chachapoly.h chacha.h
+sshd.o: poly1305.h cipher-aesctr.h rijndael.h digest.h sshkey.h kex.h mac.h myproposal.h authfile.h pathnames.h atomicio.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h authfd.h msg.h channels.h session.h monitor.h monitor_wrap.h ssh-sandbox.h auth-options.h version.h ssherr.h
+ssherr.o: ssherr.h
+sshkey-xmss.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sshkey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h ssh2.h ssherr.h misc.h sshbuf.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h sshkey.h sshkey-xmss.h match.h xmss_fast.h
+sshlogin.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshlogin.h ssherr.h loginrec.h log.h sshbuf.h misc.h servconf.h
+sshpty.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshpty.h log.h misc.h
+sshtty.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshpty.h
+ttymodes.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h opacket.h log.h compat.h sshbuf.h ssherr.h ttymodes.h
+uidswap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h uidswap.h xmalloc.h
+umac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h umac.h misc.h rijndael.h
+umac128.o: umac.c includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h umac.h misc.h rijndael.h
+utf8.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h utf8.h
+uuencode.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h uuencode.h
+verify.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h
+xmalloc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h
+xmss_commons.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+xmss_fast.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+xmss_hash.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+xmss_hash_address.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+xmss_wots.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/rmd160.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/getopt.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..650eb3c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,28 @@
+Makefile
+buildpkg.sh
+config.h
+config.h.in
+config.status
+configure
+openbsd-compat/Makefile
+openbsd-compat/regress/Makefile
+openssh.xml
+opensshd.init
+survey.sh
+**/*.0
+**/*.o
+**/*.out
+**/*.a
+autom4te.cache/
+scp
+sftp
+sftp-server
+ssh
+ssh-add
+ssh-agent
+ssh-keygen
+ssh-keyscan
+ssh-keysign
+ssh-pkcs11-helper
+sshd
+!regress/misc/fuzz-harness/Makefile
diff --git a/.skipped-commit-ids b/.skipped-commit-ids
index ee8241f..b94cadf 100644
--- a/.skipped-commit-ids
+++ b/.skipped-commit-ids
@@ -1,3 +1,12 @@
+5317f294d63a876bfc861e19773b1575f96f027d	remove libssh from makefiles
+a337e886a49f96701ccbc4832bed086a68abfa85	Makefile changes
+f2c9feb26963615c4fece921906cf72e248b61ee	more Makefile
+fa728823ba21c4b45212750e1d3a4b2086fd1a62	more Makefile refactoring
+1de0e85522051eb2ffa00437e1885e9d7b3e0c2e	moduli update
+814b2f670df75759e1581ecef530980b2b3d7e0f	remove redundant make defs
+
+Old upstream tree:
+
 321065a95a7ccebdd5fd08482a1e19afbf524e35	Update DH groups
 d4f699a421504df35254cf1c6f1a7c304fb907ca	Remove 1k bit groups
 aafe246655b53b52bc32c8a24002bc262f4230f7	Remove intermediate moduli
@@ -11,3 +20,13 @@
 96c5054e3e1f170c6276902d5bc65bb3b87a2603	remove DEBUGLIBS from Makefile
 6da9a37f74aef9f9cc639004345ad893cad582d8	Update moduli file
 77bcb50e47b68c7209c7f0a5a020d73761e5143b	unset REGRESS_FAIL_EARLY
+38c2133817cbcae75c88c63599ac54228f0fa384	Change COMPILER_VERSION tests
+30c20180c87cbc99fa1020489fe7fd8245b6420c	resync integrity.sh shell
+1e6b51ddf767cbad0a4e63eb08026c127e654308	integrity.sh reliability
+fe5b31f69a60d47171836911f144acff77810217	Makefile.inc bits
+5781670c0578fe89663c9085ed3ba477cf7e7913	Delete sshconnect1.c
+ea80f445e819719ccdcb237022cacfac990fdc5c	Makefile.inc warning flags
+b92c93266d8234d493857bb822260dacf4366157	moduli-gen.sh tweak
+b25bf747544265b39af74fe0716dc8d9f5b63b95	Updated moduli
+1bd41cba06a7752de4df304305a8153ebfb6b0ac	rsa.[ch] already removed
+e39b3902fe1d6c4a7ba6a3c58e072219f3c1e604	Makefile changes
diff --git a/BUILD.gn b/BUILD.gn
index 04a4ada..b4be64a 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -57,6 +57,7 @@
   cflags = [
     "-include",
     rebase_path("fuchsia/fuchsia-compat.h"),
+    "-Wno-pointer-sign",
   ]
 
   configs = [
@@ -136,23 +137,15 @@
     "authfd.h",
     "authfile.c",
     "authfile.h",
-    "blocks.c",
-    "bufaux.c",
-    "bufbn.c",
-    "bufec.c",
-    "buffer.c",
-    "buffer.h",
     "canohost.c",
     "canohost.h",
     "chacha.c",
     "chacha.h",
     "channels.c",
     "channels.h",
-    "cipher-3des1.c",
     "cipher-aes.c",
     "cipher-aesctr.c",
     "cipher-aesctr.h",
-    "cipher-bf1.c",
     "cipher-chachapoly.c",
     "cipher-chachapoly.h",
     "cipher-ctr.c",
@@ -163,8 +156,6 @@
     "compat.h",
     "crc32.c",
     "crc32.h",
-    "deattack.c",
-    "deattack.h",
     "dh.c",
     "dh.h",
     "digest-libc.c",
@@ -201,7 +192,6 @@
     "kexgex.c",
     "kexgexc.c",
     "kexgexs.c",
-    "key.c",
     "key.h",
     "log.c",
     "log.h",
@@ -209,7 +199,6 @@
     "mac.h",
     "match.c",
     "match.h",
-    "md-sha256.c",
     "misc.c",
     "misc.h",
     "moduli.c",
@@ -222,6 +211,7 @@
     "opacket.h",
     "packet.c",
     "packet.h",
+    "platform-misc.c",
     "platform-pledge.c",
     "platform-tracing.c",
     "poly1305.c",
@@ -231,8 +221,6 @@
     "readpass.c",
     "rijndael.c",
     "rijndael.h",
-    "rsa.c",
-    "rsa.h",
     "sc25519.c",
     "sc25519.h",
     "smult_curve25519_ref.c",
@@ -282,8 +270,6 @@
     "openbsd-compat/blowfish.c",
     "openbsd-compat/bsd-asprintf.c",
     "openbsd-compat/bsd-closefrom.c",
-    "openbsd-compat/bsd-cray.c",
-    "openbsd-compat/bsd-cray.h",
     "openbsd-compat/bsd-cygwin_util.c",
     "openbsd-compat/bsd-cygwin_util.h",
     "openbsd-compat/bsd-err.c",
@@ -308,6 +294,7 @@
     "openbsd-compat/fake-rfc2553.c",
     "openbsd-compat/fake-rfc2553.h",
     "openbsd-compat/fmt_scaled.c",
+    "openbsd-compat/freezero.c",
     "openbsd-compat/getcwd.c",
     "openbsd-compat/getgrouplist.c",
     "openbsd-compat/getopt_long.c",
@@ -330,6 +317,7 @@
     "openbsd-compat/readpassphrase.h",
     "openbsd-compat/reallocarray.c",
     "openbsd-compat/realpath.c",
+    "openbsd-compat/recallocarray.c",
     "openbsd-compat/rmd160.c",
     "openbsd-compat/rmd160.h",
     "openbsd-compat/rresvport.c",
@@ -372,7 +360,6 @@
     "readconf.c",
     "ssh.c",
     "sshconnect.c",
-    "sshconnect1.c",
     "sshconnect2.c",
     "sshtty.c",
   ]
@@ -477,7 +464,6 @@
 
 executable("scp") {
   sources = [
-    "bufaux.c",
     "progressmeter.c",
     "scp.c",
   ]
diff --git a/INSTALL b/INSTALL
index 92106bf..3fd265d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -13,7 +13,7 @@
 Zlib 1.1.4 or 1.2.1.2 or greater (earlier 1.2.x versions have problems):
 http://www.gzip.org/zlib/
 
-libcrypto (LibreSSL or OpenSSL >= 0.9.8f < 1.1.0)
+libcrypto (LibreSSL or OpenSSL >= 1.0.1 < 1.1.0)
 LibreSSL http://www.libressl.org/ ; or
 OpenSSL http://www.openssl.org/
 
@@ -66,13 +66,6 @@
 
 http://www.jmknoble.net/software/x11-ssh-askpass/
 
-S/Key Libraries:
-
-If you wish to use --with-skey then you will need the library below
-installed.  No other S/Key library is currently known to be supported.
-
-http://www.sparc.spb.su/solaris/skey/
-
 LibEdit:
 
 sftp supports command-line editing via NetBSD's libedit.  If your platform
@@ -91,7 +84,7 @@
 Autoconf:
 
 If you modify configure.ac or configure doesn't exist (eg if you checked
-the code out of CVS yourself) then you will need autoconf-2.69 to rebuild
+the code out of git yourself) then you will need autoconf-2.69 to rebuild
 the automatically generated files by running "autoreconf".  Earlier
 versions may also work but this is not guaranteed.
 
@@ -99,10 +92,17 @@
 
 Basic Security Module (BSM):
 
-Native BSM support is know to exist in Solaris from at least 2.5.1,
+Native BSM support is known to exist in Solaris from at least 2.5.1,
 FreeBSD 6.1 and OS X.  Alternatively, you may use the OpenBSM
 implementation (http://www.openbsm.org).
 
+makedepend:
+
+https://www.x.org/archive/individual/util/
+
+If you are making significant changes to the code you may need to rebuild
+the dependency (.depend) file using "make depend", which requires the
+"makedepend" tool from the X11 distribution.
 
 2. Building / Installation
 --------------------------
@@ -162,13 +162,11 @@
 
 --with-prngd-socket=/some/file allows you to enable EGD or PRNGD
 support and to specify a PRNGd socket. Use this if your Unix lacks
-/dev/random and you don't want to use OpenSSH's builtin entropy
-collection support.
+/dev/random.
 
 --with-prngd-port=portnum allows you to enable EGD or PRNGD support
 and to specify a EGD localhost TCP port. Use this if your Unix lacks
-/dev/random and you don't want to use OpenSSH's builtin entropy
-collection support.
+/dev/random.
 
 --with-lastlog=FILE will specify the location of the lastlog file.
 ./configure searches a few locations for lastlog, but may not find
@@ -179,9 +177,6 @@
 --with-osfsia, --without-osfsia will enable or disable OSF1's Security
 Integration Architecture.  The default for OSF1 machines is enable.
 
---with-skey=PATH will enable S/Key one time password support. You will
-need the S/Key libraries and header files installed for this to work.
-
 --with-md5-passwords will enable the use of MD5 passwords. Enable this
 if your operating system uses MD5 passwords and the system crypt() does
 not support them directly (see the crypt(3/3c) man page). If enabled, the
@@ -204,8 +199,7 @@
 --with-xauth=PATH specifies the location of the xauth binary
 
 --with-ssl-dir=DIR allows you to specify where your Libre/OpenSSL
-libraries
-are installed.
+libraries are installed.
 
 --with-ssl-engine enables Libre/OpenSSL's (hardware) ENGINE support
 
@@ -216,7 +210,7 @@
 can specify these as environment variables before running ./configure.
 For example:
 
-CFLAGS="-O -m486" LDFLAGS="-s" LIBS="-lrubbish" LD="/usr/foo/ld" ./configure
+CC="/usr/foo/cc" CFLAGS="-O" LDFLAGS="-s" LIBS="-lrubbish" ./configure
 
 3. Configuration
 ----------------
diff --git a/LICENCE b/LICENCE
index f523871..1524821 100644
--- a/LICENCE
+++ b/LICENCE
@@ -75,27 +75,6 @@
     PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
     POSSIBILITY OF SUCH DAMAGES.
 
-2)
-    The 32-bit CRC compensation attack detector in deattack.c was
-    contributed by CORE SDI S.A. under a BSD-style license.
-
-     * Cryptographic attack detector for ssh - source code
-     *
-     * Copyright (c) 1998 CORE SDI S.A., Buenos Aires, Argentina.
-     *
-     * All rights reserved. Redistribution and use in source and binary
-     * forms, with or without modification, are permitted provided that
-     * this copyright notice is retained.
-     *
-     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
-     * WARRANTIES ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE
-     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR
-     * CONSEQUENTIAL DAMAGES RESULTING FROM THE USE OR MISUSE OF THIS
-     * SOFTWARE.
-     *
-     * Ariel Futoransky <futo@core-sdi.com>
-     * <http://www.core-sdi.com>
-
 3)
     ssh-keyscan was contributed by David Mazieres under a BSD-style
     license.
@@ -337,4 +316,4 @@
 
 
 ------
-$OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
+$OpenBSD: LICENCE,v 1.20 2017/04/30 23:26:16 djm Exp $
diff --git a/Makefile.in b/Makefile.in
index e10f374..2385c62 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,6 +1,4 @@
-# $Id: Makefile.in,v 1.365 2014/08/30 06:23:07 djm Exp $
-
-# uncomment if you run a non bourne compatable shell. Ie. csh
+# uncomment if you run a non bourne compatible shell. Ie. csh
 #SHELL = @SH@
 
 AUTORECONF=autoreconf
@@ -54,16 +52,25 @@
 AWK=@AWK@
 RANLIB=@RANLIB@
 INSTALL=@INSTALL@
-PERL=@PERL@
 SED=@SED@
 ENT=@ENT@
 XAUTH_PATH=@XAUTH_PATH@
 LDFLAGS=-L. -Lopenbsd-compat/ @LDFLAGS@
 EXEEXT=@EXEEXT@
 MANFMT=@MANFMT@
+MKDIR_P=@MKDIR_P@
 
 TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT)
 
+XMSS_OBJS=\
+	ssh-xmss.o \
+	sshkey-xmss.o \
+	xmss_commons.o \
+	xmss_fast.o \
+	xmss_hash.o \
+	xmss_hash_address.o \
+	xmss_wots.o
+
 LIBOPENSSH_OBJS=\
 	ssh_api.o \
 	ssherr.o \
@@ -73,36 +80,37 @@
 	sshbuf-misc.o \
 	sshbuf-getput-crypto.o \
 	krl.o \
-	bitmap.o
+	bitmap.o \
+	${XMSS_OBJS}
 
 LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
-	authfd.o authfile.o bufaux.o bufbn.o bufec.o buffer.o \
+	authfd.o authfile.o \
 	canohost.o channels.o cipher.o cipher-aes.o cipher-aesctr.o \
-	cipher-bf1.o cipher-ctr.o cipher-3des1.o cleanup.o \
-	compat.o crc32.o deattack.o fatal.o hostfile.o \
-	log.o match.o md-sha256.o moduli.o nchan.o packet.o opacket.o \
-	readpass.o rsa.o ttymodes.o xmalloc.o addrmatch.o \
-	atomicio.o key.o dispatch.o mac.o uidswap.o uuencode.o misc.o utf8.o \
+	cipher-ctr.o cleanup.o \
+	compat.o crc32.o fatal.o hostfile.o \
+	log.o match.o moduli.o nchan.o packet.o opacket.o \
+	readpass.o ttymodes.o xmalloc.o addrmatch.o \
+	atomicio.o dispatch.o mac.o uuencode.o misc.o utf8.o \
 	monitor_fdpass.o rijndael.o ssh-dss.o ssh-ecdsa.o ssh-rsa.o dh.o \
 	msg.o progressmeter.o dns.o entropy.o gss-genr.o umac.o umac128.o \
 	ssh-pkcs11.o smult_curve25519_ref.o \
 	poly1305.o chacha.o cipher-chachapoly.o \
 	ssh-ed25519.o digest-openssl.o digest-libc.o hmac.o \
-	sc25519.o ge25519.o fe25519.o ed25519.o verify.o hash.o blocks.o \
+	sc25519.o ge25519.o fe25519.o ed25519.o verify.o hash.o \
 	kex.o kexdh.o kexgex.o kexecdh.o kexc25519.o \
 	kexdhc.o kexgexc.o kexecdhc.o kexc25519c.o \
 	kexdhs.o kexgexs.o kexecdhs.o kexc25519s.o \
-	platform-pledge.o platform-tracing.o
+	platform-pledge.o platform-tracing.o platform-misc.o
 
 SSHOBJS= ssh.o readconf.o clientloop.o sshtty.o \
-	sshconnect.o sshconnect1.o sshconnect2.o mux.o
+	sshconnect.o sshconnect2.o mux.o
 
 SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o \
 	audit.o audit-bsm.o audit-linux.o platform.o \
 	sshpty.o sshlogin.o servconf.o serverloop.o \
 	auth.o auth2.o auth-options.o session.o \
 	auth2-chall.o groupaccess.o \
-	auth-skey.o auth-bsdauth.o auth2-hostbased.o auth2-kbdint.o \
+	auth-bsdauth.o auth2-hostbased.o auth2-kbdint.o \
 	auth2-none.o auth2-passwd.o auth2-pubkey.o \
 	monitor.o monitor_wrap.o auth-krb5.o \
 	auth2-gss.o gss-serv.o gss-serv-krb5.o \
@@ -110,7 +118,7 @@
 	sftp-server.o sftp-common.o \
 	sandbox-null.o sandbox-rlimit.o sandbox-systrace.o sandbox-darwin.o \
 	sandbox-seccomp-filter.o sandbox-capsicum.o sandbox-pledge.o \
-	sandbox-solaris.o
+	sandbox-solaris.o uidswap.o
 
 MANPAGES	= moduli.5.out scp.1.out ssh-add.1.out ssh-agent.1.out ssh-keygen.1.out ssh-keyscan.1.out ssh.1.out sshd.8.out sftp-server.8.out sftp.1.out ssh-keysign.8.out ssh-pkcs11-helper.8.out sshd_config.5.out ssh_config.5.out
 MANPAGES_IN	= moduli.5 scp.1 ssh-add.1 ssh-agent.1 ssh-keygen.1 ssh-keyscan.1 ssh.1 sshd.8 sftp-server.8 sftp.1 ssh-keysign.8 ssh-pkcs11-helper.8 sshd_config.5 ssh_config.5
@@ -167,7 +175,7 @@
 	$(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS)
 
 scp$(EXEEXT): $(LIBCOMPAT) libssh.a scp.o progressmeter.o
-	$(LD) -o $@ scp.o progressmeter.o bufaux.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
+	$(LD) -o $@ scp.o progressmeter.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
 
 ssh-add$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-add.o
 	$(LD) -o $@ ssh-add.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
@@ -178,8 +186,8 @@
 ssh-keygen$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keygen.o
 	$(LD) -o $@ ssh-keygen.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
 
-ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keysign.o readconf.o
-	$(LD) -o $@ ssh-keysign.o readconf.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
+ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keysign.o readconf.o uidswap.o
+	$(LD) -o $@ ssh-keysign.o readconf.o uidswap.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
 
 ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-pkcs11-helper.o ssh-pkcs11.o
 	$(LD) -o $@ ssh-pkcs11-helper.o ssh-pkcs11.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
@@ -218,16 +226,41 @@
 moduli:
 	echo
 
-# special case target for umac128
-umac128.o:	umac.c
-	$(CC) $(CFLAGS) $(CPPFLAGS) -o umac128.o -c $(srcdir)/umac.c \
-	    -DUMAC_OUTPUT_LEN=16 -Dumac_new=umac128_new \
-	    -Dumac_update=umac128_update -Dumac_final=umac128_final \
-	    -Dumac_delete=umac128_delete -Dumac_ctx=umac128_ctx
-
 clean:	regressclean
 	rm -f *.o *.a $(TARGETS) logintest config.cache config.log
 	rm -f *.out core survey
+	rm -f regress/check-perm$(EXEEXT)
+	rm -f regress/mkdtemp$(EXEEXT)
+	rm -f regress/unittests/test_helper/*.a
+	rm -f regress/unittests/test_helper/*.o
+	rm -f regress/unittests/sshbuf/*.o
+	rm -f regress/unittests/sshbuf/test_sshbuf$(EXEEXT)
+	rm -f regress/unittests/sshkey/*.o
+	rm -f regress/unittests/sshkey/test_sshkey$(EXEEXT)
+	rm -f regress/unittests/bitmap/*.o
+	rm -f regress/unittests/bitmap/test_bitmap$(EXEEXT)
+	rm -f regress/unittests/conversion/*.o
+	rm -f regress/unittests/conversion/test_conversion$(EXEEXT)
+	rm -f regress/unittests/hostkeys/*.o
+	rm -f regress/unittests/hostkeys/test_hostkeys$(EXEEXT)
+	rm -f regress/unittests/kex/*.o
+	rm -f regress/unittests/kex/test_kex$(EXEEXT)
+	rm -f regress/unittests/match/*.o
+	rm -f regress/unittests/match/test_match$(EXEEXT)
+	rm -f regress/unittests/utf8/*.o
+	rm -f regress/unittests/utf8/test_utf8$(EXEEXT)
+	rm -f regress/misc/kexfuzz/*.o
+	rm -f regress/misc/kexfuzz/kexfuzz$(EXEEXT)
+	(cd openbsd-compat && $(MAKE) clean)
+
+distclean:	regressclean
+	rm -f *.o *.a $(TARGETS) logintest config.cache config.log
+	rm -f *.out core opensshd.init openssh.xml
+	rm -f Makefile buildpkg.sh config.h config.status
+	rm -f survey.sh openbsd-compat/regress/Makefile *~ 
+	rm -rf autom4te.cache
+	rm -f regress/check-perm
+	rm -f regress/mkdtemp
 	rm -f regress/unittests/test_helper/*.a
 	rm -f regress/unittests/test_helper/*.o
 	rm -f regress/unittests/sshbuf/*.o
@@ -236,6 +269,8 @@
 	rm -f regress/unittests/sshkey/test_sshkey
 	rm -f regress/unittests/bitmap/*.o
 	rm -f regress/unittests/bitmap/test_bitmap
+	rm -f regress/unittests/conversion/*.o
+	rm -f regress/unittests/conversion/test_conversion
 	rm -f regress/unittests/hostkeys/*.o
 	rm -f regress/unittests/hostkeys/test_hostkeys
 	rm -f regress/unittests/kex/*.o
@@ -245,32 +280,7 @@
 	rm -f regress/unittests/utf8/*.o
 	rm -f regress/unittests/utf8/test_utf8
 	rm -f regress/misc/kexfuzz/*.o
-	rm -f regress/misc/kexfuzz/kexfuzz
-	(cd openbsd-compat && $(MAKE) clean)
-
-distclean:	regressclean
-	rm -f *.o *.a $(TARGETS) logintest config.cache config.log
-	rm -f *.out core opensshd.init openssh.xml
-	rm -f Makefile buildpkg.sh config.h config.status
-	rm -f survey.sh openbsd-compat/regress/Makefile *~ 
-	rm -rf autom4te.cache
-	rm -f regress/unittests/test_helper/*.a
-	rm -f regress/unittests/test_helper/*.o
-	rm -f regress/unittests/sshbuf/*.o
-	rm -f regress/unittests/sshbuf/test_sshbuf
-	rm -f regress/unittests/sshkey/*.o
-	rm -f regress/unittests/sshkey/test_sshkey
-	rm -f regress/unittests/bitmap/*.o
-	rm -f regress/unittests/bitmap/test_bitmap
-	rm -f regress/unittests/hostkeys/*.o
-	rm -f regress/unittests/hostkeys/test_hostkeys
-	rm -f regress/unittests/kex/*.o
-	rm -f regress/unittests/kex/test_kex
-	rm -f regress/unittests/match/*.o
-	rm -f regress/unittests/match/test_match
-	rm -f regress/unittests/utf8/*.o
-	rm -f regress/unittests/utf8/test_utf8
-	rm -f regress/unittests/misc/kexfuzz
+	rm -f regress/misc/kexfuzz
 	(cd openbsd-compat && $(MAKE) distclean)
 	if test -d pkg ; then \
 		rm -fr pkg ; \
@@ -293,9 +303,21 @@
 			>$$base.0 ; \
 	done
 
-distprep: catman-do
+depend: depend-rebuild
+	rm -f .depend.bak
+
+depend-rebuild:
+	rm -f config.h
+	touch config.h
+	makedepend -w1000 -Y. -f .depend *.c 2>/dev/null
+	rm -f config.h
+
+depend-check: depend-rebuild
+	cmp .depend .depend.bak || (echo .depend stale && exit 1)
+
+distprep: catman-do depend-check
 	$(AUTORECONF)
-	-rm -rf autom4te.cache
+	-rm -rf autom4te.cache .depend.bak
 
 install: $(CONFIGFILES) $(MANPAGES) $(TARGETS) install-files install-sysconf host-key check-config
 install-nokeys: $(CONFIGFILES) $(MANPAGES) $(TARGETS) install-files install-sysconf
@@ -305,14 +327,13 @@
 	-$(DESTDIR)$(sbindir)/sshd -t -f $(DESTDIR)$(sysconfdir)/sshd_config
 
 install-files:
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(bindir)
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(sbindir)
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(mandir)
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(mandir)/$(mansubdir)1
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(mandir)/$(mansubdir)5
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(mandir)/$(mansubdir)8
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(libexecdir)
-	(umask 022 ; $(srcdir)/mkinstalldirs $(DESTDIR)$(PRIVSEP_PATH))
+	$(MKDIR_P) $(DESTDIR)$(bindir)
+	$(MKDIR_P) $(DESTDIR)$(sbindir)
+	$(MKDIR_P) $(DESTDIR)$(mandir)/$(mansubdir)1
+	$(MKDIR_P) $(DESTDIR)$(mandir)/$(mansubdir)5
+	$(MKDIR_P) $(DESTDIR)$(mandir)/$(mansubdir)8
+	$(MKDIR_P) $(DESTDIR)$(libexecdir)
+	$(MKDIR_P) -m 0755 $(DESTDIR)$(PRIVSEP_PATH)
 	$(INSTALL) -m 0755 $(STRIP_OPT) ssh$(EXEEXT) $(DESTDIR)$(bindir)/ssh$(EXEEXT)
 	$(INSTALL) -m 0755 $(STRIP_OPT) scp$(EXEEXT) $(DESTDIR)$(bindir)/scp$(EXEEXT)
 	$(INSTALL) -m 0755 $(STRIP_OPT) ssh-add$(EXEEXT) $(DESTDIR)$(bindir)/ssh-add$(EXEEXT)
@@ -340,9 +361,7 @@
 	$(INSTALL) -m 644 ssh-pkcs11-helper.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-pkcs11-helper.8
 
 install-sysconf:
-	if [ ! -d $(DESTDIR)$(sysconfdir) ]; then \
-		$(srcdir)/mkinstalldirs $(DESTDIR)$(sysconfdir); \
-	fi
+	$(MKDIR_P) $(DESTDIR)$(sysconfdir)
 	@if [ ! -f $(DESTDIR)$(sysconfdir)/ssh_config ]; then \
 		$(INSTALL) -m 644 ssh_config.out $(DESTDIR)$(sysconfdir)/ssh_config; \
 	else \
@@ -370,9 +389,6 @@
 	fi
 
 host-key-force: ssh-keygen$(EXEEXT) ssh$(EXEEXT)
-	if ./ssh -Q protocol-version | grep '^1$$' >/dev/null; then \
-		./ssh-keygen -t rsa1 -f $(DESTDIR)$(sysconfdir)/ssh_host_key -N ""; \
-	fi
 	./ssh-keygen -t dsa -f $(DESTDIR)$(sysconfdir)/ssh_host_dsa_key -N ""
 	./ssh-keygen -t rsa -f $(DESTDIR)$(sysconfdir)/ssh_host_rsa_key -N ""
 	./ssh-keygen -t ed25519 -f $(DESTDIR)$(sysconfdir)/ssh_host_ed25519_key -N ""
@@ -416,26 +432,16 @@
 	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-pkcs11-helper.8
 
 regress-prep:
-	[ -d `pwd`/regress ] || mkdir -p `pwd`/regress
-	[ -d `pwd`/regress/unittests ] || mkdir -p `pwd`/regress/unittests
-	[ -d `pwd`/regress/unittests/test_helper ] || \
-		mkdir -p `pwd`/regress/unittests/test_helper
-	[ -d `pwd`/regress/unittests/sshbuf ] || \
-		mkdir -p `pwd`/regress/unittests/sshbuf
-	[ -d `pwd`/regress/unittests/sshkey ] || \
-		mkdir -p `pwd`/regress/unittests/sshkey
-	[ -d `pwd`/regress/unittests/bitmap ] || \
-		mkdir -p `pwd`/regress/unittests/bitmap
-	[ -d `pwd`/regress/unittests/hostkeys ] || \
-		mkdir -p `pwd`/regress/unittests/hostkeys
-	[ -d `pwd`/regress/unittests/kex ] || \
-		mkdir -p `pwd`/regress/unittests/kex
-	[ -d `pwd`/regress/unittests/match ] || \
-		mkdir -p `pwd`/regress/unittests/match
-	[ -d `pwd`/regress/unittests/utf8 ] || \
-		mkdir -p `pwd`/regress/unittests/utf8
-	[ -d `pwd`/regress/misc/kexfuzz ] || \
-		mkdir -p `pwd`/regress/misc/kexfuzz
+	$(MKDIR_P) `pwd`/regress/unittests/test_helper
+	$(MKDIR_P) `pwd`/regress/unittests/sshbuf
+	$(MKDIR_P) `pwd`/regress/unittests/sshkey
+	$(MKDIR_P) `pwd`/regress/unittests/bitmap
+	$(MKDIR_P) `pwd`/regress/unittests/conversion
+	$(MKDIR_P) `pwd`/regress/unittests/hostkeys
+	$(MKDIR_P) `pwd`/regress/unittests/kex
+	$(MKDIR_P) `pwd`/regress/unittests/match
+	$(MKDIR_P) `pwd`/regress/unittests/utf8
+	$(MKDIR_P) `pwd`/regress/misc/kexfuzz
 	[ -f `pwd`/regress/Makefile ] || \
 	    ln -s `cd $(srcdir) && pwd`/regress/Makefile `pwd`/regress/Makefile
 
@@ -457,6 +463,10 @@
 	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/regress/check-perm.c \
 	$(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
 
+regress/mkdtemp$(EXEEXT): $(srcdir)/regress/mkdtemp.c $(REGRESSLIBS)
+	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/regress/mkdtemp.c \
+	$(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
+
 UNITTESTS_TEST_HELPER_OBJS=\
 	regress/unittests/test_helper/test_helper.o \
 	regress/unittests/test_helper/fuzz.o
@@ -503,6 +513,16 @@
 	    regress/unittests/test_helper/libtest_helper.a \
 	    -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
 
+UNITTESTS_TEST_CONVERSION_OBJS=\
+	regress/unittests/conversion/tests.o
+
+regress/unittests/conversion/test_conversion$(EXEEXT): \
+    ${UNITTESTS_TEST_CONVERSION_OBJS} \
+    regress/unittests/test_helper/libtest_helper.a libssh.a
+	$(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_CONVERSION_OBJS) \
+	    regress/unittests/test_helper/libtest_helper.a \
+	    -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
+
 UNITTESTS_TEST_KEX_OBJS=\
 	regress/unittests/kex/tests.o \
 	regress/unittests/kex/test_kex.o
@@ -555,16 +575,18 @@
 	regress/setuid-allowed$(EXEEXT) \
 	regress/netcat$(EXEEXT) \
 	regress/check-perm$(EXEEXT) \
+	regress/mkdtemp$(EXEEXT) \
 	regress/unittests/sshbuf/test_sshbuf$(EXEEXT) \
 	regress/unittests/sshkey/test_sshkey$(EXEEXT) \
 	regress/unittests/bitmap/test_bitmap$(EXEEXT) \
+	regress/unittests/conversion/test_conversion$(EXEEXT) \
 	regress/unittests/hostkeys/test_hostkeys$(EXEEXT) \
 	regress/unittests/kex/test_kex$(EXEEXT) \
 	regress/unittests/match/test_match$(EXEEXT) \
 	regress/unittests/utf8/test_utf8$(EXEEXT) \
 	regress/misc/kexfuzz/kexfuzz$(EXEEXT)
 
-tests interop-tests t-exec: regress-prep regress-binaries $(TARGETS)
+tests interop-tests t-exec unit: regress-prep regress-binaries $(TARGETS)
 	BUILDDIR=`pwd`; \
 	TEST_SSH_SCP="$${BUILDDIR}/scp"; \
 	TEST_SSH_SSH="$${BUILDDIR}/ssh"; \
@@ -632,3 +654,5 @@
 	if [ "@MAKE_PACKAGE_SUPPORTED@" = yes ]; then \
 		sh buildpkg.sh; \
 	fi
+
+# @DEPEND@
diff --git a/OVERVIEW b/OVERVIEW
index fde72c8..515567f 100644
--- a/OVERVIEW
+++ b/OVERVIEW
@@ -23,9 +23,8 @@
 
     - These provide an arbitrary size buffer, where data can be appended.
       Data can be consumed from either end.  The code is used heavily
-      throughout ssh.  The basic buffer manipulation functions are in
-      buffer.c (header buffer.h), and additional code to manipulate specific
-      data types is in bufaux.c.
+      throughout ssh.  The buffer manipulation functions are in
+      sshbuf*.c (header sshbuf.h).
 
   Compression Library
 
@@ -62,7 +61,7 @@
       code in packet.c does not concern itself with packet types or their
       execution; it contains code to build packets, to receive them and
       extract data from them, and the code to compress and/or encrypt
-      packets.  CRC code comes from crc32.c.
+      packets.
 
     - The code in packet.c calls the buffer manipulation routines
       (buffer.c, bufaux.c), compression routines (zlib), and the
@@ -106,12 +105,6 @@
       calls client_loop in clientloop.c.  This does the real work for
       the session.
 
-    - The client is suid root.  It tries to temporarily give up this
-      rights while reading the configuration data.  The root
-      privileges are only used to make the connection (from a
-      privileged socket).  Any extra privileges are dropped before
-      calling ssh_login.
-
   Pseudo-tty manipulation and tty modes
 
     - Code to allocate and use a pseudo tty is in pty.c.  Code to
@@ -165,4 +158,4 @@
 	uidswap.c    uid-swapping
 	xmalloc.c    "safe" malloc routines
 
-$OpenBSD: OVERVIEW,v 1.12 2015/07/08 19:01:15 markus Exp $
+$OpenBSD: OVERVIEW,v 1.14 2018/07/27 03:55:22 dtucker Exp $
diff --git a/PROTOCOL b/PROTOCOL
index 192da55..010bec9 100644
--- a/PROTOCOL
+++ b/PROTOCOL
@@ -33,8 +33,8 @@
 
 https://www.openssh.com/txt/draft-miller-secsh-compression-delayed-00.txt
 
-1.3. transport: New public key algorithms "ssh-rsa-cert-v00@openssh.com",
-     "ssh-dsa-cert-v00@openssh.com",
+1.3. transport: New public key algorithms "ssh-rsa-cert-v01@openssh.com",
+     "ssh-dsa-cert-v01@openssh.com",
      "ecdsa-sha2-nistp256-cert-v01@openssh.com",
      "ecdsa-sha2-nistp384-cert-v01@openssh.com" and
      "ecdsa-sha2-nistp521-cert-v01@openssh.com"
@@ -295,10 +295,14 @@
 	string[]	hostkeys
 
 Upon receiving this message, a client should check which of the
-supplied host keys are present in known_hosts. For keys that are
-not present, it should send a "hostkeys-prove@openssh.com" message
-to request the server prove ownership of the private half of the
-key.
+supplied host keys are present in known_hosts.
+
+Note that the server may send key types that the client does not
+support. The client should disgregard such keys if they are received.
+
+If the client identifies any keys that are not present for the host,
+it should send a "hostkeys-prove@openssh.com" message to request the
+server prove ownership of the private half of the key.
 
 	byte		SSH_MSG_GLOBAL_REQUEST
 	string		"hostkeys-prove-00@openssh.com"
@@ -424,7 +428,7 @@
 Both the "statvfs@openssh.com" and "fstatvfs@openssh.com" extensions are
 advertised in the SSH_FXP_VERSION hello with version "2".
 
-10. sftp: Extension request "hardlink@openssh.com"
+3.5. sftp: Extension request "hardlink@openssh.com"
 
 This request is for creating a hard link to a regular file. This
 request is implemented as a SSH_FXP_EXTENDED request with the
@@ -440,7 +444,7 @@
 This extension is advertised in the SSH_FXP_VERSION hello with version
 "1".
 
-10. sftp: Extension request "fsync@openssh.com"
+3.6. sftp: Extension request "fsync@openssh.com"
 
 This request asks the server to call fsync(2) on an open file handle.
 
@@ -454,4 +458,35 @@
 This extension is advertised in the SSH_FXP_VERSION hello with version
 "1".
 
-$OpenBSD: PROTOCOL,v 1.30 2016/04/08 06:35:54 djm Exp $
+4. Miscellaneous changes
+
+4.1 Public key format
+
+OpenSSH public keys, as generated by ssh-keygen(1) and appearing in
+authorized_keys files, are formatted as a single line of text consisting
+of the public key algorithm name followed by a base64-encoded key blob.
+The public key blob (before base64 encoding) is the same format used for
+the encoding of public keys sent on the wire: as described in RFC4253
+section 6.6 for RSA and DSA keys, RFC5656 section 3.1 for ECDSA keys
+and the "New public key formats" section of PROTOCOL.certkeys for the
+OpenSSH certificate formats.
+
+4.2 Private key format
+
+OpenSSH private keys, as generated by ssh-keygen(1) use the format
+described in PROTOCOL.key by default. As a legacy option, PEM format
+(RFC7468) private keys are also supported for RSA, DSA and ECDSA keys
+and were the default format before OpenSSH 7.8.
+
+4.3 KRL format
+
+OpenSSH supports a compact format for Key Revocation Lists (KRLs). This
+format is described in the PROTOCOL.krl file.
+
+4.4 Connection multiplexing
+
+OpenSSH's connection multiplexing uses messages as described in
+PROTOCOL.mux over a Unix domain socket for communications between a
+master instance and later clients.
+
+$OpenBSD: PROTOCOL,v 1.35 2018/08/10 00:44:01 djm Exp $
diff --git a/PROTOCOL.agent b/PROTOCOL.agent
index 60d36f9..da33819 100644
--- a/PROTOCOL.agent
+++ b/PROTOCOL.agent
@@ -1,582 +1,5 @@
-This describes the protocol used by OpenSSH's ssh-agent.
+This file used to contain a description of the SSH agent protocol
+implemented by OpenSSH. It has since been superseded by an Internet-
+draft that is available from:
 
-OpenSSH's agent supports managing keys for the standard SSH protocol
-2 as well as the legacy SSH protocol 1. Support for these key types
-is almost completely disjoint - in all but a few cases, operations on
-protocol 2 keys cannot see or affect protocol 1 keys and vice-versa.
-
-Protocol 1 and protocol 2 keys are separated because of the differing
-cryptographic usage: protocol 1 private RSA keys are used to decrypt
-challenges that were encrypted with the corresponding public key,
-whereas protocol 2 RSA private keys are used to sign challenges with
-a private key for verification with the corresponding public key. It
-is considered unsound practice to use the same key for signing and
-encryption.
-
-With a couple of exceptions, the protocol message names used in this
-document indicate which type of key the message relates to. SSH_*
-messages refer to protocol 1 keys only. SSH2_* messages refer to
-protocol 2 keys. Furthermore, the names also indicate whether the
-message is a request to the agent (*_AGENTC_*) or a reply from the
-agent (*_AGENT_*). Section 3 below contains the mapping of the
-protocol message names to their integer values.
-
-1. Data types
-
-Because of support for legacy SSH protocol 1 keys, OpenSSH's agent
-protocol makes use of some data types not defined in RFC 4251.
-
-1.1 uint16
-
-The "uint16" data type is a simple MSB-first 16 bit unsigned integer
-encoded in two bytes.
-
-1.2 mpint1
-
-The "mpint1" type represents an arbitrary precision integer (bignum).
-Its format is as follows:
-
-	uint16			bits
-	byte[(bits + 7) / 8]	bignum
-
-"bignum" contains an unsigned arbitrary precision integer encoded as
-eight bits per byte in big-endian (MSB first) format.
-
-Note the difference between the "mpint1" encoding and the "mpint"
-encoding defined in RFC 4251. Also note that the length of the encoded
-integer is specified in bits, not bytes and that the byte length of
-the integer must be calculated by rounding up the number of bits to the
-nearest eight.
-
-2. Protocol Messages
-
-All protocol messages are prefixed with their length in bytes, encoded
-as a 32 bit unsigned integer. Specifically:
-
-	uint32			message_length
-	byte[message_length]	message
-
-The following message descriptions refer only to the content the
-"message" field.
-
-2.1 Generic server responses
-
-The following generic messages may be sent by the server in response to
-requests from the client. On success the agent may reply either with:
-
-	byte			SSH_AGENT_SUCCESS
-
-or a request-specific success message.
-
-On failure, the agent may reply with:
-
-	byte			SSH_AGENT_FAILURE
-
-SSH_AGENT_FAILURE messages are also sent in reply to unknown request
-types.
-
-2.2 Adding keys to the agent
-
-Keys are added to the agent using the SSH_AGENTC_ADD_RSA_IDENTITY and
-SSH2_AGENTC_ADD_IDENTITY requests for protocol 1 and protocol 2 keys
-respectively.
-
-Two variants of these requests are SSH_AGENTC_ADD_RSA_ID_CONSTRAINED
-and SSH2_AGENTC_ADD_ID_CONSTRAINED - these add keys with optional
-"constraints" on their usage.
-
-OpenSSH may be built with support for keys hosted on a smartcard
-or other hardware security module. These keys may be added
-to the agent using the SSH_AGENTC_ADD_SMARTCARD_KEY and
-SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED requests.
-
-2.2.1 Key constraints
-
-The OpenSSH agent supports some basic optional constraints on key usage.
-At present there are two constraints defined.
-
-The first constraint limits the validity duration of a key. It is
-encoded as:
-
-	byte			SSH_AGENT_CONSTRAIN_LIFETIME
-	uint32			seconds
-
-Where "seconds" contains the number of seconds that the key shall remain
-valid measured from the moment that the agent receives it. After the
-validity period has expired, OpenSSH's agent will erase these keys from
-memory.
-
-The second constraint requires the agent to seek explicit user
-confirmation before performing private key operations with the loaded
-key. This constraint is encoded as:
-
-	byte			SSH_AGENT_CONSTRAIN_CONFIRM
-
-Zero or more constraints may be specified when adding a key with one
-of the *_CONSTRAINED requests. Multiple constraints are appended
-consecutively to the end of the request:
-
-	byte			constraint1_type
-	....			constraint1_data
-	byte			constraint2_type
-	....			constraint2_data
-	....
-	byte			constraintN_type
-	....			constraintN_data
-
-Such a sequence of zero or more constraints will be referred to below
-as "constraint[]". Agents may determine whether there are constraints
-by checking whether additional data exists in the "add key" request
-after the key data itself. OpenSSH will refuse to add a key if it
-contains unknown constraints.
-
-2.2.2 Add protocol 1 key
-
-A client may add a protocol 1 key to an agent with the following
-request:
-
-	byte			SSH_AGENTC_ADD_RSA_IDENTITY or
-				SSH_AGENTC_ADD_RSA_ID_CONSTRAINED
-	uint32			ignored
-	mpint1			rsa_n
-	mpint1			rsa_e
-	mpint1			rsa_d
-	mpint1			rsa_iqmp
-	mpint1			rsa_q
-	mpint1			rsa_p
-	string			key_comment
-	constraint[]		key_constraints
-
-Note that there is some redundancy in the key parameters; a key could be
-fully specified using just rsa_q, rsa_p and rsa_e at the cost of extra
-computation.
-
-"key_constraints" may only be present if the request type is
-SSH_AGENTC_ADD_RSA_ID_CONSTRAINED.
-
-The agent will reply with a SSH_AGENT_SUCCESS if the key has been
-successfully added or a SSH_AGENT_FAILURE if an error occurred.
-
-2.2.3 Add protocol 2 key
-
-The OpenSSH agent supports DSA, ECDSA and RSA keys for protocol 2. DSA
-keys may be added using the following request
-
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ssh-dss"
-	mpint			dsa_p
-	mpint			dsa_q
-	mpint			dsa_g
-	mpint			dsa_public_key
-	mpint			dsa_private_key
-	string			key_comment
-	constraint[]		key_constraints
-
-DSA certificates may be added with:
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ssh-dss-cert-v00@openssh.com"
-	string			certificate
-	mpint			dsa_private_key
-	string			key_comment
-	constraint[]		key_constraints
-
-ECDSA keys may be added using the following request
-
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ecdsa-sha2-nistp256" |
-				"ecdsa-sha2-nistp384" |
-				"ecdsa-sha2-nistp521"
-	string			ecdsa_curve_name
-	string			ecdsa_public_key
-	mpint			ecdsa_private
-	string			key_comment
-	constraint[]		key_constraints
-
-ECDSA certificates may be added with:
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ecdsa-sha2-nistp256-cert-v01@openssh.com" |
-				"ecdsa-sha2-nistp384-cert-v01@openssh.com" |
-				"ecdsa-sha2-nistp521-cert-v01@openssh.com"
-	string			certificate
-	mpint			ecdsa_private_key
-	string			key_comment
-	constraint[]		key_constraints
-
-ED25519 keys may be added using the following request
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ssh-ed25519"
-	string			ed25519_public_key
-	string			ed25519_private_key || ed25519_public_key
-	string			key_comment
-	constraint[]		key_constraints
-
-ED25519 certificates may be added with:
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ssh-ed25519-cert-v01@openssh.com"
-	string			certificate
-	string			ed25519_public_key
-	string			ed25519_private_key || ed25519_public_key
-	string			key_comment
-	constraint[]		key_constraints
-
-For both ssh-ed25519 and ssh-ed25519-cert-v01@openssh.com keys, the private
-key has the public key appended (for historical reasons).
-
-RSA keys may be added with this request:
-
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ssh-rsa"
-	mpint			rsa_n
-	mpint			rsa_e
-	mpint			rsa_d
-	mpint			rsa_iqmp
-	mpint			rsa_p
-	mpint			rsa_q
-	string			key_comment
-	constraint[]		key_constraints
-
-RSA certificates may be added with this request:
-
-	byte			SSH2_AGENTC_ADD_IDENTITY or
-				SSH2_AGENTC_ADD_ID_CONSTRAINED
-	string			"ssh-rsa-cert-v00@openssh.com"
-	string			certificate
-	mpint			rsa_d
-	mpint			rsa_iqmp
-	mpint			rsa_p
-	mpint			rsa_q
-	string			key_comment
-	constraint[]		key_constraints
-
-Note that the 'rsa_p' and 'rsa_q' parameters are sent in the reverse
-order to the protocol 1 add keys message. As with the corresponding
-protocol 1 "add key" request, the private key is overspecified to avoid
-redundant processing.
-
-For DSA, ECDSA and RSA key add requests, "key_constraints" may only be
-present if the request type is SSH2_AGENTC_ADD_ID_CONSTRAINED.
-
-The agent will reply with a SSH_AGENT_SUCCESS if the key has been
-successfully added or a SSH_AGENT_FAILURE if an error occurred.
-
-2.2.4 Loading keys from a smartcard
-
-The OpenSSH agent may have optional smartcard support built in to it. If
-so, it supports an operation to load keys from a smartcard. Technically,
-only the public components of the keys are loaded into the agent so
-this operation really arranges for future private key operations to be
-delegated to the smartcard.
-
-	byte			SSH_AGENTC_ADD_SMARTCARD_KEY or
-				SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED
-	string			reader_id
-	string			pin
-	constraint[]		key_constraints
-
-"reader_id" is an identifier to a smartcard reader and "pin"
-is a PIN or passphrase used to unlock the private key(s) on the
-device. "key_constraints" may only be present if the request type is
-SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED.
-
-This operation may load all SSH keys that are unlocked using the
-"pin" on the specified reader. The type of key loaded (protocol 1
-or protocol 2) will be specified by the smartcard itself, it is not
-client-specified.
-
-The agent will reply with a SSH_AGENT_SUCCESS if one or more keys have
-been successfully loaded or a SSH_AGENT_FAILURE if an error occurred.
-The agent will also return SSH_AGENT_FAILURE if it does not support
-smartcards.
-
-2.3 Removing multiple keys
-
-A client may request that an agent delete all protocol 1 keys using the
-following request:
-
-	byte			SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES
-
-This message requests the deletion of all protocol 2 keys:
-
-	byte			SSH2_AGENTC_REMOVE_ALL_IDENTITIES
-
-On success, the agent will delete all keys of the requested type and
-reply with a SSH_AGENT_SUCCESS message. If an error occurred, the agent
-will reply with SSH_AGENT_FAILURE.
-
-Note that, to delete all keys (both protocol 1 and 2), a client
-must send both a SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES and a
-SSH2_AGENTC_REMOVE_ALL_IDENTITIES request.
-
-2.4 Removing specific keys
-
-2.4.1 Removing a protocol 1 key
-
-Removal of a protocol 1 key may be requested with the following message:
-
-	byte 			SSH_AGENTC_REMOVE_RSA_IDENTITY
-	uint32			key_bits
-	mpint1			rsa_e
-	mpint1			rsa_n
-
-Note that key_bits is strictly redundant, as it may be inferred by the
-length of rsa_n.
-
-The agent will delete any private key matching the specified public key
-and return SSH_AGENT_SUCCESS. If no such key was found, the agent will
-return SSH_AGENT_FAILURE.
-
-2.4.2 Removing a protocol 2 key
-
-Protocol 2 keys may be removed with the following request:
-
-	byte			SSH2_AGENTC_REMOVE_IDENTITY
-	string			key_blob
-
-Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key
-Algorithms" for any of the supported protocol 2 key types.
-
-The agent will delete any private key matching the specified public key
-and return SSH_AGENT_SUCCESS. If no such key was found, the agent will
-return SSH_AGENT_FAILURE.
-
-2.4.3 Removing keys loaded from a smartcard
-
-A client may request that a server remove one or more smartcard-hosted
-keys using this message:
-
-	byte			SSH_AGENTC_REMOVE_SMARTCARD_KEY
-	string			reader_id
-	string			pin
-
-"reader_id" the an identifier to a smartcard reader and "pin" is a PIN
-or passphrase used to unlock the private key(s) on the device.
-
-When this message is received, and if the agent supports
-smartcard-hosted keys, it will delete all keys that are hosted on the
-specified smartcard that may be accessed with the given "pin".
-
-The agent will reply with a SSH_AGENT_SUCCESS if one or more keys have
-been successfully removed or a SSH_AGENT_FAILURE if an error occurred.
-The agent will also return SSH_AGENT_FAILURE if it does not support
-smartcards.
-
-2.5 Requesting a list of known keys
-
-An agent may be requested to list which keys it holds. Different
-requests exist for protocol 1 and protocol 2 keys.
-
-2.5.1 Requesting a list of protocol 1 keys
-
-To request a list of protocol 1 keys that are held in the agent, a
-client may send the following message:
-
-	byte			SSH_AGENTC_REQUEST_RSA_IDENTITIES
-
-The agent will reply with the following message:
-
-	byte			SSH_AGENT_RSA_IDENTITIES_ANSWER
-	uint32			num_keys
-
-Followed by zero or more consecutive keys, encoded as:
-
-	uint32			bits
-	mpint1			rsa_e
-	mpint1			rsa_n
-	string			key_comment
-
-2.5.2 Requesting a list of protocol 2 keys
-
-A client may send the following message to request a list of
-protocol 2 keys that are stored in the agent:
-
-	byte			SSH2_AGENTC_REQUEST_IDENTITIES
-
-The agent will reply with the following message header:
-
-	byte			SSH2_AGENT_IDENTITIES_ANSWER
-	uint32			num_keys
-
-Followed by zero or more consecutive keys, encoded as:
-
-	string			key_blob
-	string			key_comment
-
-Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key
-Algorithms" for any of the supported protocol 2 key types.
-
-2.6 Private key operations
-
-The purpose of the agent is to perform private key operations, such as
-signing and encryption without requiring a passphrase to unlock the
-key and without allowing the private key itself to be exposed. There
-are separate requests for the protocol 1 and protocol 2 private key
-operations.
-
-2.6.1 Protocol 1 private key challenge
-
-The private key operation used in version 1 of the SSH protocol is
-decrypting a challenge that has been encrypted with a public key.
-It may be requested using this message:
-
-	byte			SSH_AGENTC_RSA_CHALLENGE
-	uint32			ignored
-	mpint1			rsa_e
-	mpint1			rsa_n
-	mpint1			encrypted_challenge
-	byte[16]		session_id
-	uint32			response_type /* must be 1 */
-
-"rsa_e" and "rsa_n" are used to identify which private key to use.
-"encrypted_challenge" is a challenge blob that has (presumably)
-been encrypted with the public key and must be in the range
-1 <= encrypted_challenge < 2^256. "session_id" is the SSH protocol 1
-session ID (computed from the server host key, the server semi-ephemeral
-key and the session cookie).
-
-"ignored" and "response_type" exist for compatibility with legacy
-implementations. "response_type" must be equal to 1; other response
-types are not supported.
-
-On receiving this request, the server decrypts the "encrypted_challenge"
-using the private key matching the supplied (rsa_e, rsa_n) values. For
-the response derivation, the decrypted challenge is represented as an
-unsigned, big-endian integer encoded in a 32 byte buffer (i.e. values
-smaller than 2^248 will have leading 0 bytes).
-
-The response value is then calculated as:
-
-	response = MD5(decrypted_challenge || session_id)
-
-and returned in the following message
-
-	byte			SSH_AGENT_RSA_RESPONSE
-	byte[16]		response
-
-If the agent cannot find the key specified by the supplied (rsa_e,
-rsa_n) then it will return SSH_AGENT_FAILURE.
-
-2.6.2 Protocol 2 private key signature request
-
-A client may use the following message to request signing of data using
-a protocol 2 key:
-
-	byte			SSH2_AGENTC_SIGN_REQUEST
-	string			key_blob
-	string			data
-	uint32			flags
-
-Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key
-Algorithms" for any of the supported protocol 2 key types. "flags" is
-a bit-mask, but at present only one possible value is defined (see below
-for its meaning):
-
-	SSH_AGENT_OLD_SIGNATURE		1
-
-Upon receiving this request, the agent will look up the private key that
-corresponds to the public key contained in key_blob. It will use this
-private key to sign the "data" and produce a signature blob using the
-key type-specific method described in RFC 4253 section 6.6 "Public Key
-Algorithms".
-
-An exception to this is for "ssh-dss" keys where the "flags" word
-contains the value SSH_AGENT_OLD_SIGNATURE. In this case, a legacy
-signature encoding is used in lieu of the standard one. In this case,
-the DSA signature blob is encoded as:
-
-	byte[40]		signature
-
-The signature will be returned in the response message:
-
-	byte			SSH2_AGENT_SIGN_RESPONSE
-	string			signature_blob
-
-If the agent cannot find the key specified by the supplied key_blob then
-it will return SSH_AGENT_FAILURE.
-
-2.7 Locking or unlocking an agent
-
-The agent supports temporary locking with a passphrase to suspend
-processing of sensitive operations until it has been unlocked with the
-same passphrase. To lock an agent, a client send the following request:
-
-	byte			SSH_AGENTC_LOCK
-	string			passphrase
-
-Upon receipt of this message and if the agent is not already locked,
-it will suspend processing requests and return a SSH_AGENT_SUCCESS
-reply. If the agent is already locked, it will return SSH_AGENT_FAILURE.
-
-While locked, the agent will refuse all requests except
-SSH_AGENTC_UNLOCK, SSH_AGENTC_REQUEST_RSA_IDENTITIES and
-SSH2_AGENTC_REQUEST_IDENTITIES. The "request identities" requests are
-treated specially by a locked agent: it will always return an empty list
-of keys.
-
-To unlock an agent, a client may request:
-
-	byte			SSH_AGENTC_UNLOCK
-	string			passphrase
-
-If the passphrase matches and the agent is locked, then it will resume
-processing all requests and return SSH_AGENT_SUCCESS. If the agent
-is not locked or the passphrase does not match then it will return
-SSH_AGENT_FAILURE.
-
-Locking and unlocking affects both protocol 1 and protocol 2 keys.
-
-3. Protocol message numbers
-
-3.1 Requests from client to agent for protocol 1 key operations
-
-	SSH_AGENTC_REQUEST_RSA_IDENTITIES		1
-	SSH_AGENTC_RSA_CHALLENGE			3
-	SSH_AGENTC_ADD_RSA_IDENTITY			7
-	SSH_AGENTC_REMOVE_RSA_IDENTITY			8
-	SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES		9
-	SSH_AGENTC_ADD_RSA_ID_CONSTRAINED		24
-
-3.2 Requests from client to agent for protocol 2 key operations
-
-	SSH2_AGENTC_REQUEST_IDENTITIES			11
-	SSH2_AGENTC_SIGN_REQUEST			13
-	SSH2_AGENTC_ADD_IDENTITY			17
-	SSH2_AGENTC_REMOVE_IDENTITY			18
-	SSH2_AGENTC_REMOVE_ALL_IDENTITIES		19
-	SSH2_AGENTC_ADD_ID_CONSTRAINED			25
-
-3.3 Key-type independent requests from client to agent
-
-	SSH_AGENTC_ADD_SMARTCARD_KEY			20
-	SSH_AGENTC_REMOVE_SMARTCARD_KEY			21
-	SSH_AGENTC_LOCK					22
-	SSH_AGENTC_UNLOCK				23
-	SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED	26
-
-3.4 Generic replies from agent to client
-
-	SSH_AGENT_FAILURE				5
-	SSH_AGENT_SUCCESS				6
-
-3.5 Replies from agent to client for protocol 1 key operations
-
-	SSH_AGENT_RSA_IDENTITIES_ANSWER			2
-	SSH_AGENT_RSA_RESPONSE				4
-
-3.6 Replies from agent to client for protocol 2 key operations
-
-	SSH2_AGENT_IDENTITIES_ANSWER			12
-	SSH2_AGENT_SIGN_RESPONSE			14
-
-3.7 Key constraint identifiers
-
-	SSH_AGENT_CONSTRAIN_LIFETIME			1
-	SSH_AGENT_CONSTRAIN_CONFIRM			2
-
-$OpenBSD: PROTOCOL.agent,v 1.11 2016/05/19 07:45:32 djm Exp $
+https://tools.ietf.org/html/draft-miller-ssh-agent-02
diff --git a/PROTOCOL.certkeys b/PROTOCOL.certkeys
index aa6f5ae..11363fd 100644
--- a/PROTOCOL.certkeys
+++ b/PROTOCOL.certkeys
@@ -25,6 +25,10 @@
 acceptance of certified host keys, by adding a similar ability to
 specify CA keys in ~/.ssh/known_hosts.
 
+All certificate types include certification information along with the
+public key that is used to sign challenges. In OpenSSH, ssh-keygen
+performs the CA signing operation.
+
 Certified keys are represented using new key types:
 
     ssh-rsa-cert-v01@openssh.com
@@ -33,9 +37,17 @@
     ecdsa-sha2-nistp384-cert-v01@openssh.com
     ecdsa-sha2-nistp521-cert-v01@openssh.com
 
-These include certification information along with the public key
-that is used to sign challenges. ssh-keygen performs the CA signing
-operation.
+Two additional types exist for RSA certificates to force use of
+SHA-2 signatures (SHA-256 and SHA-512 respectively):
+
+    rsa-sha2-256-cert-v01@openssh.com
+    rsa-sha2-512-cert-v01@openssh.com
+
+These RSA/SHA-2 types should not appear in keys at rest or transmitted
+on their wire, but do appear in a SSH_MSG_KEXINIT's host-key algorithms
+field or in the "public key algorithm name" field of a "publickey"
+SSH_USERAUTH_REQUEST to indicate that the signature will use the
+specified algorithm.
 
 Protocol extensions
 -------------------
@@ -100,9 +112,9 @@
 
 ECDSA certificate
 
-    string    "ecdsa-sha2-nistp256-v01@openssh.com" |
-              "ecdsa-sha2-nistp384-v01@openssh.com" |
-              "ecdsa-sha2-nistp521-v01@openssh.com"
+    string    "ecdsa-sha2-nistp256-cert-v01@openssh.com" |
+              "ecdsa-sha2-nistp384-cert-v01@openssh.com" |
+              "ecdsa-sha2-nistp521-cert-v01@openssh.com"
     string    nonce
     string    curve
     string    public_key
@@ -174,7 +186,7 @@
 
     valid after <= current time < valid before
 
-criticial options is a set of zero or more key options encoded as
+critical options is a set of zero or more key options encoded as
 below. All such options are "critical" in the sense that an implementation
 must refuse to authorise a key that has an unrecognised option.
 
@@ -192,12 +204,13 @@
 The reserved field is currently unused and is ignored in this version of
 the protocol.
 
-signature key contains the CA key used to sign the certificate.
-The valid key types for CA keys are ssh-rsa, ssh-dss and the ECDSA types
-ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521. "Chained"
-certificates, where the signature key type is a certificate type itself
-are NOT supported. Note that it is possible for a RSA certificate key to
-be signed by a DSS or ECDSA CA key and vice-versa.
+The signature key field contains the CA key used to sign the
+certificate. The valid key types for CA keys are ssh-rsa,
+ssh-dss, ssh-ed25519 and the ECDSA types ecdsa-sha2-nistp256,
+ecdsa-sha2-nistp384, ecdsa-sha2-nistp521. "Chained" certificates, where
+the signature key type is a certificate type itself are NOT supported.
+Note that it is possible for a RSA certificate key to be signed by a
+Ed25519 or ECDSA CA key and vice-versa.
 
 signature is computed over all preceding fields from the initial string
 up to, and including the signature key. Signatures are computed and
@@ -223,6 +236,9 @@
 "critical", if an implementation does not recognise a option
 then the validating party should refuse to accept the certificate.
 
+Custom options should append the originating author or organisation's
+domain name to the option name, e.g. "my-option@example.com".
+
 No critical options are defined for host certificates at present. The
 supported user certificate options and the contents and structure of
 their data fields are:
@@ -254,6 +270,9 @@
 If an implementation does not recognise an extension, then it should
 ignore it.
 
+Custom options should append the originating author or organisation's
+domain name to the option name, e.g. "my-option@example.com".
+
 No extensions are defined for host certificates at present. The
 supported user certificate extensions and the contents and structure of
 their data fields are:
@@ -284,4 +303,4 @@
                                       of this script will not be permitted if
                                       this option is not present.
 
-$OpenBSD: PROTOCOL.certkeys,v 1.10 2016/05/03 10:27:59 djm Exp $
+$OpenBSD: PROTOCOL.certkeys,v 1.15 2018/07/03 11:39:54 djm Exp $
diff --git a/PROTOCOL.chacha20poly1305 b/PROTOCOL.chacha20poly1305
index 4857d38..9ce2a1e 100644
--- a/PROTOCOL.chacha20poly1305
+++ b/PROTOCOL.chacha20poly1305
@@ -16,7 +16,7 @@
 The chacha20-poly1305@openssh.com combines these two primitives into an
 authenticated encryption mode. The construction used is based on that
 proposed for TLS by Adam Langley in [3], but differs in the layout of
-data passed to the MAC and in the addition of encyption of the packet
+data passed to the MAC and in the addition of encryption of the packet
 lengths.
 
 Negotiation
@@ -103,5 +103,5 @@
 [3] "ChaCha20 and Poly1305 based Cipher Suites for TLS", Adam Langley
     http://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-03
 
-$OpenBSD: PROTOCOL.chacha20poly1305,v 1.3 2016/05/03 13:10:24 djm Exp $
+$OpenBSD: PROTOCOL.chacha20poly1305,v 1.4 2018/04/10 00:10:49 djm Exp $
 
diff --git a/PROTOCOL.krl b/PROTOCOL.krl
index b969510..f319bad 100644
--- a/PROTOCOL.krl
+++ b/PROTOCOL.krl
@@ -145,7 +145,7 @@
 5. KRL signature sections
 
 The KRL_SECTION_SIGNATURE section serves a different purpose to the
-preceeding ones: to provide cryptographic authentication of a KRL that
+preceding ones: to provide cryptographic authentication of a KRL that
 is retrieved over a channel that does not provide integrity protection.
 Its format is slightly different to the previously-described sections:
 in order to simplify the signature generation, it includes as a "body"
@@ -166,4 +166,4 @@
 signatures. Signature sections are optional for KRLs distributed by
 trusted means.
 
-$OpenBSD: PROTOCOL.krl,v 1.3 2015/01/30 01:10:33 djm Exp $
+$OpenBSD: PROTOCOL.krl,v 1.4 2018/04/10 00:10:49 djm Exp $
diff --git a/README b/README
index 60594ee..97fc2ef 100644
--- a/README
+++ b/README
@@ -1,11 +1,11 @@
-See https://www.openssh.com/releasenotes.html#7.4p1 for the release notes.
+See https://www.openssh.com/releasenotes.html#7.8p1 for the release notes.
 
 Please read https://www.openssh.com/report.html for bug reporting
 instructions and note that we do not use Github for bug reporting or
 patch/pull-request management.
 
 - A Japanese translation of this document and of the release notes is
-- available at http://www.unixuser.org/~haruyama/security/openssh/index.html
+- available at https://www.unixuser.org/~haruyama/security/openssh/index.html
 - Thanks to HARUYAMA Seigo <haruyama@unixuser.org>
 
 This is the port of OpenBSD's excellent OpenSSH[0] to Linux and other
@@ -22,7 +22,7 @@
 support, EGD[1]/PRNGD[2] support and replacements for OpenBSD library
 functions that are (regrettably) absent from other unices. This port
 has been best tested on AIX, Cygwin, HP-UX, Linux, MacOS/X,
-NetBSD, OpenBSD, OpenServer, Solaris, Unicos, and UnixWare.
+NetBSD, OpenBSD, OpenServer, Solaris and UnixWare.
 
 This version actively tracks changes in the OpenBSD CVS repository.
 
@@ -30,7 +30,8 @@
 commercial ssh-1.2.x. It checks "account" and "session" modules for
 all logins, not just when using password authentication.
 
-OpenSSH depends on Zlib[3], OpenSSL[4] and optionally PAM[5].
+OpenSSH depends on Zlib[3], OpenSSL[4], and optionally PAM[5] and
+libedit[6]
 
 There is now several mailing lists for this port of OpenSSH. Please
 refer to https://www.openssh.com/list.html for details on how to join.
@@ -38,7 +39,7 @@
 Please send bug reports and patches to the mailing list
 openssh-unix-dev@mindrot.org. The list is open to posting by unsubscribed
 users.  Code contribution are welcomed, but please follow the OpenBSD
-style guidelines[6].
+style guidelines[7].
 
 Please refer to the INSTALL document for information on how to install
 OpenSSH on your system.
@@ -55,10 +56,11 @@
 
 [0] https://www.openssh.com/
 [1] http://www.lothar.com/tech/crypto/
-[2] http://www.aet.tu-cottbus.de/personen/jaenicke/postfix_tls/prngd.html
-[3] http://www.gzip.org/zlib/
-[4] http://www.openssl.org/
-[5] http://www.openpam.org
-    http://www.kernel.org/pub/linux/libs/pam/
+[2] http://prngd.sourceforge.net/
+[3] https://www.zlib.net/
+[4] https://www.openssl.org/
+[5] https://www.openpam.org
+    https://www.kernel.org/pub/linux/libs/pam/
     (PAM also is standard on Solaris and HP-UX 11)
-[6] http://man.openbsd.org/style.9
+[6] https://thrysoee.dk/editline/ (portable version)
+[7] https://man.openbsd.org/style.9
diff --git a/README.platform b/README.platform
index c7be95f..9210e07 100644
--- a/README.platform
+++ b/README.platform
@@ -80,7 +80,7 @@
 	32800:AUE_openssh:OpenSSH login:lo
 
 The BSM audit event range available for third party TCB applications is
-32768 - 65535.  Event number 32800 has been choosen for AUE_openssh.
+32768 - 65535.  Event number 32800 has been chosen for AUE_openssh.
 There is no official registry of 3rd party event numbers, so if this
 number is already in use on your system, you may change it at build time
 by configure'ing --with-cflags=-DAUE_openssh=32801 then rebuilding.
diff --git a/README.privsep b/README.privsep
index 2120544..460e905 100644
--- a/README.privsep
+++ b/README.privsep
@@ -34,8 +34,8 @@
 PAM-enabled OpenSSH is known to function with privsep on AIX, FreeBSD, 
 HP-UX (including Trusted Mode), Linux, NetBSD and Solaris.
 
-On Cygwin, Tru64 Unix, OpenServer, and Unicos only the pre-authentication
-part of privsep is supported.  Post-authentication privsep is disabled
+On Cygwin, Tru64 Unix and OpenServer only the pre-authentication part
+of privsep is supported.  Post-authentication privsep is disabled
 automatically (so you won't see the additional process mentioned below).
 
 Note that for a normal interactive login with a shell, enabling privsep
diff --git a/TODO b/TODO
index f22c7e2..b76529c 100644
--- a/TODO
+++ b/TODO
@@ -35,7 +35,7 @@
  - Use different PAM service name for kbdint vs regular auth (suggest from
    Solar Designer)
  - Ability to select which ChallengeResponseAuthentications may be used
-   and order to try them in e.g. "ChallengeResponseAuthentication skey, pam"
+   and order to try them in e.g. "ChallengeResponseAuthentication pam"
 
 - Complete Tru64 SIA support
  - It looks like we could merge it into the password auth code to cut down
@@ -57,10 +57,10 @@
 - Replace the whole u_intXX_t evilness in acconfig.h with something better???
  - Do it in configure.ac
 
-- Consider splitting the u_intXX_t test for sys/bitype.h  into seperate test
+- Consider splitting the u_intXX_t test for sys/bitype.h  into separate test
   to allow people to (right/wrongfully) link against Bind directly.
 
-- Consider splitting configure.ac into seperate files which do logically
+- Consider splitting configure.ac into separate files which do logically
   similar tests. E.g move all the type detection stuff into one file,
   entropy related stuff into another.
 
diff --git a/aclocal.m4 b/aclocal.m4
index ac6b668..25ecc49 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -25,7 +25,7 @@
 }
 	]])],
 		[
-if `grep -i "unrecognized option" conftest.err >/dev/null`
+if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null
 then
 		AC_MSG_RESULT([no])
 		CFLAGS="$saved_CFLAGS"
@@ -63,7 +63,7 @@
 }
 	]])],
 		[
-if `grep -i "unrecognized option" conftest.err >/dev/null`
+if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null
 then
 		AC_MSG_RESULT([no])
 		CFLAGS="$saved_CFLAGS"
@@ -100,8 +100,15 @@
 	exit(0);
 }
 		]])],
-		[ AC_MSG_RESULT([yes])
-		  LDFLAGS="$saved_LDFLAGS $_define_flag"],
+		[
+if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null
+then
+		  AC_MSG_RESULT([no])
+		  LDFLAGS="$saved_LDFLAGS"
+else
+		  AC_MSG_RESULT([yes])
+		  LDFLAGS="$saved_LDFLAGS $_define_flag"
+fi		],
 		[ AC_MSG_RESULT([no])
 		  LDFLAGS="$saved_LDFLAGS" ]
 	)
diff --git a/addrmatch.c b/addrmatch.c
index 8658e10..5a402d0 100644
--- a/addrmatch.c
+++ b/addrmatch.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: addrmatch.c,v 1.13 2016/09/21 16:55:42 djm Exp $ */
+/*	$OpenBSD: addrmatch.c,v 1.14 2018/07/31 03:07:24 djm Exp $ */
 
 /*
  * Copyright (c) 2004-2008 Damien Miller <djm@mindrot.org>
@@ -205,25 +205,24 @@
 static int
 addr_pton(const char *p, struct xaddr *n)
 {
-	struct addrinfo hints, *ai;
+	struct addrinfo hints, *ai = NULL;
+	int ret = -1;
 
 	memset(&hints, '\0', sizeof(hints));
 	hints.ai_flags = AI_NUMERICHOST;
 
 	if (p == NULL || getaddrinfo(p, NULL, &hints, &ai) != 0)
-		return -1;
-
+		goto out;
 	if (ai == NULL || ai->ai_addr == NULL)
-		return -1;
-
-	if (n != NULL &&
-	    addr_sa_to_xaddr(ai->ai_addr, ai->ai_addrlen, n) == -1) {
+		goto out;
+	if (n != NULL && addr_sa_to_xaddr(ai->ai_addr, ai->ai_addrlen, n) == -1)
+		goto out;
+	/* success */
+	ret = 0;
+ out:
+	if (ai != NULL)
 		freeaddrinfo(ai);
-		return -1;
-	}
-
-	freeaddrinfo(ai);
-	return 0;
+	return ret;
 }
 
 /*
diff --git a/audit-bsm.c b/audit-bsm.c
index f8e0bea..1409f69 100644
--- a/audit-bsm.c
+++ b/audit-bsm.c
@@ -49,7 +49,6 @@
 
 #include "ssh.h"
 #include "log.h"
-#include "key.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "xmalloc.h"
diff --git a/audit.c b/audit.c
index 7645c14..33a0437 100644
--- a/audit.c
+++ b/audit.c
@@ -26,12 +26,12 @@
 
 #include <stdarg.h>
 #include <string.h>
+#include <unistd.h>
 
 #ifdef SSH_AUDIT_EVENTS
 
 #include "audit.h"
 #include "log.h"
-#include "key.h"
 #include "hostfile.h"
 #include "auth.h"
 
diff --git a/auth-bsdauth.c b/auth-bsdauth.c
index e00718f..4dc5045 100644
--- a/auth-bsdauth.c
+++ b/auth-bsdauth.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth-bsdauth.c,v 1.14 2015/10/20 23:24:25 mmcc Exp $ */
+/* $OpenBSD: auth-bsdauth.c,v 1.15 2018/07/09 21:35:50 markus Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  *
@@ -33,11 +33,11 @@
 
 #ifdef BSD_AUTH
 #include "xmalloc.h"
-#include "key.h"
+#include "sshkey.h"
+#include "sshbuf.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "log.h"
-#include "buffer.h"
 #ifdef GSSAPI
 #include "ssh-gss.h"
 #endif
diff --git a/auth-krb5.c b/auth-krb5.c
index a5a81ed..3096f1c 100644
--- a/auth-krb5.c
+++ b/auth-krb5.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth-krb5.c,v 1.22 2016/05/04 14:22:33 markus Exp $ */
+/* $OpenBSD: auth-krb5.c,v 1.23 2018/07/09 21:35:50 markus Exp $ */
 /*
  *    Kerberos v5 authentication and ticket-passing routines.
  *
@@ -38,11 +38,11 @@
 #include "ssh.h"
 #include "packet.h"
 #include "log.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "sshkey.h"
 #include "misc.h"
 #include "servconf.h"
 #include "uidswap.h"
-#include "key.h"
 #include "hostfile.h"
 #include "auth.h"
 
diff --git a/auth-options.c b/auth-options.c
index 57b49f7..27c0eb0 100644
--- a/auth-options.c
+++ b/auth-options.c
@@ -1,13 +1,18 @@
-/* $OpenBSD: auth-options.c,v 1.72 2016/11/30 02:57:40 djm Exp $ */
+/* $OpenBSD: auth-options.c,v 1.83 2018/06/19 02:59:41 djm Exp $ */
 /*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- *                    All rights reserved
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose.  Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
+ * Copyright (c) 2018 Damien Miller <djm@mindrot.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
 #include "includes.h"
@@ -19,84 +24,33 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdarg.h>
+#include <ctype.h>
+#include <limits.h>
 
 #include "openbsd-compat/sys-queue.h"
 
-#include "key.h"	/* XXX for typedef */
-#include "buffer.h"	/* XXX for typedef */
 #include "xmalloc.h"
-#include "match.h"
 #include "ssherr.h"
 #include "log.h"
-#include "canohost.h"
-#include "packet.h"
 #include "sshbuf.h"
 #include "misc.h"
-#include "channels.h"
-#include "servconf.h"
 #include "sshkey.h"
+#include "match.h"
+#include "ssh2.h"
 #include "auth-options.h"
-#include "hostfile.h"
-#include "auth.h"
-
-/* Flags set authorized_keys flags */
-int no_port_forwarding_flag = 0;
-int no_agent_forwarding_flag = 0;
-int no_x11_forwarding_flag = 0;
-int no_pty_flag = 0;
-int no_user_rc = 0;
-int key_is_cert_authority = 0;
-
-/* "command=" option. */
-char *forced_command = NULL;
-
-/* "environment=" options. */
-struct envstring *custom_environment = NULL;
-
-/* "tunnel=" option. */
-int forced_tun_device = -1;
-
-/* "principals=" option. */
-char *authorized_principals = NULL;
-
-extern ServerOptions options;
-
-void
-auth_clear_options(void)
-{
-	no_agent_forwarding_flag = 0;
-	no_port_forwarding_flag = 0;
-	no_pty_flag = 0;
-	no_x11_forwarding_flag = 0;
-	no_user_rc = 0;
-	key_is_cert_authority = 0;
-	while (custom_environment) {
-		struct envstring *ce = custom_environment;
-		custom_environment = ce->next;
-		free(ce->s);
-		free(ce);
-	}
-	free(forced_command);
-	forced_command = NULL;
-	free(authorized_principals);
-	authorized_principals = NULL;
-	forced_tun_device = -1;
-	channel_clear_permitted_opens();
-}
 
 /*
  * Match flag 'opt' in *optsp, and if allow_negate is set then also match
  * 'no-opt'. Returns -1 if option not matched, 1 if option matches or 0
- * if negated option matches. 
+ * if negated option matches.
  * If the option or negated option matches, then *optsp is updated to
- * point to the first character after the option and, if 'msg' is not NULL
- * then a message based on it added via auth_debug_add().
+ * point to the first character after the option.
  */
 static int
-match_flag(const char *opt, int allow_negate, char **optsp, const char *msg)
+opt_flag(const char *opt, int allow_negate, const char **optsp)
 {
 	size_t opt_len = strlen(opt);
-	char *opts = *optsp;
+	const char *opts = *optsp;
 	int negate = 0;
 
 	if (allow_negate && strncasecmp(opts, "no-", 3) == 0) {
@@ -105,366 +59,92 @@
 	}
 	if (strncasecmp(opts, opt, opt_len) == 0) {
 		*optsp = opts + opt_len;
-		if (msg != NULL) {
-			auth_debug_add("%s %s.", msg,
-			    negate ? "disabled" : "enabled");
-		}
 		return negate ? 0 : 1;
 	}
 	return -1;
 }
 
-/*
- * return 1 if access is granted, 0 if not.
- * side effect: sets key option flags
- */
-int
-auth_parse_options(struct passwd *pw, char *opts, char *file, u_long linenum)
+static char *
+opt_dequote(const char **sp, const char **errstrp)
 {
-	struct ssh *ssh = active_state;		/* XXX */
-	const char *cp;
-	int i, r;
+	const char *s = *sp;
+	char *ret;
+	size_t i;
 
-	/* reset options */
-	auth_clear_options();
-
-	if (!opts)
-		return 1;
-
-	while (*opts && *opts != ' ' && *opts != '\t') {
-		if ((r = match_flag("cert-authority", 0, &opts, NULL)) != -1) {
-			key_is_cert_authority = r;
-			goto next_option;
-		}
-		if ((r = match_flag("restrict", 0, &opts, NULL)) != -1) {
-			auth_debug_add("Key is restricted.");
-			no_port_forwarding_flag = 1;
-			no_agent_forwarding_flag = 1;
-			no_x11_forwarding_flag = 1;
-			no_pty_flag = 1;
-			no_user_rc = 1;
-			goto next_option;
-		}
-		if ((r = match_flag("port-forwarding", 1, &opts,
-		    "Port forwarding")) != -1) {
-			no_port_forwarding_flag = r != 1;
-			goto next_option;
-		}
-		if ((r = match_flag("agent-forwarding", 1, &opts,
-		    "Agent forwarding")) != -1) {
-			no_agent_forwarding_flag = r != 1;
-			goto next_option;
-		}
-		if ((r = match_flag("x11-forwarding", 1, &opts,
-		    "X11 forwarding")) != -1) {
-			no_x11_forwarding_flag = r != 1;
-			goto next_option;
-		}
-		if ((r = match_flag("pty", 1, &opts,
-		    "PTY allocation")) != -1) {
-			no_pty_flag = r != 1;
-			goto next_option;
-		}
-		if ((r = match_flag("user-rc", 1, &opts,
-		    "User rc execution")) != -1) {
-			no_user_rc = r != 1;
-			goto next_option;
-		}
-		cp = "command=\"";
-		if (strncasecmp(opts, cp, strlen(cp)) == 0) {
-			opts += strlen(cp);
-			free(forced_command);
-			forced_command = xmalloc(strlen(opts) + 1);
-			i = 0;
-			while (*opts) {
-				if (*opts == '"')
-					break;
-				if (*opts == '\\' && opts[1] == '"') {
-					opts += 2;
-					forced_command[i++] = '"';
-					continue;
-				}
-				forced_command[i++] = *opts++;
-			}
-			if (!*opts) {
-				debug("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				free(forced_command);
-				forced_command = NULL;
-				goto bad_option;
-			}
-			forced_command[i] = '\0';
-			auth_debug_add("Forced command.");
-			opts++;
-			goto next_option;
-		}
-		cp = "principals=\"";
-		if (strncasecmp(opts, cp, strlen(cp)) == 0) {
-			opts += strlen(cp);
-			free(authorized_principals);
-			authorized_principals = xmalloc(strlen(opts) + 1);
-			i = 0;
-			while (*opts) {
-				if (*opts == '"')
-					break;
-				if (*opts == '\\' && opts[1] == '"') {
-					opts += 2;
-					authorized_principals[i++] = '"';
-					continue;
-				}
-				authorized_principals[i++] = *opts++;
-			}
-			if (!*opts) {
-				debug("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				free(authorized_principals);
-				authorized_principals = NULL;
-				goto bad_option;
-			}
-			authorized_principals[i] = '\0';
-			auth_debug_add("principals: %.900s",
-			    authorized_principals);
-			opts++;
-			goto next_option;
-		}
-		cp = "environment=\"";
-		if (strncasecmp(opts, cp, strlen(cp)) == 0) {
-			char *s;
-			struct envstring *new_envstring;
-
-			opts += strlen(cp);
-			s = xmalloc(strlen(opts) + 1);
-			i = 0;
-			while (*opts) {
-				if (*opts == '"')
-					break;
-				if (*opts == '\\' && opts[1] == '"') {
-					opts += 2;
-					s[i++] = '"';
-					continue;
-				}
-				s[i++] = *opts++;
-			}
-			if (!*opts) {
-				debug("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				free(s);
-				goto bad_option;
-			}
-			s[i] = '\0';
-			opts++;
-			if (options.permit_user_env) {
-				auth_debug_add("Adding to environment: "
-				    "%.900s", s);
-				debug("Adding to environment: %.900s", s);
-				new_envstring = xcalloc(1,
-				    sizeof(*new_envstring));
-				new_envstring->s = s;
-				new_envstring->next = custom_environment;
-				custom_environment = new_envstring;
-				s = NULL;
-			}
-			free(s);
-			goto next_option;
-		}
-		cp = "from=\"";
-		if (strncasecmp(opts, cp, strlen(cp)) == 0) {
-			const char *remote_ip = ssh_remote_ipaddr(ssh);
-			const char *remote_host = auth_get_canonical_hostname(
-			    ssh, options.use_dns);
-			char *patterns = xmalloc(strlen(opts) + 1);
-
-			opts += strlen(cp);
-			i = 0;
-			while (*opts) {
-				if (*opts == '"')
-					break;
-				if (*opts == '\\' && opts[1] == '"') {
-					opts += 2;
-					patterns[i++] = '"';
-					continue;
-				}
-				patterns[i++] = *opts++;
-			}
-			if (!*opts) {
-				debug("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				free(patterns);
-				goto bad_option;
-			}
-			patterns[i] = '\0';
-			opts++;
-			switch (match_host_and_ip(remote_host, remote_ip,
-			    patterns)) {
-			case 1:
-				free(patterns);
-				/* Host name matches. */
-				goto next_option;
-			case -1:
-				debug("%.100s, line %lu: invalid criteria",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: "
-				    "invalid criteria", file, linenum);
-				/* FALLTHROUGH */
-			case 0:
-				free(patterns);
-				logit("Authentication tried for %.100s with "
-				    "correct key but not from a permitted "
-				    "host (host=%.200s, ip=%.200s).",
-				    pw->pw_name, remote_host, remote_ip);
-				auth_debug_add("Your host '%.200s' is not "
-				    "permitted to use this key for login.",
-				    remote_host);
-				break;
-			}
-			/* deny access */
-			return 0;
-		}
-		cp = "permitopen=\"";
-		if (strncasecmp(opts, cp, strlen(cp)) == 0) {
-			char *host, *p;
-			int port;
-			char *patterns = xmalloc(strlen(opts) + 1);
-
-			opts += strlen(cp);
-			i = 0;
-			while (*opts) {
-				if (*opts == '"')
-					break;
-				if (*opts == '\\' && opts[1] == '"') {
-					opts += 2;
-					patterns[i++] = '"';
-					continue;
-				}
-				patterns[i++] = *opts++;
-			}
-			if (!*opts) {
-				debug("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: missing "
-				    "end quote", file, linenum);
-				free(patterns);
-				goto bad_option;
-			}
-			patterns[i] = '\0';
-			opts++;
-			p = patterns;
-			/* XXX - add streamlocal support */
-			host = hpdelim(&p);
-			if (host == NULL || strlen(host) >= NI_MAXHOST) {
-				debug("%.100s, line %lu: Bad permitopen "
-				    "specification <%.100s>", file, linenum,
-				    patterns);
-				auth_debug_add("%.100s, line %lu: "
-				    "Bad permitopen specification", file,
-				    linenum);
-				free(patterns);
-				goto bad_option;
-			}
-			host = cleanhostname(host);
-			if (p == NULL || (port = permitopen_port(p)) < 0) {
-				debug("%.100s, line %lu: Bad permitopen port "
-				    "<%.100s>", file, linenum, p ? p : "");
-				auth_debug_add("%.100s, line %lu: "
-				    "Bad permitopen port", file, linenum);
-				free(patterns);
-				goto bad_option;
-			}
-			if ((options.allow_tcp_forwarding & FORWARD_LOCAL) != 0)
-				channel_add_permitted_opens(host, port);
-			free(patterns);
-			goto next_option;
-		}
-		cp = "tunnel=\"";
-		if (strncasecmp(opts, cp, strlen(cp)) == 0) {
-			char *tun = NULL;
-			opts += strlen(cp);
-			tun = xmalloc(strlen(opts) + 1);
-			i = 0;
-			while (*opts) {
-				if (*opts == '"')
-					break;
-				tun[i++] = *opts++;
-			}
-			if (!*opts) {
-				debug("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: missing end quote",
-				    file, linenum);
-				free(tun);
-				forced_tun_device = -1;
-				goto bad_option;
-			}
-			tun[i] = '\0';
-			forced_tun_device = a2tun(tun, NULL);
-			free(tun);
-			if (forced_tun_device == SSH_TUNID_ERR) {
-				debug("%.100s, line %lu: invalid tun device",
-				    file, linenum);
-				auth_debug_add("%.100s, line %lu: invalid tun device",
-				    file, linenum);
-				forced_tun_device = -1;
-				goto bad_option;
-			}
-			auth_debug_add("Forced tun device: %d", forced_tun_device);
-			opts++;
-			goto next_option;
-		}
-next_option:
-		/*
-		 * Skip the comma, and move to the next option
-		 * (or break out if there are no more).
-		 */
-		if (!*opts)
-			fatal("Bugs in auth-options.c option processing.");
-		if (*opts == ' ' || *opts == '\t')
-			break;		/* End of options. */
-		if (*opts != ',')
-			goto bad_option;
-		opts++;
-		/* Process the next option. */
+	*errstrp = NULL;
+	if (*s != '"') {
+		*errstrp = "missing start quote";
+		return NULL;
 	}
+	s++;
+	if ((ret = malloc(strlen((s)) + 1)) == NULL) {
+		*errstrp = "memory allocation failed";
+		return NULL;
+	}
+	for (i = 0; *s != '\0' && *s != '"';) {
+		if (s[0] == '\\' && s[1] == '"')
+			s++;
+		ret[i++] = *s++;
+	}
+	if (*s == '\0') {
+		*errstrp = "missing end quote";
+		free(ret);
+		return NULL;
+	}
+	ret[i] = '\0';
+	s++;
+	*sp = s;
+	return ret;
+}
 
-	/* grant access */
-	return 1;
+static int
+opt_match(const char **opts, const char *term)
+{
+	if (strncasecmp((*opts), term, strlen(term)) == 0 &&
+	    (*opts)[strlen(term)] == '=') {
+		*opts += strlen(term) + 1;
+		return 1;
+	}
+	return 0;
+}
 
-bad_option:
-	logit("Bad options in %.100s file, line %lu: %.50s",
-	    file, linenum, opts);
-	auth_debug_add("Bad options in %.100s file, line %lu: %.50s",
-	    file, linenum, opts);
+static int
+dup_strings(char ***dstp, size_t *ndstp, char **src, size_t nsrc)
+{
+	char **dst;
+	size_t i, j;
 
-	/* deny access */
+	*dstp = NULL;
+	*ndstp = 0;
+	if (nsrc == 0)
+		return 0;
+
+	if ((dst = calloc(nsrc, sizeof(*src))) == NULL)
+		return -1;
+	for (i = 0; i < nsrc; i++) {
+		if ((dst[i] = strdup(src[i])) == NULL) {
+			for (j = 0; j < i; j++)
+				free(dst[j]);
+			free(dst);
+			return -1;
+		}
+	}
+	/* success */
+	*dstp = dst;
+	*ndstp = nsrc;
 	return 0;
 }
 
 #define OPTIONS_CRITICAL	1
 #define OPTIONS_EXTENSIONS	2
 static int
-parse_option_list(struct sshbuf *oblob, struct passwd *pw,
-    u_int which, int crit,
-    int *cert_no_port_forwarding_flag,
-    int *cert_no_agent_forwarding_flag,
-    int *cert_no_x11_forwarding_flag,
-    int *cert_no_pty_flag,
-    int *cert_no_user_rc,
-    char **cert_forced_command,
-    int *cert_source_address_done)
+cert_option_list(struct sshauthopt *opts, struct sshbuf *oblob,
+    u_int which, int crit)
 {
-	struct ssh *ssh = active_state;		/* XXX */
 	char *command, *allowed;
-	const char *remote_ip;
 	char *name = NULL;
 	struct sshbuf *c = NULL, *data = NULL;
-	int r, ret = -1, result, found;
+	int r, ret = -1, found;
 
 	if ((c = sshbuf_fromb(oblob)) == NULL) {
 		error("%s: sshbuf_fromb failed", __func__);
@@ -485,21 +165,21 @@
 		found = 0;
 		if ((which & OPTIONS_EXTENSIONS) != 0) {
 			if (strcmp(name, "permit-X11-forwarding") == 0) {
-				*cert_no_x11_forwarding_flag = 0;
+				opts->permit_x11_forwarding_flag = 1;
 				found = 1;
 			} else if (strcmp(name,
 			    "permit-agent-forwarding") == 0) {
-				*cert_no_agent_forwarding_flag = 0;
+				opts->permit_agent_forwarding_flag = 1;
 				found = 1;
 			} else if (strcmp(name,
 			    "permit-port-forwarding") == 0) {
-				*cert_no_port_forwarding_flag = 0;
+				opts->permit_port_forwarding_flag = 1;
 				found = 1;
 			} else if (strcmp(name, "permit-pty") == 0) {
-				*cert_no_pty_flag = 0;
+				opts->permit_pty_flag = 1;
 				found = 1;
 			} else if (strcmp(name, "permit-user-rc") == 0) {
-				*cert_no_user_rc = 0;
+				opts->permit_user_rc = 1;
 				found = 1;
 			}
 		}
@@ -511,13 +191,13 @@
 					    "section: %s", name, ssh_err(r));
 					goto out;
 				}
-				if (*cert_forced_command != NULL) {
+				if (opts->force_command != NULL) {
 					error("Certificate has multiple "
 					    "force-command options");
 					free(command);
 					goto out;
 				}
-				*cert_forced_command = command;
+				opts->force_command = command;
 				found = 1;
 			}
 			if (strcmp(name, "source-address") == 0) {
@@ -527,38 +207,19 @@
 					    "section: %s", name, ssh_err(r));
 					goto out;
 				}
-				if ((*cert_source_address_done)++) {
+				if (opts->required_from_host_cert != NULL) {
 					error("Certificate has multiple "
 					    "source-address options");
 					free(allowed);
 					goto out;
 				}
-				remote_ip = ssh_remote_ipaddr(ssh);
-				result = addr_match_cidr_list(remote_ip,
-				    allowed);
-				free(allowed);
-				switch (result) {
-				case 1:
-					/* accepted */
-					break;
-				case 0:
-					/* no match */
-					logit("Authentication tried for %.100s "
-					    "with valid certificate but not "
-					    "from a permitted host "
-					    "(ip=%.200s).", pw->pw_name,
-					    remote_ip);
-					auth_debug_add("Your address '%.200s' "
-					    "is not permitted to use this "
-					    "certificate for login.",
-					    remote_ip);
-					goto out;
-				case -1:
-				default:
+				/* Check syntax */
+				if (addr_match_cidr_list(NULL, allowed) == -1) {
 					error("Certificate source-address "
 					    "contents invalid");
 					goto out;
 				}
+				opts->required_from_host_cert = allowed;
 				found = 1;
 			}
 		}
@@ -584,74 +245,688 @@
 	ret = 0;
 
  out:
-	if (ret != 0 &&
-	    cert_forced_command != NULL &&
-	    *cert_forced_command != NULL) {
-		free(*cert_forced_command);
-		*cert_forced_command = NULL;
-	}
 	free(name);
 	sshbuf_free(data);
 	sshbuf_free(c);
 	return ret;
 }
 
-/*
- * Set options from critical certificate options. These supersede user key
- * options so this must be called after auth_parse_options().
- */
-int
-auth_cert_options(struct sshkey *k, struct passwd *pw, const char **reason)
+struct sshauthopt *
+sshauthopt_new(void)
 {
-	int cert_no_port_forwarding_flag = 1;
-	int cert_no_agent_forwarding_flag = 1;
-	int cert_no_x11_forwarding_flag = 1;
-	int cert_no_pty_flag = 1;
-	int cert_no_user_rc = 1;
-	char *cert_forced_command = NULL;
-	int cert_source_address_done = 0;
+	struct sshauthopt *ret;
 
-	*reason = "invalid certificate options";
+	if ((ret = calloc(1, sizeof(*ret))) == NULL)
+		return NULL;
+	ret->force_tun_device = -1;
+	return ret;
+}
 
-	/* Separate options and extensions for v01 certs */
-	if (parse_option_list(k->cert->critical, pw,
-	    OPTIONS_CRITICAL, 1, NULL, NULL, NULL, NULL, NULL,
-	    &cert_forced_command,
-	    &cert_source_address_done) == -1)
+void
+sshauthopt_free(struct sshauthopt *opts)
+{
+	size_t i;
+
+	if (opts == NULL)
+		return;
+
+	free(opts->cert_principals);
+	free(opts->force_command);
+	free(opts->required_from_host_cert);
+	free(opts->required_from_host_keys);
+
+	for (i = 0; i < opts->nenv; i++)
+		free(opts->env[i]);
+	free(opts->env);
+
+	for (i = 0; i < opts->npermitopen; i++)
+		free(opts->permitopen[i]);
+	free(opts->permitopen);
+
+	for (i = 0; i < opts->npermitlisten; i++)
+		free(opts->permitlisten[i]);
+	free(opts->permitlisten);
+
+	explicit_bzero(opts, sizeof(*opts));
+	free(opts);
+}
+
+struct sshauthopt *
+sshauthopt_new_with_keys_defaults(void)
+{
+	struct sshauthopt *ret = NULL;
+
+	if ((ret = sshauthopt_new()) == NULL)
+		return NULL;
+
+	/* Defaults for authorized_keys flags */
+	ret->permit_port_forwarding_flag = 1;
+	ret->permit_agent_forwarding_flag = 1;
+	ret->permit_x11_forwarding_flag = 1;
+	ret->permit_pty_flag = 1;
+	ret->permit_user_rc = 1;
+	return ret;
+}
+
+/*
+ * Parse and record a permitopen/permitlisten directive.
+ * Return 0 on success. Return -1 on failure and sets *errstrp to error reason.
+ */
+static int
+handle_permit(const char **optsp, int allow_bare_port,
+    char ***permitsp, size_t *npermitsp, const char **errstrp)
+{
+	char *opt, *tmp, *cp, *host, **permits = *permitsp;
+	size_t npermits = *npermitsp;
+	const char *errstr = "unknown error";
+
+	if (npermits > INT_MAX) {
+		*errstrp = "too many permission directives";
 		return -1;
-	if (parse_option_list(k->cert->extensions, pw,
-	    OPTIONS_EXTENSIONS, 0,
-	    &cert_no_port_forwarding_flag,
-	    &cert_no_agent_forwarding_flag,
-	    &cert_no_x11_forwarding_flag,
-	    &cert_no_pty_flag,
-	    &cert_no_user_rc,
-	    NULL, NULL) == -1)
+	}
+	if ((opt = opt_dequote(optsp, &errstr)) == NULL) {
 		return -1;
-
-	no_port_forwarding_flag |= cert_no_port_forwarding_flag;
-	no_agent_forwarding_flag |= cert_no_agent_forwarding_flag;
-	no_x11_forwarding_flag |= cert_no_x11_forwarding_flag;
-	no_pty_flag |= cert_no_pty_flag;
-	no_user_rc |= cert_no_user_rc;
-	/*
-	 * Only permit both CA and key option forced-command if they match.
-	 * Otherwise refuse the certificate.
-	 */
-	if (cert_forced_command != NULL && forced_command != NULL) {
-		if (strcmp(forced_command, cert_forced_command) == 0) {
-			free(forced_command);
-			forced_command = cert_forced_command;
-		} else {
-			*reason = "certificate and key options forced command "
-			    "do not match";
-			free(cert_forced_command);
+	}
+	if (allow_bare_port && strchr(opt, ':') == NULL) {
+		/*
+		 * Allow a bare port number in permitlisten to indicate a
+		 * listen_host wildcard.
+		 */
+		if (asprintf(&tmp, "*:%s", opt) < 0) {
+			*errstrp = "memory allocation failed";
 			return -1;
 		}
-	} else if (cert_forced_command != NULL)
-		forced_command = cert_forced_command;
-	/* success */
-	*reason = NULL;
+		free(opt);
+		opt = tmp;
+	}
+	if ((tmp = strdup(opt)) == NULL) {
+		free(opt);
+		*errstrp = "memory allocation failed";
+		return -1;
+	}
+	cp = tmp;
+	/* validate syntax before recording it. */
+	host = hpdelim(&cp);
+	if (host == NULL || strlen(host) >= NI_MAXHOST) {
+		free(tmp);
+		free(opt);
+		*errstrp = "invalid permission hostname";
+		return -1;
+	}
+	/*
+	 * don't want to use permitopen_port to avoid
+	 * dependency on channels.[ch] here.
+	 */
+	if (cp == NULL ||
+	    (strcmp(cp, "*") != 0 && a2port(cp) <= 0)) {
+		free(tmp);
+		free(opt);
+		*errstrp = "invalid permission port";
+		return -1;
+	}
+	/* XXX - add streamlocal support */
+	free(tmp);
+	/* Record it */
+	if ((permits = recallocarray(permits, npermits, npermits + 1,
+	    sizeof(*permits))) == NULL) {
+		free(opt);
+		/* NB. don't update *permitsp if alloc fails */
+		*errstrp = "memory allocation failed";
+		return -1;
+	}
+	permits[npermits++] = opt;
+	*permitsp = permits;
+	*npermitsp = npermits;
 	return 0;
 }
 
+struct sshauthopt *
+sshauthopt_parse(const char *opts, const char **errstrp)
+{
+	char **oarray, *opt, *cp, *tmp;
+	int r;
+	struct sshauthopt *ret = NULL;
+	const char *errstr = "unknown error";
+	uint64_t valid_before;
+
+	if (errstrp != NULL)
+		*errstrp = NULL;
+	if ((ret = sshauthopt_new_with_keys_defaults()) == NULL)
+		goto alloc_fail;
+
+	if (opts == NULL)
+		return ret;
+
+	while (*opts && *opts != ' ' && *opts != '\t') {
+		/* flag options */
+		if ((r = opt_flag("restrict", 0, &opts)) != -1) {
+			ret->restricted = 1;
+			ret->permit_port_forwarding_flag = 0;
+			ret->permit_agent_forwarding_flag = 0;
+			ret->permit_x11_forwarding_flag = 0;
+			ret->permit_pty_flag = 0;
+			ret->permit_user_rc = 0;
+		} else if ((r = opt_flag("cert-authority", 0, &opts)) != -1) {
+			ret->cert_authority = r;
+		} else if ((r = opt_flag("port-forwarding", 1, &opts)) != -1) {
+			ret->permit_port_forwarding_flag = r == 1;
+		} else if ((r = opt_flag("agent-forwarding", 1, &opts)) != -1) {
+			ret->permit_agent_forwarding_flag = r == 1;
+		} else if ((r = opt_flag("x11-forwarding", 1, &opts)) != -1) {
+			ret->permit_x11_forwarding_flag = r == 1;
+		} else if ((r = opt_flag("pty", 1, &opts)) != -1) {
+			ret->permit_pty_flag = r == 1;
+		} else if ((r = opt_flag("user-rc", 1, &opts)) != -1) {
+			ret->permit_user_rc = r == 1;
+		} else if (opt_match(&opts, "command")) {
+			if (ret->force_command != NULL) {
+				errstr = "multiple \"command\" clauses";
+				goto fail;
+			}
+			ret->force_command = opt_dequote(&opts, &errstr);
+			if (ret->force_command == NULL)
+				goto fail;
+		} else if (opt_match(&opts, "principals")) {
+			if (ret->cert_principals != NULL) {
+				errstr = "multiple \"principals\" clauses";
+				goto fail;
+			}
+			ret->cert_principals = opt_dequote(&opts, &errstr);
+			if (ret->cert_principals == NULL)
+				goto fail;
+		} else if (opt_match(&opts, "from")) {
+			if (ret->required_from_host_keys != NULL) {
+				errstr = "multiple \"from\" clauses";
+				goto fail;
+			}
+			ret->required_from_host_keys = opt_dequote(&opts,
+			    &errstr);
+			if (ret->required_from_host_keys == NULL)
+				goto fail;
+		} else if (opt_match(&opts, "expiry-time")) {
+			if ((opt = opt_dequote(&opts, &errstr)) == NULL)
+				goto fail;
+			if (parse_absolute_time(opt, &valid_before) != 0 ||
+			    valid_before == 0) {
+				free(opt);
+				errstr = "invalid expires time";
+				goto fail;
+			}
+			free(opt);
+			if (ret->valid_before == 0 ||
+			    valid_before < ret->valid_before)
+				ret->valid_before = valid_before;
+		} else if (opt_match(&opts, "environment")) {
+			if (ret->nenv > INT_MAX) {
+				errstr = "too many environment strings";
+				goto fail;
+			}
+			if ((opt = opt_dequote(&opts, &errstr)) == NULL)
+				goto fail;
+			/* env name must be alphanumeric and followed by '=' */
+			if ((tmp = strchr(opt, '=')) == NULL) {
+				free(opt);
+				errstr = "invalid environment string";
+				goto fail;
+			}
+			for (cp = opt; cp < tmp; cp++) {
+				if (!isalnum((u_char)*cp) && *cp != '_') {
+					free(opt);
+					errstr = "invalid environment string";
+					goto fail;
+				}
+			}
+			/* Append it. */
+			oarray = ret->env;
+			if ((ret->env = recallocarray(ret->env, ret->nenv,
+			    ret->nenv + 1, sizeof(*ret->env))) == NULL) {
+				free(opt);
+				ret->env = oarray; /* put it back for cleanup */
+				goto alloc_fail;
+			}
+			ret->env[ret->nenv++] = opt;
+		} else if (opt_match(&opts, "permitopen")) {
+			if (handle_permit(&opts, 0, &ret->permitopen,
+			    &ret->npermitopen, &errstr) != 0)
+				goto fail;
+		} else if (opt_match(&opts, "permitlisten")) {
+			if (handle_permit(&opts, 1, &ret->permitlisten,
+			    &ret->npermitlisten, &errstr) != 0)
+				goto fail;
+		} else if (opt_match(&opts, "tunnel")) {
+			if ((opt = opt_dequote(&opts, &errstr)) == NULL)
+				goto fail;
+			ret->force_tun_device = a2tun(opt, NULL);
+			free(opt);
+			if (ret->force_tun_device == SSH_TUNID_ERR) {
+				errstr = "invalid tun device";
+				goto fail;
+			}
+		}
+		/*
+		 * Skip the comma, and move to the next option
+		 * (or break out if there are no more).
+		 */
+		if (*opts == '\0' || *opts == ' ' || *opts == '\t')
+			break;		/* End of options. */
+		/* Anything other than a comma is an unknown option */
+		if (*opts != ',') {
+			errstr = "unknown key option";
+			goto fail;
+		}
+		opts++;
+		if (*opts == '\0') {
+			errstr = "unexpected end-of-options";
+			goto fail;
+		}
+	}
+
+	/* success */
+	if (errstrp != NULL)
+		*errstrp = NULL;
+	return ret;
+
+alloc_fail:
+	errstr = "memory allocation failed";
+fail:
+	sshauthopt_free(ret);
+	if (errstrp != NULL)
+		*errstrp = errstr;
+	return NULL;
+}
+
+struct sshauthopt *
+sshauthopt_from_cert(struct sshkey *k)
+{
+	struct sshauthopt *ret;
+
+	if (k == NULL || !sshkey_type_is_cert(k->type) || k->cert == NULL ||
+	    k->cert->type != SSH2_CERT_TYPE_USER)
+		return NULL;
+
+	if ((ret = sshauthopt_new()) == NULL)
+		return NULL;
+
+	/* Handle options and critical extensions separately */
+	if (cert_option_list(ret, k->cert->critical,
+	    OPTIONS_CRITICAL, 1) == -1) {
+		sshauthopt_free(ret);
+		return NULL;
+	}
+	if (cert_option_list(ret, k->cert->extensions,
+	    OPTIONS_EXTENSIONS, 0) == -1) {
+		sshauthopt_free(ret);
+		return NULL;
+	}
+	/* success */
+	return ret;
+}
+
+/*
+ * Merges "additional" options to "primary" and returns the result.
+ * NB. Some options from primary have primacy.
+ */
+struct sshauthopt *
+sshauthopt_merge(const struct sshauthopt *primary,
+    const struct sshauthopt *additional, const char **errstrp)
+{
+	struct sshauthopt *ret;
+	const char *errstr = "internal error";
+	const char *tmp;
+
+	if (errstrp != NULL)
+		*errstrp = NULL;
+
+	if ((ret = sshauthopt_new()) == NULL)
+		goto alloc_fail;
+
+	/* cert_authority and cert_principals are cleared in result */
+
+	/* Prefer access lists from primary. */
+	/* XXX err is both set and mismatch? */
+	tmp = primary->required_from_host_cert;
+	if (tmp == NULL)
+		tmp = additional->required_from_host_cert;
+	if (tmp != NULL && (ret->required_from_host_cert = strdup(tmp)) == NULL)
+		goto alloc_fail;
+	tmp = primary->required_from_host_keys;
+	if (tmp == NULL)
+		tmp = additional->required_from_host_keys;
+	if (tmp != NULL && (ret->required_from_host_keys = strdup(tmp)) == NULL)
+		goto alloc_fail;
+
+	/*
+	 * force_tun_device, permitopen/permitlisten and environment all
+	 * prefer the primary.
+	 */
+	ret->force_tun_device = primary->force_tun_device;
+	if (ret->force_tun_device == -1)
+		ret->force_tun_device = additional->force_tun_device;
+	if (primary->nenv > 0) {
+		if (dup_strings(&ret->env, &ret->nenv,
+		    primary->env, primary->nenv) != 0)
+			goto alloc_fail;
+	} else if (additional->nenv) {
+		if (dup_strings(&ret->env, &ret->nenv,
+		    additional->env, additional->nenv) != 0)
+			goto alloc_fail;
+	}
+	if (primary->npermitopen > 0) {
+		if (dup_strings(&ret->permitopen, &ret->npermitopen,
+		    primary->permitopen, primary->npermitopen) != 0)
+			goto alloc_fail;
+	} else if (additional->npermitopen > 0) {
+		if (dup_strings(&ret->permitopen, &ret->npermitopen,
+		    additional->permitopen, additional->npermitopen) != 0)
+			goto alloc_fail;
+	}
+
+	if (primary->npermitlisten > 0) {
+		if (dup_strings(&ret->permitlisten, &ret->npermitlisten,
+		    primary->permitlisten, primary->npermitlisten) != 0)
+			goto alloc_fail;
+	} else if (additional->npermitlisten > 0) {
+		if (dup_strings(&ret->permitlisten, &ret->npermitlisten,
+		    additional->permitlisten, additional->npermitlisten) != 0)
+			goto alloc_fail;
+	}
+
+	/* Flags are logical-AND (i.e. must be set in both for permission) */
+#define OPTFLAG(x) ret->x = (primary->x == 1) && (additional->x == 1)
+	OPTFLAG(permit_port_forwarding_flag);
+	OPTFLAG(permit_agent_forwarding_flag);
+	OPTFLAG(permit_x11_forwarding_flag);
+	OPTFLAG(permit_pty_flag);
+	OPTFLAG(permit_user_rc);
+#undef OPTFLAG
+
+	/* Earliest expiry time should win */
+	if (primary->valid_before != 0)
+		ret->valid_before = primary->valid_before;
+	if (additional->valid_before != 0 &&
+	    additional->valid_before < ret->valid_before)
+		ret->valid_before = additional->valid_before;
+
+	/*
+	 * When both multiple forced-command are specified, only
+	 * proceed if they are identical, otherwise fail.
+	 */
+	if (primary->force_command != NULL &&
+	    additional->force_command != NULL) {
+		if (strcmp(primary->force_command,
+		    additional->force_command) == 0) {
+			/* ok */
+			ret->force_command = strdup(primary->force_command);
+			if (ret->force_command == NULL)
+				goto alloc_fail;
+		} else {
+			errstr = "forced command options do not match";
+			goto fail;
+		}
+	} else if (primary->force_command != NULL) {
+		if ((ret->force_command = strdup(
+		    primary->force_command)) == NULL)
+			goto alloc_fail;
+	} else if (additional->force_command != NULL) {
+		if ((ret->force_command = strdup(
+		    additional->force_command)) == NULL)
+			goto alloc_fail;
+	}
+	/* success */
+	if (errstrp != NULL)
+		*errstrp = NULL;
+	return ret;
+
+ alloc_fail:
+	errstr = "memory allocation failed";
+ fail:
+	if (errstrp != NULL)
+		*errstrp = errstr;
+	sshauthopt_free(ret);
+	return NULL;
+}
+
+/*
+ * Copy options
+ */
+struct sshauthopt *
+sshauthopt_copy(const struct sshauthopt *orig)
+{
+	struct sshauthopt *ret;
+
+	if ((ret = sshauthopt_new()) == NULL)
+		return NULL;
+
+#define OPTSCALAR(x) ret->x = orig->x
+	OPTSCALAR(permit_port_forwarding_flag);
+	OPTSCALAR(permit_agent_forwarding_flag);
+	OPTSCALAR(permit_x11_forwarding_flag);
+	OPTSCALAR(permit_pty_flag);
+	OPTSCALAR(permit_user_rc);
+	OPTSCALAR(restricted);
+	OPTSCALAR(cert_authority);
+	OPTSCALAR(force_tun_device);
+	OPTSCALAR(valid_before);
+#undef OPTSCALAR
+#define OPTSTRING(x) \
+	do { \
+		if (orig->x != NULL && (ret->x = strdup(orig->x)) == NULL) { \
+			sshauthopt_free(ret); \
+			return NULL; \
+		} \
+	} while (0)
+	OPTSTRING(cert_principals);
+	OPTSTRING(force_command);
+	OPTSTRING(required_from_host_cert);
+	OPTSTRING(required_from_host_keys);
+#undef OPTSTRING
+
+	if (dup_strings(&ret->env, &ret->nenv, orig->env, orig->nenv) != 0 ||
+	    dup_strings(&ret->permitopen, &ret->npermitopen,
+	    orig->permitopen, orig->npermitopen) != 0 ||
+	    dup_strings(&ret->permitlisten, &ret->npermitlisten,
+	    orig->permitlisten, orig->npermitlisten) != 0) {
+		sshauthopt_free(ret);
+		return NULL;
+	}
+	return ret;
+}
+
+static int
+serialise_array(struct sshbuf *m, char **a, size_t n)
+{
+	struct sshbuf *b;
+	size_t i;
+	int r;
+
+	if (n > INT_MAX)
+		return SSH_ERR_INTERNAL_ERROR;
+
+	if ((b = sshbuf_new()) == NULL) {
+		return SSH_ERR_ALLOC_FAIL;
+	}
+	for (i = 0; i < n; i++) {
+		if ((r = sshbuf_put_cstring(b, a[i])) != 0) {
+			sshbuf_free(b);
+			return r;
+		}
+	}
+	if ((r = sshbuf_put_u32(m, n)) != 0 ||
+	    (r = sshbuf_put_stringb(m, b)) != 0) {
+		sshbuf_free(b);
+		return r;
+	}
+	/* success */
+	return 0;
+}
+
+static int
+deserialise_array(struct sshbuf *m, char ***ap, size_t *np)
+{
+	char **a = NULL;
+	size_t i, n = 0;
+	struct sshbuf *b = NULL;
+	u_int tmp;
+	int r = SSH_ERR_INTERNAL_ERROR;
+
+	if ((r = sshbuf_get_u32(m, &tmp)) != 0 ||
+	    (r = sshbuf_froms(m, &b)) != 0)
+		goto out;
+	if (tmp > INT_MAX) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+	n = tmp;
+	if (n > 0 && (a = calloc(n, sizeof(*a))) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+	for (i = 0; i < n; i++) {
+		if ((r = sshbuf_get_cstring(b, &a[i], NULL)) != 0)
+			goto out;
+	}
+	/* success */
+	r = 0;
+	*ap = a;
+	a = NULL;
+	*np = n;
+	n = 0;
+ out:
+	for (i = 0; i < n; i++)
+		free(a[i]);
+	free(a);
+	sshbuf_free(b);
+	return r;
+}
+
+static int
+serialise_nullable_string(struct sshbuf *m, const char *s)
+{
+	int r;
+
+	if ((r = sshbuf_put_u8(m, s == NULL)) != 0 ||
+	    (r = sshbuf_put_cstring(m, s)) != 0)
+		return r;
+	return 0;
+}
+
+static int
+deserialise_nullable_string(struct sshbuf *m, char **sp)
+{
+	int r;
+	u_char flag;
+
+	*sp = NULL;
+	if ((r = sshbuf_get_u8(m, &flag)) != 0 ||
+	    (r = sshbuf_get_cstring(m, flag ? NULL : sp, NULL)) != 0)
+		return r;
+	return 0;
+}
+
+int
+sshauthopt_serialise(const struct sshauthopt *opts, struct sshbuf *m,
+    int untrusted)
+{
+	int r = SSH_ERR_INTERNAL_ERROR;
+
+	/* Flag and simple integer options */
+	if ((r = sshbuf_put_u8(m, opts->permit_port_forwarding_flag)) != 0 ||
+	    (r = sshbuf_put_u8(m, opts->permit_agent_forwarding_flag)) != 0 ||
+	    (r = sshbuf_put_u8(m, opts->permit_x11_forwarding_flag)) != 0 ||
+	    (r = sshbuf_put_u8(m, opts->permit_pty_flag)) != 0 ||
+	    (r = sshbuf_put_u8(m, opts->permit_user_rc)) != 0 ||
+	    (r = sshbuf_put_u8(m, opts->restricted)) != 0 ||
+	    (r = sshbuf_put_u8(m, opts->cert_authority)) != 0 ||
+	    (r = sshbuf_put_u64(m, opts->valid_before)) != 0)
+		return r;
+
+	/* tunnel number can be negative to indicate "unset" */
+	if ((r = sshbuf_put_u8(m, opts->force_tun_device == -1)) != 0 ||
+	    (r = sshbuf_put_u32(m, (opts->force_tun_device < 0) ?
+	    0 : (u_int)opts->force_tun_device)) != 0)
+		return r;
+
+	/* String options; these may be NULL */
+	if ((r = serialise_nullable_string(m,
+	    untrusted ? "yes" : opts->cert_principals)) != 0 ||
+	    (r = serialise_nullable_string(m,
+	    untrusted ? "true" : opts->force_command)) != 0 ||
+	    (r = serialise_nullable_string(m,
+	    untrusted ? NULL : opts->required_from_host_cert)) != 0 ||
+	    (r = serialise_nullable_string(m,
+	     untrusted ? NULL : opts->required_from_host_keys)) != 0)
+		return r;
+
+	/* Array options */
+	if ((r = serialise_array(m, opts->env,
+	    untrusted ? 0 : opts->nenv)) != 0 ||
+	    (r = serialise_array(m, opts->permitopen,
+	    untrusted ? 0 : opts->npermitopen)) != 0 ||
+	    (r = serialise_array(m, opts->permitlisten,
+	    untrusted ? 0 : opts->npermitlisten)) != 0)
+		return r;
+
+	/* success */
+	return 0;
+}
+
+int
+sshauthopt_deserialise(struct sshbuf *m, struct sshauthopt **optsp)
+{
+	struct sshauthopt *opts = NULL;
+	int r = SSH_ERR_INTERNAL_ERROR;
+	u_char f;
+	u_int tmp;
+
+	if ((opts = calloc(1, sizeof(*opts))) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+
+#define OPT_FLAG(x) \
+	do { \
+		if ((r = sshbuf_get_u8(m, &f)) != 0) \
+			goto out; \
+		opts->x = f; \
+	} while (0)
+	OPT_FLAG(permit_port_forwarding_flag);
+	OPT_FLAG(permit_agent_forwarding_flag);
+	OPT_FLAG(permit_x11_forwarding_flag);
+	OPT_FLAG(permit_pty_flag);
+	OPT_FLAG(permit_user_rc);
+	OPT_FLAG(restricted);
+	OPT_FLAG(cert_authority);
+#undef OPT_FLAG
+
+	if ((r = sshbuf_get_u64(m, &opts->valid_before)) != 0)
+		goto out;
+
+	/* tunnel number can be negative to indicate "unset" */
+	if ((r = sshbuf_get_u8(m, &f)) != 0 ||
+	    (r = sshbuf_get_u32(m, &tmp)) != 0)
+		goto out;
+	opts->force_tun_device = f ? -1 : (int)tmp;
+
+	/* String options may be NULL */
+	if ((r = deserialise_nullable_string(m, &opts->cert_principals)) != 0 ||
+	    (r = deserialise_nullable_string(m, &opts->force_command)) != 0 ||
+	    (r = deserialise_nullable_string(m,
+	    &opts->required_from_host_cert)) != 0 ||
+	    (r = deserialise_nullable_string(m,
+	    &opts->required_from_host_keys)) != 0)
+		goto out;
+
+	/* Array options */
+	if ((r = deserialise_array(m, &opts->env, &opts->nenv)) != 0 ||
+	    (r = deserialise_array(m,
+	    &opts->permitopen, &opts->npermitopen)) != 0 ||
+	    (r = deserialise_array(m,
+	    &opts->permitlisten, &opts->npermitlisten)) != 0)
+		goto out;
+
+	/* success */
+	r = 0;
+	*optsp = opts;
+	opts = NULL;
+ out:
+	sshauthopt_free(opts);
+	return r;
+}
diff --git a/auth-options.h b/auth-options.h
index 52cbb42..0462983 100644
--- a/auth-options.h
+++ b/auth-options.h
@@ -1,40 +1,95 @@
-/* $OpenBSD: auth-options.h,v 1.22 2016/11/30 02:57:40 djm Exp $ */
+/* $OpenBSD: auth-options.h,v 1.27 2018/06/06 18:23:32 djm Exp $ */
 
 /*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- *                    All rights reserved
+ * Copyright (c) 2018 Damien Miller <djm@mindrot.org>
  *
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose.  Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
 #ifndef AUTH_OPTIONS_H
 #define AUTH_OPTIONS_H
 
-/* Linked list of custom environment strings */
-struct envstring {
-	struct envstring *next;
-	char   *s;
+struct passwd;
+struct sshkey;
+
+/*
+ * sshauthopt represents key options parsed from authorized_keys or
+ * from certificate extensions/options.
+ */
+struct sshauthopt {
+	/* Feature flags */
+	int permit_port_forwarding_flag;
+	int permit_agent_forwarding_flag;
+	int permit_x11_forwarding_flag;
+	int permit_pty_flag;
+	int permit_user_rc;
+
+	/* "restrict" keyword was invoked */
+	int restricted;
+
+	/* key/principal expiry date */
+	uint64_t valid_before;
+
+	/* Certificate-related options */
+	int cert_authority;
+	char *cert_principals;
+
+	int force_tun_device;
+	char *force_command;
+
+	/* Custom environment */
+	size_t nenv;
+	char **env;
+
+	/* Permitted port forwardings */
+	size_t npermitopen;
+	char **permitopen;
+
+	/* Permitted listens (remote forwarding) */
+	size_t npermitlisten;
+	char **permitlisten;
+
+	/*
+	 * Permitted host/addresses (comma-separated)
+	 * Caller must check source address matches both lists (if present).
+	 */
+	char *required_from_host_cert;
+	char *required_from_host_keys;
 };
 
-/* Flags that may be set in authorized_keys options. */
-extern int no_port_forwarding_flag;
-extern int no_agent_forwarding_flag;
-extern int no_x11_forwarding_flag;
-extern int no_pty_flag;
-extern int no_user_rc;
-extern char *forced_command;
-extern struct envstring *custom_environment;
-extern int forced_tun_device;
-extern int key_is_cert_authority;
-extern char *authorized_principals;
+struct sshauthopt *sshauthopt_new(void);
+struct sshauthopt *sshauthopt_new_with_keys_defaults(void);
+void sshauthopt_free(struct sshauthopt *opts);
+struct sshauthopt *sshauthopt_copy(const struct sshauthopt *orig);
+int sshauthopt_serialise(const struct sshauthopt *opts, struct sshbuf *m, int);
+int sshauthopt_deserialise(struct sshbuf *m, struct sshauthopt **opts);
 
-int	auth_parse_options(struct passwd *, char *, char *, u_long);
-void	auth_clear_options(void);
-int	auth_cert_options(struct sshkey *, struct passwd *, const char **);
+/*
+ * Parse authorized_keys options. Returns an options structure on success
+ * or NULL on failure. Will set errstr on failure.
+ */
+struct sshauthopt *sshauthopt_parse(const char *s, const char **errstr);
+
+/*
+ * Parse certification options to a struct sshauthopt.
+ * Returns options on success or NULL on failure.
+ */
+struct sshauthopt *sshauthopt_from_cert(struct sshkey *k);
+
+/*
+ * Merge key options.
+ */
+struct sshauthopt *sshauthopt_merge(const struct sshauthopt *primary,
+    const struct sshauthopt *additional, const char **errstrp);
 
 #endif
diff --git a/auth-pam.c b/auth-pam.c
index 7d8b292..8c01383 100644
--- a/auth-pam.c
+++ b/auth-pam.c
@@ -86,8 +86,8 @@
 #endif
 
 #include "xmalloc.h"
-#include "buffer.h"
-#include "key.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "auth-pam.h"
@@ -105,8 +105,7 @@
 #include "monitor_wrap.h"
 
 extern ServerOptions options;
-extern Buffer loginmsg;
-extern int compat20;
+extern struct sshbuf *loginmsg;
 extern u_int utmp_len;
 
 /* so we don't silently change behaviour */
@@ -288,61 +287,80 @@
 void
 sshpam_password_change_required(int reqd)
 {
+	extern struct sshauthopt *auth_opts;
+	static int saved_port, saved_agent, saved_x11;
+
 	debug3("%s %d", __func__, reqd);
 	if (sshpam_authctxt == NULL)
 		fatal("%s: PAM authctxt not initialized", __func__);
 	sshpam_authctxt->force_pwchange = reqd;
 	if (reqd) {
-		no_port_forwarding_flag |= 2;
-		no_agent_forwarding_flag |= 2;
-		no_x11_forwarding_flag |= 2;
+		saved_port = auth_opts->permit_port_forwarding_flag;
+		saved_agent = auth_opts->permit_agent_forwarding_flag;
+		saved_x11 = auth_opts->permit_x11_forwarding_flag;
+		auth_opts->permit_port_forwarding_flag = 0;
+		auth_opts->permit_agent_forwarding_flag = 0;
+		auth_opts->permit_x11_forwarding_flag = 0;
 	} else {
-		no_port_forwarding_flag &= ~2;
-		no_agent_forwarding_flag &= ~2;
-		no_x11_forwarding_flag &= ~2;
+		if (saved_port)
+			auth_opts->permit_port_forwarding_flag = saved_port;
+		if (saved_agent)
+			auth_opts->permit_agent_forwarding_flag = saved_agent;
+		if (saved_x11)
+			auth_opts->permit_x11_forwarding_flag = saved_x11;
 	}
 }
 
 /* Import regular and PAM environment from subprocess */
 static void
-import_environments(Buffer *b)
+import_environments(struct sshbuf *b)
 {
 	char *env;
-	u_int i, num_env;
-	int err;
+	u_int n, i, num_env;
+	int r;
 
 	debug3("PAM: %s entering", __func__);
 
 #ifndef UNSUPPORTED_POSIX_THREADS_HACK
 	/* Import variables set by do_pam_account */
-	sshpam_account_status = buffer_get_int(b);
-	sshpam_password_change_required(buffer_get_int(b));
+	if ((r = sshbuf_get_u32(b, &n)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (n > INT_MAX)
+		fatal("%s: invalid PAM account status %u", __func__, n);
+	sshpam_account_status = (int)n;
+	if ((r = sshbuf_get_u32(b, &n)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshpam_password_change_required(n != 0);
 
 	/* Import environment from subprocess */
-	num_env = buffer_get_int(b);
+	if ((r = sshbuf_get_u32(b, &num_env)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (num_env > 1024)
 		fatal("%s: received %u environment variables, expected <= 1024",
 		    __func__, num_env);
 	sshpam_env = xcalloc(num_env + 1, sizeof(*sshpam_env));
 	debug3("PAM: num env strings %d", num_env);
-	for(i = 0; i < num_env; i++)
-		sshpam_env[i] = buffer_get_string(b, NULL);
-
+	for(i = 0; i < num_env; i++) {
+		if ((r = sshbuf_get_cstring(b, &(sshpam_env[i]), NULL)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
 	sshpam_env[num_env] = NULL;
 
 	/* Import PAM environment from subprocess */
-	num_env = buffer_get_int(b);
+	if ((r = sshbuf_get_u32(b, &num_env)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	debug("PAM: num PAM env strings %d", num_env);
-	for(i = 0; i < num_env; i++) {
-		env = buffer_get_string(b, NULL);
-
+	for (i = 0; i < num_env; i++) {
+		if ((r = sshbuf_get_cstring(b, &env, NULL)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 #ifdef HAVE_PAM_PUTENV
 		/* Errors are not fatal here */
-		if ((err = pam_putenv(sshpam_handle, env)) != PAM_SUCCESS) {
+		if ((r = pam_putenv(sshpam_handle, env)) != PAM_SUCCESS) {
 			error("PAM: pam_putenv: %s",
-			    pam_strerror(sshpam_handle, sshpam_err));
+			    pam_strerror(sshpam_handle, r));
 		}
 #endif
+		/* XXX leak env? */
 	}
 #endif
 }
@@ -354,10 +372,11 @@
 sshpam_thread_conv(int n, sshpam_const struct pam_message **msg,
     struct pam_response **resp, void *data)
 {
-	Buffer buffer;
+	struct sshbuf *buffer;
 	struct pam_ctxt *ctxt;
 	struct pam_response *reply;
-	int i;
+	int r, i;
+	u_char status;
 
 	debug3("PAM: %s entering, %d messages", __func__, n);
 	*resp = NULL;
@@ -371,38 +390,52 @@
 		return (PAM_CONV_ERR);
 
 	if ((reply = calloc(n, sizeof(*reply))) == NULL)
-		return (PAM_CONV_ERR);
+		return PAM_CONV_ERR;
+	if ((buffer = sshbuf_new()) == NULL) {
+		free(reply);
+		return PAM_CONV_ERR;
+	}
 
-	buffer_init(&buffer);
 	for (i = 0; i < n; ++i) {
 		switch (PAM_MSG_MEMBER(msg, i, msg_style)) {
 		case PAM_PROMPT_ECHO_OFF:
 		case PAM_PROMPT_ECHO_ON:
-			buffer_put_cstring(&buffer,
-			    PAM_MSG_MEMBER(msg, i, msg));
+			if ((r = sshbuf_put_cstring(buffer,
+			    PAM_MSG_MEMBER(msg, i, msg))) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			if (ssh_msg_send(ctxt->pam_csock,
-			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer) == -1)
+			    PAM_MSG_MEMBER(msg, i, msg_style), buffer) == -1)
 				goto fail;
-			if (ssh_msg_recv(ctxt->pam_csock, &buffer) == -1)
+
+			if (ssh_msg_recv(ctxt->pam_csock, buffer) == -1)
 				goto fail;
-			if (buffer_get_char(&buffer) != PAM_AUTHTOK)
+			if ((r = sshbuf_get_u8(buffer, &status)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
+			if (status != PAM_AUTHTOK)
 				goto fail;
-			reply[i].resp = buffer_get_string(&buffer, NULL);
+			if ((r = sshbuf_get_cstring(buffer,
+			    &reply[i].resp, NULL)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			break;
 		case PAM_ERROR_MSG:
 		case PAM_TEXT_INFO:
-			buffer_put_cstring(&buffer,
-			    PAM_MSG_MEMBER(msg, i, msg));
+			if ((r = sshbuf_put_cstring(buffer,
+			    PAM_MSG_MEMBER(msg, i, msg))) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			if (ssh_msg_send(ctxt->pam_csock,
-			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer) == -1)
+			    PAM_MSG_MEMBER(msg, i, msg_style), buffer) == -1)
 				goto fail;
 			break;
 		default:
 			goto fail;
 		}
-		buffer_clear(&buffer);
+		sshbuf_reset(buffer);
 	}
-	buffer_free(&buffer);
+	sshbuf_free(buffer);
 	*resp = reply;
 	return (PAM_SUCCESS);
 
@@ -411,7 +444,7 @@
 		free(reply[i].resp);
 	}
 	free(reply);
-	buffer_free(&buffer);
+	sshbuf_free(buffer);
 	return (PAM_CONV_ERR);
 }
 
@@ -422,9 +455,9 @@
 sshpam_thread(void *ctxtp)
 {
 	struct pam_ctxt *ctxt = ctxtp;
-	Buffer buffer;
+	struct sshbuf *buffer = NULL;
 	struct pam_conv sshpam_conv;
-	int flags = (options.permit_empty_passwd == 0 ?
+	int r, flags = (options.permit_empty_passwd == 0 ?
 	    PAM_DISALLOW_NULL_AUTHTOK : 0);
 #ifndef UNSUPPORTED_POSIX_THREADS_HACK
 	extern char **environ;
@@ -457,7 +490,9 @@
 	if (sshpam_authctxt == NULL)
 		fatal("%s: PAM authctxt not initialized", __func__);
 
-	buffer_init(&buffer);
+	if ((buffer = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+
 	sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
 	    (const void *)&sshpam_conv);
 	if (sshpam_err != PAM_SUCCESS)
@@ -468,59 +503,71 @@
 	if (sshpam_err != PAM_SUCCESS)
 		goto auth_fail;
 
-	if (compat20) {
-		if (!do_pam_account()) {
-			sshpam_err = PAM_ACCT_EXPIRED;
+	if (!do_pam_account()) {
+		sshpam_err = PAM_ACCT_EXPIRED;
+		goto auth_fail;
+	}
+	if (sshpam_authctxt->force_pwchange) {
+		sshpam_err = pam_chauthtok(sshpam_handle,
+		    PAM_CHANGE_EXPIRED_AUTHTOK);
+		if (sshpam_err != PAM_SUCCESS)
 			goto auth_fail;
-		}
-		if (sshpam_authctxt->force_pwchange) {
-			sshpam_err = pam_chauthtok(sshpam_handle,
-			    PAM_CHANGE_EXPIRED_AUTHTOK);
-			if (sshpam_err != PAM_SUCCESS)
-				goto auth_fail;
-			sshpam_password_change_required(0);
-		}
+		sshpam_password_change_required(0);
 	}
 
-	buffer_put_cstring(&buffer, "OK");
+	if ((r = sshbuf_put_cstring(buffer, "OK")) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 #ifndef UNSUPPORTED_POSIX_THREADS_HACK
 	/* Export variables set by do_pam_account */
-	buffer_put_int(&buffer, sshpam_account_status);
-	buffer_put_int(&buffer, sshpam_authctxt->force_pwchange);
+	if ((r = sshbuf_put_u32(buffer, sshpam_account_status)) != 0 ||
+	    (r = sshbuf_put_u32(buffer, sshpam_authctxt->force_pwchange)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	/* Export any environment strings set in child */
-	for(i = 0; environ[i] != NULL; i++)
-		; /* Count */
-	buffer_put_int(&buffer, i);
-	for(i = 0; environ[i] != NULL; i++)
-		buffer_put_cstring(&buffer, environ[i]);
-
+	for (i = 0; environ[i] != NULL; i++) {
+		/* Count */
+		if (i > INT_MAX)
+			fatal("%s: too many enviornment strings", __func__);
+	}
+	if ((r = sshbuf_put_u32(buffer, i)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	for (i = 0; environ[i] != NULL; i++) {
+		if ((r = sshbuf_put_cstring(buffer, environ[i])) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
 	/* Export any environment strings set by PAM in child */
 	env_from_pam = pam_getenvlist(sshpam_handle);
-	for(i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++)
-		; /* Count */
-	buffer_put_int(&buffer, i);
-	for(i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++)
-		buffer_put_cstring(&buffer, env_from_pam[i]);
+	for (i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++) {
+		/* Count */
+		if (i > INT_MAX)
+			fatal("%s: too many PAM enviornment strings", __func__);
+	}
+	if ((r = sshbuf_put_u32(buffer, i)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	for (i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++) {
+		if ((r = sshbuf_put_cstring(buffer, env_from_pam[i])) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
 #endif /* UNSUPPORTED_POSIX_THREADS_HACK */
 
 	/* XXX - can't do much about an error here */
-	ssh_msg_send(ctxt->pam_csock, sshpam_err, &buffer);
-	buffer_free(&buffer);
+	ssh_msg_send(ctxt->pam_csock, sshpam_err, buffer);
+	sshbuf_free(buffer);
 	pthread_exit(NULL);
 
  auth_fail:
-	buffer_put_cstring(&buffer,
-	    pam_strerror(sshpam_handle, sshpam_err));
+	if ((r = sshbuf_put_cstring(buffer,
+	    pam_strerror(sshpam_handle, sshpam_err))) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	/* XXX - can't do much about an error here */
 	if (sshpam_err == PAM_ACCT_EXPIRED)
-		ssh_msg_send(ctxt->pam_csock, PAM_ACCT_EXPIRED, &buffer);
+		ssh_msg_send(ctxt->pam_csock, PAM_ACCT_EXPIRED, buffer);
 	else if (sshpam_maxtries_reached)
-		ssh_msg_send(ctxt->pam_csock, PAM_MAXTRIES, &buffer);
+		ssh_msg_send(ctxt->pam_csock, PAM_MAXTRIES, buffer);
 	else
-		ssh_msg_send(ctxt->pam_csock, PAM_AUTH_ERR, &buffer);
-	buffer_free(&buffer);
+		ssh_msg_send(ctxt->pam_csock, PAM_AUTH_ERR, buffer);
+	sshbuf_free(buffer);
 	pthread_exit(NULL);
 
 	return (NULL); /* Avoid warning for non-pthread case */
@@ -557,8 +604,7 @@
     struct pam_response **resp, void *data)
 {
 	struct pam_response *reply;
-	int i;
-	size_t len;
+	int r, i;
 
 	debug3("PAM: %s called with %d messages", __func__, n);
 	*resp = NULL;
@@ -573,9 +619,10 @@
 		switch (PAM_MSG_MEMBER(msg, i, msg_style)) {
 		case PAM_ERROR_MSG:
 		case PAM_TEXT_INFO:
-			len = strlen(PAM_MSG_MEMBER(msg, i, msg));
-			buffer_append(&loginmsg, PAM_MSG_MEMBER(msg, i, msg), len);
-			buffer_append(&loginmsg, "\n", 1 );
+			if ((r = sshbuf_putf(loginmsg, "%s\n",
+			    PAM_MSG_MEMBER(msg, i, msg))) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			reply[i].resp_retcode = PAM_SUCCESS;
 			break;
 		default:
@@ -668,6 +715,27 @@
 	return (0);
 }
 
+static void
+expose_authinfo(const char *caller)
+{
+	char *auth_info;
+
+	/*
+	 * Expose authentication information to PAM.
+	 * The environment variable is versioned. Please increment the
+	 * version suffix if the format of session_info changes.
+	 */
+	if (sshpam_authctxt->session_info == NULL)
+		auth_info = xstrdup("");
+	else if ((auth_info = sshbuf_dup_string(
+	    sshpam_authctxt->session_info)) == NULL)
+		fatal("%s: sshbuf_dup_string failed", __func__);
+
+	debug2("%s: auth information in SSH_AUTH_INFO_0", caller);
+	do_pam_putenv("SSH_AUTH_INFO_0", auth_info);
+	free(auth_info);
+}
+
 static void *
 sshpam_init_ctx(Authctxt *authctxt)
 {
@@ -688,6 +756,7 @@
 		return (NULL);
 	}
 
+	expose_authinfo(__func__);
 	ctxt = xcalloc(1, sizeof *ctxt);
 
 	/* Start the authentication thread */
@@ -715,25 +784,27 @@
     u_int *num, char ***prompts, u_int **echo_on)
 {
 	struct ssh *ssh = active_state; /* XXX */
-	Buffer buffer;
+	struct sshbuf *buffer;
 	struct pam_ctxt *ctxt = ctx;
 	size_t plen;
 	u_char type;
 	char *msg;
 	size_t len, mlen;
+	int r;
 
 	debug3("PAM: %s entering", __func__);
-	buffer_init(&buffer);
+	if ((buffer = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	*name = xstrdup("");
 	*info = xstrdup("");
 	*prompts = xmalloc(sizeof(char *));
 	**prompts = NULL;
 	plen = 0;
 	*echo_on = xmalloc(sizeof(u_int));
-	while (ssh_msg_recv(ctxt->pam_psock, &buffer) == 0) {
-		type = buffer_get_char(&buffer);
-		msg = buffer_get_string(&buffer, NULL);
-		mlen = strlen(msg);
+	while (ssh_msg_recv(ctxt->pam_psock, buffer) == 0) {
+		if ((r = sshbuf_get_u8(buffer, &type)) != 0 ||
+		    (r = sshbuf_get_cstring(buffer, &msg, &mlen)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		switch (type) {
 		case PAM_PROMPT_ECHO_ON:
 		case PAM_PROMPT_ECHO_OFF:
@@ -779,8 +850,10 @@
 			if (**prompts != NULL) {
 				/* drain any accumulated messages */
 				debug("PAM: %s", **prompts);
-				buffer_append(&loginmsg, **prompts,
-				    strlen(**prompts));
+				if ((r = sshbuf_put(loginmsg, **prompts,
+				    strlen(**prompts))) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
 				free(**prompts);
 				**prompts = NULL;
 			}
@@ -791,7 +864,7 @@
 					fatal("Internal error: PAM auth "
 					    "succeeded when it should have "
 					    "failed");
-				import_environments(&buffer);
+				import_environments(buffer);
 				*num = 0;
 				**echo_on = 0;
 				ctxt->pam_done = 1;
@@ -830,6 +903,8 @@
 		fatal("%s: password length too long: %zu", __func__, l);
 
 	ret = malloc(l + 1);
+	if (ret == NULL)
+		return NULL;
 	for (i = 0; i < l; i++)
 		ret[i] = junk[i % (sizeof(junk) - 1)];
 	ret[i] = '\0';
@@ -840,9 +915,10 @@
 static int
 sshpam_respond(void *ctx, u_int num, char **resp)
 {
-	Buffer buffer;
+	struct sshbuf *buffer;
 	struct pam_ctxt *ctxt = ctx;
 	char *fake;
+	int r;
 
 	debug2("PAM: %s entering, %u responses", __func__, num);
 	switch (ctxt->pam_done) {
@@ -858,21 +934,24 @@
 		error("PAM: expected one response, got %u", num);
 		return (-1);
 	}
-	buffer_init(&buffer);
+	if ((buffer = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	if (sshpam_authctxt->valid &&
 	    (sshpam_authctxt->pw->pw_uid != 0 ||
-	    options.permit_root_login == PERMIT_YES))
-		buffer_put_cstring(&buffer, *resp);
-	else {
+	    options.permit_root_login == PERMIT_YES)) {
+		if ((r = sshbuf_put_cstring(buffer, *resp)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	} else {
 		fake = fake_password(*resp);
-		buffer_put_cstring(&buffer, fake);
+		if ((r = sshbuf_put_cstring(buffer, fake)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		free(fake);
 	}
-	if (ssh_msg_send(ctxt->pam_psock, PAM_AUTHTOK, &buffer) == -1) {
-		buffer_free(&buffer);
+	if (ssh_msg_send(ctxt->pam_psock, PAM_AUTHTOK, buffer) == -1) {
+		sshbuf_free(buffer);
 		return (-1);
 	}
-	buffer_free(&buffer);
+	sshbuf_free(buffer);
 	return (1);
 }
 
@@ -927,6 +1006,7 @@
 	sshpam_cleanup();
 }
 
+
 u_int
 do_pam_account(void)
 {
@@ -934,6 +1014,8 @@
 	if (sshpam_account_status != -1)
 		return (sshpam_account_status);
 
+	expose_authinfo(__func__);
+
 	sshpam_err = pam_acct_mgmt(sshpam_handle, 0);
 	debug3("PAM: %s pam_acct_mgmt = %d (%s)", __func__, sshpam_err,
 	    pam_strerror(sshpam_handle, sshpam_err));
@@ -1055,9 +1137,12 @@
 }
 
 void
-do_pam_session(void)
+do_pam_session(struct ssh *ssh)
 {
 	debug3("PAM: opening session");
+
+	expose_authinfo(__func__);
+
 	sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
 	    (const void *)&store_conv);
 	if (sshpam_err != PAM_SUCCESS)
@@ -1068,7 +1153,7 @@
 		sshpam_session_open = 1;
 	else {
 		sshpam_session_open = 0;
-		disable_forwarding();
+		auth_restrict_session(ssh);
 		error("PAM: pam_open_session(): %s",
 		    pam_strerror(sshpam_handle, sshpam_err));
 	}
@@ -1140,7 +1225,7 @@
     struct pam_response **resp, void *data)
 {
 	struct pam_response *reply;
-	int i;
+	int r, i;
 	size_t len;
 
 	debug3("PAM: %s called with %d messages", __func__, n);
@@ -1166,9 +1251,10 @@
 		case PAM_TEXT_INFO:
 			len = strlen(PAM_MSG_MEMBER(msg, i, msg));
 			if (len > 0) {
-				buffer_append(&loginmsg,
-				    PAM_MSG_MEMBER(msg, i, msg), len);
-				buffer_append(&loginmsg, "\n", 1);
+				if ((r = sshbuf_putf(loginmsg, "%s\n",
+				    PAM_MSG_MEMBER(msg, i, msg))) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
 			}
 			if ((reply[i].resp = strdup("")) == NULL)
 				goto fail;
diff --git a/auth-pam.h b/auth-pam.h
index c47b442..4198607 100644
--- a/auth-pam.h
+++ b/auth-pam.h
@@ -25,10 +25,12 @@
 #include "includes.h"
 #ifdef USE_PAM
 
+struct ssh;
+
 void start_pam(Authctxt *);
 void finish_pam(void);
 u_int do_pam_account(void);
-void do_pam_session(void);
+void do_pam_session(struct ssh *);
 void do_pam_setcred(int );
 void do_pam_chauthtok(void);
 int do_pam_putenv(char *, char *);
diff --git a/auth-passwd.c b/auth-passwd.c
index 996c2cf..65f5251 100644
--- a/auth-passwd.c
+++ b/auth-passwd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth-passwd.c,v 1.45 2016/07/21 01:39:35 dtucker Exp $ */
+/* $OpenBSD: auth-passwd.c,v 1.47 2018/07/09 21:26:02 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -46,16 +46,17 @@
 #include <stdarg.h>
 
 #include "packet.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 #include "log.h"
 #include "misc.h"
 #include "servconf.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "auth-options.h"
 
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
 extern ServerOptions options;
 
 #ifdef HAVE_LOGIN_CAP
@@ -68,22 +69,15 @@
 
 #define MAX_PASSWORD_LEN	1024
 
-void
-disable_forwarding(void)
-{
-	no_port_forwarding_flag = 1;
-	no_agent_forwarding_flag = 1;
-	no_x11_forwarding_flag = 1;
-}
-
 /*
  * Tries to authenticate the user using password.  Returns true if
  * authentication succeeds.
  */
 int
-auth_password(Authctxt *authctxt, const char *password)
+auth_password(struct ssh *ssh, const char *password)
 {
-	struct passwd * pw = authctxt->pw;
+	Authctxt *authctxt = ssh->authctxt;
+	struct passwd *pw = authctxt->pw;
 	int result, ok = authctxt->valid;
 #if defined(USE_SHADOW) && defined(HAS_SHADOW_EXPIRE)
 	static int expire_checked = 0;
@@ -128,9 +122,9 @@
 			authctxt->force_pwchange = 1;
 	}
 #endif
-	result = sys_auth_passwd(authctxt, password);
+	result = sys_auth_passwd(ssh, password);
 	if (authctxt->force_pwchange)
-		disable_forwarding();
+		auth_restrict_session(ssh);
 	return (result && ok);
 }
 
@@ -138,7 +132,7 @@
 static void
 warn_expiry(Authctxt *authctxt, auth_session_t *as)
 {
-	char buf[256];
+	int r;
 	quad_t pwtimeleft, actimeleft, daysleft, pwwarntime, acwarntime;
 
 	pwwarntime = acwarntime = TWO_WEEKS;
@@ -155,34 +149,34 @@
 #endif
 	if (pwtimeleft != 0 && pwtimeleft < pwwarntime) {
 		daysleft = pwtimeleft / DAY + 1;
-		snprintf(buf, sizeof(buf),
+		if ((r = sshbuf_putf(loginmsg,
 		    "Your password will expire in %lld day%s.\n",
-		    daysleft, daysleft == 1 ? "" : "s");
-		buffer_append(&loginmsg, buf, strlen(buf));
+		    daysleft, daysleft == 1 ? "" : "s")) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 	if (actimeleft != 0 && actimeleft < acwarntime) {
 		daysleft = actimeleft / DAY + 1;
-		snprintf(buf, sizeof(buf),
+		if ((r = sshbuf_putf(loginmsg,
 		    "Your account will expire in %lld day%s.\n",
-		    daysleft, daysleft == 1 ? "" : "s");
-		buffer_append(&loginmsg, buf, strlen(buf));
+		    daysleft, daysleft == 1 ? "" : "s")) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 }
 
 int
-sys_auth_passwd(Authctxt *authctxt, const char *password)
+sys_auth_passwd(struct ssh *ssh, const char *password)
 {
-	struct passwd *pw = authctxt->pw;
+	Authctxt *authctxt = ssh->authctxt;
 	auth_session_t *as;
 	static int expire_checked = 0;
 
-	as = auth_usercheck(pw->pw_name, authctxt->style, "auth-ssh",
+	as = auth_usercheck(authctxt->pw->pw_name, authctxt->style, "auth-ssh",
 	    (char *)password);
 	if (as == NULL)
 		return (0);
 	if (auth_getstate(as) & AUTH_PWEXPIRED) {
 		auth_close(as);
-		disable_forwarding();
+		auth_restrict_session(ssh);
 		authctxt->force_pwchange = 1;
 		return (1);
 	} else {
@@ -195,8 +189,9 @@
 }
 #elif !defined(CUSTOM_SYS_AUTH_PASSWD)
 int
-sys_auth_passwd(Authctxt *authctxt, const char *password)
+sys_auth_passwd(struct ssh *ssh, const char *password)
 {
+	Authctxt *authctxt = ssh->authctxt;
 	struct passwd *pw = authctxt->pw;
 	char *encrypted_password, *salt = NULL;
 
diff --git a/auth-rhosts.c b/auth-rhosts.c
index ecf956f..57296e1 100644
--- a/auth-rhosts.c
+++ b/auth-rhosts.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth-rhosts.c,v 1.48 2016/08/13 17:47:41 markus Exp $ */
+/* $OpenBSD: auth-rhosts.c,v 1.49 2018/07/09 21:35:50 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -34,8 +34,8 @@
 #include "pathnames.h"
 #include "log.h"
 #include "misc.h"
-#include "buffer.h" /* XXX */
-#include "key.h" /* XXX */
+#include "sshbuf.h"
+#include "sshkey.h"
 #include "servconf.h"
 #include "canohost.h"
 #include "sshkey.h"
diff --git a/auth-shadow.c b/auth-shadow.c
index 2190916..c77ee8d 100644
--- a/auth-shadow.c
+++ b/auth-shadow.c
@@ -30,10 +30,10 @@
 #include <string.h>
 #include <time.h>
 
-#include "key.h"
 #include "hostfile.h"
 #include "auth.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 #include "log.h"
 
 #ifdef DAY
@@ -41,7 +41,7 @@
 #endif
 #define DAY	(24L * 60 * 60) /* 1 day in seconds */
 
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
 
 /*
  * For the account and password expiration functions, we assume the expiry
@@ -57,7 +57,7 @@
 {
 	time_t today;
 	int daysleft;
-	char buf[256];
+	int r;
 
 	today = time(NULL) / DAY;
 	daysleft = spw->sp_expire - today;
@@ -71,10 +71,10 @@
 		return 1;
 	} else if (daysleft <= spw->sp_warn) {
 		debug3("account will expire in %d days", daysleft);
-		snprintf(buf, sizeof(buf),
+		if ((r = sshbuf_putf(loginmsg, 
 		    "Your account will expire in %d day%s.\n", daysleft,
-		    daysleft == 1 ? "" : "s");
-		buffer_append(&loginmsg, buf, strlen(buf));
+		    daysleft == 1 ? "" : "s")) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 
 	return 0;
@@ -89,9 +89,8 @@
 {
 	struct spwd *spw = NULL;
 	const char *user = ctxt->pw->pw_name;
-	char buf[256];
 	time_t today;
-	int daysleft, disabled = 0;
+	int r, daysleft, disabled = 0;
 
 	if ((spw = getspnam((char *)user)) == NULL) {
 		error("Could not get shadow information for %.100s", user);
@@ -131,10 +130,10 @@
 		return 1;
 	} else if (daysleft <= spw->sp_warn) {
 		debug3("password will expire in %d days", daysleft);
-		snprintf(buf, sizeof(buf),
+		if ((r = sshbuf_putf(loginmsg, 
 		    "Your password will expire in %d day%s.\n", daysleft,
-		    daysleft == 1 ? "" : "s");
-		buffer_append(&loginmsg, buf, strlen(buf));
+		    daysleft == 1 ? "" : "s")) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 
 	return 0;
diff --git a/auth-sia.c b/auth-sia.c
index a9e1c25..ebe9d8d 100644
--- a/auth-sia.c
+++ b/auth-sia.c
@@ -36,7 +36,7 @@
 #include <string.h>
 
 #include "ssh.h"
-#include "key.h"
+#include "ssh_api.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "auth-sia.h"
@@ -50,11 +50,12 @@
 extern char **saved_argv;
 
 int
-sys_auth_passwd(Authctxt *authctxt, const char *pass)
+sys_auth_passwd(struct ssh *ssh, const char *pass)
 {
 	int ret;
 	SIAENTITY *ent = NULL;
 	const char *host;
+	Authctxt *authctxt = ssh->authctxt;
 
 	host = get_canonical_hostname(options.use_dns);
 
diff --git a/auth-skey.c b/auth-skey.c
index 3536ec8..b347527 100644
--- a/auth-skey.c
+++ b/auth-skey.c
@@ -35,7 +35,6 @@
 #include <skey.h>
 
 #include "xmalloc.h"
-#include "key.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "ssh-gss.h"
diff --git a/auth.c b/auth.c
index 27797df..343704e 100644
--- a/auth.c
+++ b/auth.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth.c,v 1.119 2016/12/15 21:29:05 dtucker Exp $ */
+/* $OpenBSD: auth.c,v 1.132 2018/07/11 08:19:35 martijn Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -28,6 +28,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
+#include <sys/wait.h>
 
 #include <netinet/in.h>
 
@@ -43,12 +44,10 @@
 #ifdef USE_SHADOW
 #include <shadow.h>
 #endif
-#ifdef HAVE_LIBGEN_H
-#include <libgen.h>
-#endif
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>
+#include <time.h>
 #include <unistd.h>
 #include <limits.h>
 #include <netdb.h>
@@ -57,10 +56,10 @@
 #include "match.h"
 #include "groupaccess.h"
 #include "log.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "misc.h"
 #include "servconf.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "auth-options.h"
@@ -76,16 +75,17 @@
 #include "authfile.h"
 #include "ssherr.h"
 #include "compat.h"
+#include "channels.h"
 
 /* import */
 extern ServerOptions options;
 extern int use_privsep;
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
 extern struct passwd *privsep_pw;
+extern struct sshauthopt *auth_opts;
 
 /* Debugging messages */
-Buffer auth_debug;
-int auth_debug_init;
+static struct sshbuf *auth_debug;
 
 /*
  * Check if the user is allowed to log in via ssh. If user is listed
@@ -269,21 +269,41 @@
 	return 1;
 }
 
-void
-auth_info(Authctxt *authctxt, const char *fmt, ...)
+/*
+ * Formats any key left in authctxt->auth_method_key for inclusion in
+ * auth_log()'s message. Also includes authxtct->auth_method_info if present.
+ */
+static char *
+format_method_key(Authctxt *authctxt)
 {
-	va_list ap;
-        int i;
+	const struct sshkey *key = authctxt->auth_method_key;
+	const char *methinfo = authctxt->auth_method_info;
+	char *fp, *ret = NULL;
 
-	free(authctxt->info);
-	authctxt->info = NULL;
+	if (key == NULL)
+		return NULL;
 
-	va_start(ap, fmt);
-	i = vasprintf(&authctxt->info, fmt, ap);
-	va_end(ap);
-
-	if (i < 0 || authctxt->info == NULL)
-		fatal("vasprintf failed");
+	if (sshkey_is_cert(key)) {
+		fp = sshkey_fingerprint(key->cert->signature_key,
+		    options.fingerprint_hash, SSH_FP_DEFAULT);
+		xasprintf(&ret, "%s ID %s (serial %llu) CA %s %s%s%s",
+		    sshkey_type(key), key->cert->key_id,
+		    (unsigned long long)key->cert->serial,
+		    sshkey_type(key->cert->signature_key),
+		    fp == NULL ? "(null)" : fp,
+		    methinfo == NULL ? "" : ", ",
+		    methinfo == NULL ? "" : methinfo);
+		free(fp);
+	} else {
+		fp = sshkey_fingerprint(key, options.fingerprint_hash,
+		    SSH_FP_DEFAULT);
+		xasprintf(&ret, "%s %s%s%s", sshkey_type(key),
+		    fp == NULL ? "(null)" : fp,
+		    methinfo == NULL ? "" : ", ",
+		    methinfo == NULL ? "" : methinfo);
+		free(fp);
+	}
+	return ret;
 }
 
 void
@@ -292,7 +312,8 @@
 {
 	struct ssh *ssh = active_state; /* XXX */
 	void (*authlog) (const char *fmt,...) = verbose;
-	char *authmsg;
+	const char *authmsg;
+	char *extra = NULL;
 
 	if (use_privsep && !mm_is_monitor() && !authctxt->postponed)
 		return;
@@ -311,6 +332,11 @@
 	else
 		authmsg = authenticated ? "Accepted" : "Failed";
 
+	if ((extra = format_method_key(authctxt)) == NULL) {
+		if (authctxt->auth_method_info != NULL)
+			extra = xstrdup(authctxt->auth_method_info);
+	}
+
 	authlog("%s %s%s%s for %s%.100s from %.200s port %d ssh2%s%s",
 	    authmsg,
 	    method,
@@ -319,10 +345,10 @@
 	    authctxt->user,
 	    ssh_remote_ipaddr(ssh),
 	    ssh_remote_port(ssh),
-	    authctxt->info != NULL ? ": " : "",
-	    authctxt->info != NULL ? authctxt->info : "");
-	free(authctxt->info);
-	authctxt->info = NULL;
+	    extra != NULL ? ": " : "",
+	    extra != NULL ? extra : "");
+
+	free(extra);
 
 #ifdef CUSTOM_FAILED_LOGIN
 	if (authenticated == 0 && !authctxt->postponed &&
@@ -364,10 +390,8 @@
  * Check whether root logins are disallowed.
  */
 int
-auth_root_allowed(const char *method)
+auth_root_allowed(struct ssh *ssh, const char *method)
 {
-	struct ssh *ssh = active_state; /* XXX */
-
 	switch (options.permit_root_login) {
 	case PERMIT_YES:
 		return 1;
@@ -378,7 +402,7 @@
 			return 1;
 		break;
 	case PERMIT_FORCED_ONLY:
-		if (forced_command) {
+		if (auth_opts->force_command != NULL) {
 			logit("Root login accepted for forced command.");
 			return 1;
 		}
@@ -400,11 +424,13 @@
 char *
 expand_authorized_keys(const char *filename, struct passwd *pw)
 {
-	char *file, ret[PATH_MAX];
+	char *file, uidstr[32], ret[PATH_MAX];
 	int i;
 
+	snprintf(uidstr, sizeof(uidstr), "%llu",
+	    (unsigned long long)pw->pw_uid);
 	file = percent_expand(filename, "h", pw->pw_dir,
-	    "u", pw->pw_name, (char *)NULL);
+	    "u", pw->pw_name, "U", uidstr, (char *)NULL);
 
 	/*
 	 * Ensure that filename starts anchored. If not, be backward
@@ -430,7 +456,7 @@
 
 /* return ok if key exists in sysfile or userfile */
 HostStatus
-check_key_in_hostfiles(struct passwd *pw, Key *key, const char *host,
+check_key_in_hostfiles(struct passwd *pw, struct sshkey *key, const char *host,
     const char *sysfile, const char *userfile)
 {
 	char *user_hostfile;
@@ -474,98 +500,6 @@
 	return host_status;
 }
 
-/*
- * Check a given path for security. This is defined as all components
- * of the path to the file must be owned by either the owner of
- * of the file or root and no directories must be group or world writable.
- *
- * XXX Should any specific check be done for sym links ?
- *
- * Takes a file name, its stat information (preferably from fstat() to
- * avoid races), the uid of the expected owner, their home directory and an
- * error buffer plus max size as arguments.
- *
- * Returns 0 on success and -1 on failure
- */
-int
-auth_secure_path(const char *name, struct stat *stp, const char *pw_dir,
-    uid_t uid, char *err, size_t errlen)
-{
-	char buf[PATH_MAX], homedir[PATH_MAX];
-	char *cp;
-	int comparehome = 0;
-	struct stat st;
-
-	if (realpath(name, buf) == NULL) {
-		snprintf(err, errlen, "realpath %s failed: %s", name,
-		    strerror(errno));
-		return -1;
-	}
-	if (pw_dir != NULL && realpath(pw_dir, homedir) != NULL)
-		comparehome = 1;
-
-	if (!S_ISREG(stp->st_mode)) {
-		snprintf(err, errlen, "%s is not a regular file", buf);
-		return -1;
-	}
-	if ((!platform_sys_dir_uid(stp->st_uid) && stp->st_uid != uid) ||
-	    (stp->st_mode & 022) != 0) {
-		snprintf(err, errlen, "bad ownership or modes for file %s",
-		    buf);
-		return -1;
-	}
-
-	/* for each component of the canonical path, walking upwards */
-	for (;;) {
-		if ((cp = dirname(buf)) == NULL) {
-			snprintf(err, errlen, "dirname() failed");
-			return -1;
-		}
-		strlcpy(buf, cp, sizeof(buf));
-
-		if (stat(buf, &st) < 0 ||
-		    (!platform_sys_dir_uid(st.st_uid) && st.st_uid != uid) ||
-		    (st.st_mode & 022) != 0) {
-			snprintf(err, errlen,
-			    "bad ownership or modes for directory %s", buf);
-			return -1;
-		}
-
-		/* If are past the homedir then we can stop */
-		if (comparehome && strcmp(homedir, buf) == 0)
-			break;
-
-		/*
-		 * dirname should always complete with a "/" path,
-		 * but we can be paranoid and check for "." too
-		 */
-		if ((strcmp("/", buf) == 0) || (strcmp(".", buf) == 0))
-			break;
-	}
-	return 0;
-}
-
-/*
- * Version of secure_path() that accepts an open file descriptor to
- * avoid races.
- *
- * Returns 0 on success and -1 on failure
- */
-static int
-secure_filename(FILE *f, const char *file, struct passwd *pw,
-    char *err, size_t errlen)
-{
-	struct stat st;
-
-	/* check the open file to avoid races */
-	if (fstat(fileno(f), &st) < 0) {
-		snprintf(err, errlen, "cannot stat file %s: %s",
-		    file, strerror(errno));
-		return -1;
-	}
-	return auth_secure_path(file, &st, pw->pw_dir, pw->pw_uid, err, errlen);
-}
-
 static FILE *
 auth_openfile(const char *file, struct passwd *pw, int strict_modes,
     int log_missing, char *file_type)
@@ -598,7 +532,7 @@
 		return NULL;
 	}
 	if (strict_modes &&
-	    secure_filename(f, file, pw, line, sizeof(line)) != 0) {
+	    safe_path_fd(fileno(f), file, pw, line, sizeof(line)) != 0) {
 		fclose(f);
 		logit("Authentication refused: %s", line);
 		auth_debug_add("Ignored %s: %s", file_type, line);
@@ -637,6 +571,8 @@
 
 	ci->user = user;
 	parse_server_match_config(&options, ci);
+	log_change_level(options.log_level);
+	process_permitopen(ssh, &options);
 
 #if defined(_AIX) && defined(HAVE_SETAUTHDB)
 	aix_setauthdb(user);
@@ -696,7 +632,7 @@
 
 /* Returns 1 if key is revoked by revoked_keys_file, 0 otherwise */
 int
-auth_key_is_revoked(Key *key)
+auth_key_is_revoked(struct sshkey *key)
 {
 	char *fp = NULL;
 	int r;
@@ -738,26 +674,32 @@
 {
 	char buf[1024];
 	va_list args;
+	int r;
 
-	if (!auth_debug_init)
+	if (auth_debug == NULL)
 		return;
 
 	va_start(args, fmt);
 	vsnprintf(buf, sizeof(buf), fmt, args);
 	va_end(args);
-	buffer_put_cstring(&auth_debug, buf);
+	if ((r = sshbuf_put_cstring(auth_debug, buf)) != 0)
+		fatal("%s: sshbuf_put_cstring: %s", __func__, ssh_err(r));
 }
 
 void
 auth_debug_send(void)
 {
+	struct ssh *ssh = active_state;		/* XXX */
 	char *msg;
+	int r;
 
-	if (!auth_debug_init)
+	if (auth_debug == NULL)
 		return;
-	while (buffer_len(&auth_debug)) {
-		msg = buffer_get_string(&auth_debug, NULL);
-		packet_send_debug("%s", msg);
+	while (sshbuf_len(auth_debug) != 0) {
+		if ((r = sshbuf_get_cstring(auth_debug, &msg, NULL)) != 0)
+			fatal("%s: sshbuf_get_cstring: %s",
+			    __func__, ssh_err(r));
+		ssh_packet_send_debug(ssh, "%s", msg);
 		free(msg);
 	}
 }
@@ -765,12 +707,10 @@
 void
 auth_debug_reset(void)
 {
-	if (auth_debug_init)
-		buffer_clear(&auth_debug);
-	else {
-		buffer_init(&auth_debug);
-		auth_debug_init = 1;
-	}
+	if (auth_debug != NULL)
+		sshbuf_reset(auth_debug);
+	else if ((auth_debug = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 }
 
 struct passwd *
@@ -909,3 +849,353 @@
 		return dnsname;
 	}
 }
+
+/*
+ * Runs command in a subprocess with a minimal environment.
+ * Returns pid on success, 0 on failure.
+ * The child stdout and stderr maybe captured, left attached or sent to
+ * /dev/null depending on the contents of flags.
+ * "tag" is prepended to log messages.
+ * NB. "command" is only used for logging; the actual command executed is
+ * av[0].
+ */
+pid_t
+subprocess(const char *tag, struct passwd *pw, const char *command,
+    int ac, char **av, FILE **child, u_int flags)
+{
+	FILE *f = NULL;
+	struct stat st;
+	int fd, devnull, p[2], i;
+	pid_t pid;
+	char *cp, errmsg[512];
+	u_int envsize;
+	char **child_env;
+
+	if (child != NULL)
+		*child = NULL;
+
+	debug3("%s: %s command \"%s\" running as %s (flags 0x%x)", __func__,
+	    tag, command, pw->pw_name, flags);
+
+	/* Check consistency */
+	if ((flags & SSH_SUBPROCESS_STDOUT_DISCARD) != 0 &&
+	    (flags & SSH_SUBPROCESS_STDOUT_CAPTURE) != 0) {
+		error("%s: inconsistent flags", __func__);
+		return 0;
+	}
+	if (((flags & SSH_SUBPROCESS_STDOUT_CAPTURE) == 0) != (child == NULL)) {
+		error("%s: inconsistent flags/output", __func__);
+		return 0;
+	}
+
+	/*
+	 * If executing an explicit binary, then verify the it exists
+	 * and appears safe-ish to execute
+	 */
+	if (*av[0] != '/') {
+		error("%s path is not absolute", tag);
+		return 0;
+	}
+	temporarily_use_uid(pw);
+	if (stat(av[0], &st) < 0) {
+		error("Could not stat %s \"%s\": %s", tag,
+		    av[0], strerror(errno));
+		restore_uid();
+		return 0;
+	}
+	if (safe_path(av[0], &st, NULL, 0, errmsg, sizeof(errmsg)) != 0) {
+		error("Unsafe %s \"%s\": %s", tag, av[0], errmsg);
+		restore_uid();
+		return 0;
+	}
+	/* Prepare to keep the child's stdout if requested */
+	if (pipe(p) != 0) {
+		error("%s: pipe: %s", tag, strerror(errno));
+		restore_uid();
+		return 0;
+	}
+	restore_uid();
+
+	switch ((pid = fork())) {
+	case -1: /* error */
+		error("%s: fork: %s", tag, strerror(errno));
+		close(p[0]);
+		close(p[1]);
+		return 0;
+	case 0: /* child */
+		/* Prepare a minimal environment for the child. */
+		envsize = 5;
+		child_env = xcalloc(sizeof(*child_env), envsize);
+		child_set_env(&child_env, &envsize, "PATH", _PATH_STDPATH);
+		child_set_env(&child_env, &envsize, "USER", pw->pw_name);
+		child_set_env(&child_env, &envsize, "LOGNAME", pw->pw_name);
+		child_set_env(&child_env, &envsize, "HOME", pw->pw_dir);
+		if ((cp = getenv("LANG")) != NULL)
+			child_set_env(&child_env, &envsize, "LANG", cp);
+
+		for (i = 0; i < NSIG; i++)
+			signal(i, SIG_DFL);
+
+		if ((devnull = open(_PATH_DEVNULL, O_RDWR)) == -1) {
+			error("%s: open %s: %s", tag, _PATH_DEVNULL,
+			    strerror(errno));
+			_exit(1);
+		}
+		if (dup2(devnull, STDIN_FILENO) == -1) {
+			error("%s: dup2: %s", tag, strerror(errno));
+			_exit(1);
+		}
+
+		/* Set up stdout as requested; leave stderr in place for now. */
+		fd = -1;
+		if ((flags & SSH_SUBPROCESS_STDOUT_CAPTURE) != 0)
+			fd = p[1];
+		else if ((flags & SSH_SUBPROCESS_STDOUT_DISCARD) != 0)
+			fd = devnull;
+		if (fd != -1 && dup2(fd, STDOUT_FILENO) == -1) {
+			error("%s: dup2: %s", tag, strerror(errno));
+			_exit(1);
+		}
+		closefrom(STDERR_FILENO + 1);
+
+		/* Don't use permanently_set_uid() here to avoid fatal() */
+		if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) != 0) {
+			error("%s: setresgid %u: %s", tag, (u_int)pw->pw_gid,
+			    strerror(errno));
+			_exit(1);
+		}
+		if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) != 0) {
+			error("%s: setresuid %u: %s", tag, (u_int)pw->pw_uid,
+			    strerror(errno));
+			_exit(1);
+		}
+		/* stdin is pointed to /dev/null at this point */
+		if ((flags & SSH_SUBPROCESS_STDOUT_DISCARD) != 0 &&
+		    dup2(STDIN_FILENO, STDERR_FILENO) == -1) {
+			error("%s: dup2: %s", tag, strerror(errno));
+			_exit(1);
+		}
+
+		execve(av[0], av, child_env);
+		error("%s exec \"%s\": %s", tag, command, strerror(errno));
+		_exit(127);
+	default: /* parent */
+		break;
+	}
+
+	close(p[1]);
+	if ((flags & SSH_SUBPROCESS_STDOUT_CAPTURE) == 0)
+		close(p[0]);
+	else if ((f = fdopen(p[0], "r")) == NULL) {
+		error("%s: fdopen: %s", tag, strerror(errno));
+		close(p[0]);
+		/* Don't leave zombie child */
+		kill(pid, SIGTERM);
+		while (waitpid(pid, NULL, 0) == -1 && errno == EINTR)
+			;
+		return 0;
+	}
+	/* Success */
+	debug3("%s: %s pid %ld", __func__, tag, (long)pid);
+	if (child != NULL)
+		*child = f;
+	return pid;
+}
+
+/* These functions link key/cert options to the auth framework */
+
+/* Log sshauthopt options locally and (optionally) for remote transmission */
+void
+auth_log_authopts(const char *loc, const struct sshauthopt *opts, int do_remote)
+{
+	int do_env = options.permit_user_env && opts->nenv > 0;
+	int do_permitopen = opts->npermitopen > 0 &&
+	    (options.allow_tcp_forwarding & FORWARD_LOCAL) != 0;
+	int do_permitlisten = opts->npermitlisten > 0 &&
+	    (options.allow_tcp_forwarding & FORWARD_REMOTE) != 0;
+	size_t i;
+	char msg[1024], buf[64];
+
+	snprintf(buf, sizeof(buf), "%d", opts->force_tun_device);
+	/* Try to keep this alphabetically sorted */
+	snprintf(msg, sizeof(msg), "key options:%s%s%s%s%s%s%s%s%s%s%s%s%s",
+	    opts->permit_agent_forwarding_flag ? " agent-forwarding" : "",
+	    opts->force_command == NULL ? "" : " command",
+	    do_env ?  " environment" : "",
+	    opts->valid_before == 0 ? "" : "expires",
+	    do_permitopen ?  " permitopen" : "",
+	    do_permitlisten ?  " permitlisten" : "",
+	    opts->permit_port_forwarding_flag ? " port-forwarding" : "",
+	    opts->cert_principals == NULL ? "" : " principals",
+	    opts->permit_pty_flag ? " pty" : "",
+	    opts->force_tun_device == -1 ? "" : " tun=",
+	    opts->force_tun_device == -1 ? "" : buf,
+	    opts->permit_user_rc ? " user-rc" : "",
+	    opts->permit_x11_forwarding_flag ? " x11-forwarding" : "");
+
+	debug("%s: %s", loc, msg);
+	if (do_remote)
+		auth_debug_add("%s: %s", loc, msg);
+
+	if (options.permit_user_env) {
+		for (i = 0; i < opts->nenv; i++) {
+			debug("%s: environment: %s", loc, opts->env[i]);
+			if (do_remote) {
+				auth_debug_add("%s: environment: %s",
+				    loc, opts->env[i]);
+			}
+		}
+	}
+
+	/* Go into a little more details for the local logs. */
+	if (opts->valid_before != 0) {
+		format_absolute_time(opts->valid_before, buf, sizeof(buf));
+		debug("%s: expires at %s", loc, buf);
+	}
+	if (opts->cert_principals != NULL) {
+		debug("%s: authorized principals: \"%s\"",
+		    loc, opts->cert_principals);
+	}
+	if (opts->force_command != NULL)
+		debug("%s: forced command: \"%s\"", loc, opts->force_command);
+	if (do_permitopen) {
+		for (i = 0; i < opts->npermitopen; i++) {
+			debug("%s: permitted open: %s",
+			    loc, opts->permitopen[i]);
+		}
+	}
+	if (do_permitlisten) {
+		for (i = 0; i < opts->npermitlisten; i++) {
+			debug("%s: permitted listen: %s",
+			    loc, opts->permitlisten[i]);
+		}
+	}
+}
+
+/* Activate a new set of key/cert options; merging with what is there. */
+int
+auth_activate_options(struct ssh *ssh, struct sshauthopt *opts)
+{
+	struct sshauthopt *old = auth_opts;
+	const char *emsg = NULL;
+
+	debug("%s: setting new authentication options", __func__);
+	if ((auth_opts = sshauthopt_merge(old, opts, &emsg)) == NULL) {
+		error("Inconsistent authentication options: %s", emsg);
+		return -1;
+	}
+	return 0;
+}
+
+/* Disable forwarding, etc for the session */
+void
+auth_restrict_session(struct ssh *ssh)
+{
+	struct sshauthopt *restricted;
+
+	debug("%s: restricting session", __func__);
+
+	/* A blank sshauthopt defaults to permitting nothing */
+	restricted = sshauthopt_new();
+	restricted->permit_pty_flag = 1;
+	restricted->restricted = 1;
+
+	if (auth_activate_options(ssh, restricted) != 0)
+		fatal("%s: failed to restrict session", __func__);
+	sshauthopt_free(restricted);
+}
+
+int
+auth_authorise_keyopts(struct ssh *ssh, struct passwd *pw,
+    struct sshauthopt *opts, int allow_cert_authority, const char *loc)
+{
+	const char *remote_ip = ssh_remote_ipaddr(ssh);
+	const char *remote_host = auth_get_canonical_hostname(ssh,
+	    options.use_dns);
+	time_t now = time(NULL);
+	char buf[64];
+
+	/*
+	 * Check keys/principals file expiry time.
+	 * NB. validity interval in certificate is handled elsewhere.
+	 */
+	if (opts->valid_before && now > 0 &&
+	    opts->valid_before < (uint64_t)now) {
+		format_absolute_time(opts->valid_before, buf, sizeof(buf));
+		debug("%s: entry expired at %s", loc, buf);
+		auth_debug_add("%s: entry expired at %s", loc, buf);
+		return -1;
+	}
+	/* Consistency checks */
+	if (opts->cert_principals != NULL && !opts->cert_authority) {
+		debug("%s: principals on non-CA key", loc);
+		auth_debug_add("%s: principals on non-CA key", loc);
+		/* deny access */
+		return -1;
+	}
+	/* cert-authority flag isn't valid in authorized_principals files */
+	if (!allow_cert_authority && opts->cert_authority) {
+		debug("%s: cert-authority flag invalid here", loc);
+		auth_debug_add("%s: cert-authority flag invalid here", loc);
+		/* deny access */
+		return -1;
+	}
+
+	/* Perform from= checks */
+	if (opts->required_from_host_keys != NULL) {
+		switch (match_host_and_ip(remote_host, remote_ip,
+		    opts->required_from_host_keys )) {
+		case 1:
+			/* Host name matches. */
+			break;
+		case -1:
+		default:
+			debug("%s: invalid from criteria", loc);
+			auth_debug_add("%s: invalid from criteria", loc);
+			/* FALLTHROUGH */
+		case 0:
+			logit("%s: Authentication tried for %.100s with "
+			    "correct key but not from a permitted "
+			    "host (host=%.200s, ip=%.200s, required=%.200s).",
+			    loc, pw->pw_name, remote_host, remote_ip,
+			    opts->required_from_host_keys);
+			auth_debug_add("%s: Your host '%.200s' is not "
+			    "permitted to use this key for login.",
+			    loc, remote_host);
+			/* deny access */
+			return -1;
+		}
+	}
+	/* Check source-address restriction from certificate */
+	if (opts->required_from_host_cert != NULL) {
+		switch (addr_match_cidr_list(remote_ip,
+		    opts->required_from_host_cert)) {
+		case 1:
+			/* accepted */
+			break;
+		case -1:
+		default:
+			/* invalid */
+			error("%s: Certificate source-address invalid",
+			    loc);
+			/* FALLTHROUGH */
+		case 0:
+			logit("%s: Authentication tried for %.100s with valid "
+			    "certificate but not from a permitted source "
+			    "address (%.200s).", loc, pw->pw_name, remote_ip);
+			auth_debug_add("%s: Your address '%.200s' is not "
+			    "permitted to use this certificate for login.",
+			    loc, remote_ip);
+			return -1;
+		}
+	}
+	/*
+	 *
+	 * XXX this is spammy. We should report remotely only for keys
+	 *     that are successful in actual auth attempts, and not PK_OK
+	 *     tests.
+	 */
+	auth_log_authopts(loc, opts, 1);
+
+	return 0;
+}
diff --git a/auth.h b/auth.h
index 338a62d..977562f 100644
--- a/auth.h
+++ b/auth.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth.h,v 1.89 2016/08/13 17:47:41 markus Exp $ */
+/* $OpenBSD: auth.h,v 1.96 2018/04/10 00:10:49 djm Exp $ */
 
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
@@ -42,8 +42,11 @@
 #include <krb5.h>
 #endif
 
+struct passwd;
 struct ssh;
+struct sshbuf;
 struct sshkey;
+struct sshauthopt;
 
 typedef struct Authctxt Authctxt;
 typedef struct Authmethod Authmethod;
@@ -62,13 +65,17 @@
 	char		*service;
 	struct passwd	*pw;		/* set if 'valid' */
 	char		*style;
+
+	/* Method lists for multiple authentication */
+	char		**auth_methods;	/* modified from server config */
+	u_int		 num_auth_methods;
+
+	/* Authentication method-specific data */
+	void		*methoddata;
 	void		*kbdintctxt;
-	char		*info;		/* Extra info for next auth_log */
 #ifdef BSD_AUTH
 	auth_session_t	*as;
 #endif
-	char		**auth_methods;	/* modified from server config */
-	u_int		 num_auth_methods;
 #ifdef KRB5
 	krb5_context	 krb5_ctx;
 	krb5_ccache	 krb5_fwd_ccache;
@@ -76,12 +83,20 @@
 	char		*krb5_ticket_file;
 	char		*krb5_ccname;
 #endif
-	Buffer		*loginmsg;
-	void		*methoddata;
+	struct sshbuf	*loginmsg;
 
-	struct sshkey	**prev_userkeys;
-	u_int		 nprev_userkeys;
+	/* Authentication keys already used; these will be refused henceforth */
+	struct sshkey	**prev_keys;
+	u_int		 nprev_keys;
+
+	/* Last used key and ancillary information from active auth method */
+	struct sshkey	*auth_method_key;
+	char		*auth_method_info;
+
+	/* Information exposed to session */
+	struct sshbuf	*session_info;	/* Auth info for environment */
 };
+
 /*
  * Every authentication method has to handle authentication requests for
  * non-existing users, or for users that are not allowed to login. In this
@@ -91,7 +106,7 @@
 
 struct Authmethod {
 	char	*name;
-	int	(*userauth)(Authctxt *authctxt);
+	int	(*userauth)(struct ssh *);
 	int	*enabled;
 };
 
@@ -115,18 +130,24 @@
 int
 auth_rhosts2(struct passwd *, const char *, const char *, const char *);
 
-int      auth_password(Authctxt *, const char *);
+int      auth_password(struct ssh *, const char *);
 
-int	 hostbased_key_allowed(struct passwd *, const char *, char *, Key *);
-int	 user_key_allowed(struct passwd *, Key *, int);
-void	 pubkey_auth_info(Authctxt *, const Key *, const char *, ...)
-	    __attribute__((__format__ (printf, 3, 4)));
-void	 auth2_record_userkey(Authctxt *, struct sshkey *);
-int	 auth2_userkey_already_used(Authctxt *, struct sshkey *);
+int	 hostbased_key_allowed(struct passwd *, const char *, char *,
+	    struct sshkey *);
+int	 user_key_allowed(struct ssh *, struct passwd *, struct sshkey *, int,
+    struct sshauthopt **);
+int	 auth2_key_already_used(Authctxt *, const struct sshkey *);
 
-struct stat;
-int	 auth_secure_path(const char *, struct stat *, const char *, uid_t,
-    char *, size_t);
+/*
+ * Handling auth method-specific information for logging and prevention
+ * of key reuse during multiple authentication.
+ */
+void	 auth2_authctxt_reset_info(Authctxt *);
+void	 auth2_record_key(Authctxt *, int, const struct sshkey *);
+void	 auth2_record_info(Authctxt *authctxt, const char *, ...)
+	    __attribute__((__format__ (printf, 2, 3)))
+	    __attribute__((__nonnull__ (2)));
+void	 auth2_update_session_info(Authctxt *, const char *, const char *);
 
 #ifdef KRB5
 int	auth_krb5(Authctxt *authctxt, krb5_data *auth, char **client, krb5_data *);
@@ -145,17 +166,12 @@
 #include "audit.h"
 void remove_kbdint_device(const char *);
 
-void disable_forwarding(void);
-
 void	do_authentication2(Authctxt *);
 
-void	auth_info(Authctxt *authctxt, const char *, ...)
-	    __attribute__((__format__ (printf, 2, 3)))
-	    __attribute__((__nonnull__ (2)));
 void	auth_log(Authctxt *, int, int, const char *, const char *);
 void	auth_maxtries_exceeded(Authctxt *) __attribute__((noreturn));
-void	userauth_finish(Authctxt *, int, const char *, const char *);
-int	auth_root_allowed(const char *);
+void	userauth_finish(struct ssh *, int, const char *, const char *);
+int	auth_root_allowed(struct ssh *, const char *);
 
 void	userauth_send_banner(const char *);
 
@@ -167,12 +183,10 @@
 
 void	privsep_challenge_enable(void);
 
-int	auth2_challenge(Authctxt *, char *);
-void	auth2_challenge_stop(Authctxt *);
+int	auth2_challenge(struct ssh *, char *);
+void	auth2_challenge_stop(struct ssh *);
 int	bsdauth_query(void *, char **, char **, u_int *, char ***, u_int **);
 int	bsdauth_respond(void *, u_int, char **);
-int	skey_query(void *, char **, char **, u_int *, char ***, u_int **);
-int	skey_respond(void *, u_int, char **);
 
 int	allowed_user(struct passwd *);
 struct passwd * getpwnamallow(const char *user);
@@ -182,33 +196,46 @@
 
 FILE	*auth_openkeyfile(const char *, struct passwd *, int);
 FILE	*auth_openprincipals(const char *, struct passwd *, int);
-int	 auth_key_is_revoked(Key *);
+int	 auth_key_is_revoked(struct sshkey *);
 
 const char	*auth_get_canonical_hostname(struct ssh *, int);
 
 HostStatus
-check_key_in_hostfiles(struct passwd *, Key *, const char *,
+check_key_in_hostfiles(struct passwd *, struct sshkey *, const char *,
     const char *, const char *);
 
 /* hostkey handling */
-Key	*get_hostkey_by_index(int);
-Key	*get_hostkey_public_by_index(int, struct ssh *);
-Key	*get_hostkey_public_by_type(int, int, struct ssh *);
-Key	*get_hostkey_private_by_type(int, int, struct ssh *);
-int	 get_hostkey_index(Key *, int, struct ssh *);
-int	 sshd_hostkey_sign(Key *, Key *, u_char **, size_t *,
-	     const u_char *, size_t, const char *, u_int);
+struct sshkey	*get_hostkey_by_index(int);
+struct sshkey	*get_hostkey_public_by_index(int, struct ssh *);
+struct sshkey	*get_hostkey_public_by_type(int, int, struct ssh *);
+struct sshkey	*get_hostkey_private_by_type(int, int, struct ssh *);
+int	 get_hostkey_index(struct sshkey *, int, struct ssh *);
+int	 sshd_hostkey_sign(struct sshkey *, struct sshkey *, u_char **,
+	     size_t *, const u_char *, size_t, const char *, u_int);
+
+/* Key / cert options linkage to auth layer */
+const struct sshauthopt *auth_options(struct ssh *);
+int	 auth_activate_options(struct ssh *, struct sshauthopt *);
+void	 auth_restrict_session(struct ssh *);
+int	 auth_authorise_keyopts(struct ssh *, struct passwd *pw,
+    struct sshauthopt *, int, const char *);
+void	 auth_log_authopts(const char *, const struct sshauthopt *, int);
 
 /* debug messages during authentication */
-void	 auth_debug_add(const char *fmt,...) __attribute__((format(printf, 1, 2)));
+void	 auth_debug_add(const char *fmt,...)
+    __attribute__((format(printf, 1, 2)));
 void	 auth_debug_send(void);
 void	 auth_debug_reset(void);
 
 struct passwd *fakepw(void);
 
-int	 sys_auth_passwd(Authctxt *, const char *);
+#define	SSH_SUBPROCESS_STDOUT_DISCARD  (1)     /* Discard stdout */
+#define	SSH_SUBPROCESS_STDOUT_CAPTURE  (1<<1)  /* Redirect stdout */
+#define	SSH_SUBPROCESS_STDERR_DISCARD  (1<<2)  /* Discard stderr */
+pid_t	subprocess(const char *, struct passwd *,
+    const char *, int, char **, FILE **, u_int flags);
 
-#define SKEY_PROMPT "\nS/Key Password: "
+int	 sys_auth_passwd(struct ssh *, const char *);
 
 #if defined(KRB5) && !defined(HEIMDAL)
 #include <krb5.h>
diff --git a/auth2-chall.c b/auth2-chall.c
index ead4803..2d5cff4 100644
--- a/auth2-chall.c
+++ b/auth2-chall.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-chall.c,v 1.44 2016/05/02 08:49:03 djm Exp $ */
+/* $OpenBSD: auth2-chall.c,v 1.50 2018/07/11 18:55:11 markus Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2001 Per Allansson.  All rights reserved.
@@ -34,12 +34,13 @@
 
 #include "xmalloc.h"
 #include "ssh2.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "packet.h"
 #include "dispatch.h"
+#include "ssherr.h"
 #include "log.h"
 #include "misc.h"
 #include "servconf.h"
@@ -47,9 +48,9 @@
 /* import */
 extern ServerOptions options;
 
-static int auth2_challenge_start(Authctxt *);
-static int send_userauth_info_request(Authctxt *);
-static int input_userauth_info_response(int, u_int32_t, void *);
+static int auth2_challenge_start(struct ssh *);
+static int send_userauth_info_request(struct ssh *);
+static int input_userauth_info_response(int, u_int32_t, struct ssh *);
 
 #ifdef BSD_AUTH
 extern KbdintDevice bsdauth_device;
@@ -57,9 +58,6 @@
 #ifdef USE_PAM
 extern KbdintDevice sshpam_device;
 #endif
-#ifdef SKEY
-extern KbdintDevice skey_device;
-#endif
 #endif
 
 KbdintDevice *devices[] = {
@@ -69,9 +67,6 @@
 #ifdef USE_PAM
 	&sshpam_device,
 #endif
-#ifdef SKEY
-	&skey_device,
-#endif
 #endif
 	NULL
 };
@@ -105,8 +100,8 @@
 kbdint_alloc(const char *devs)
 {
 	KbdintAuthctxt *kbdintctxt;
-	Buffer b;
-	int i;
+	struct sshbuf *b;
+	int i, r;
 
 #ifdef USE_PAM
 	if (!options.use_pam)
@@ -115,16 +110,17 @@
 
 	kbdintctxt = xcalloc(1, sizeof(KbdintAuthctxt));
 	if (strcmp(devs, "") == 0) {
-		buffer_init(&b);
+		if ((b = sshbuf_new()) == NULL)
+			fatal("%s: sshbuf_new failed", __func__);
 		for (i = 0; devices[i]; i++) {
-			if (buffer_len(&b) > 0)
-				buffer_append(&b, ",", 1);
-			buffer_append(&b, devices[i]->name,
-			    strlen(devices[i]->name));
+			if ((r = sshbuf_putf(b, "%s%s",
+			    sshbuf_len(b) ? "," : "", devices[i]->name)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 		}
-		if ((kbdintctxt->devices = sshbuf_dup_string(&b)) == NULL)
+		if ((kbdintctxt->devices = sshbuf_dup_string(b)) == NULL)
 			fatal("%s: sshbuf_dup_string failed", __func__);
-		buffer_free(&b);
+		sshbuf_free(b);
 	} else {
 		kbdintctxt->devices = xstrdup(devs);
 	}
@@ -195,8 +191,9 @@
  * wait for the response.
  */
 int
-auth2_challenge(Authctxt *authctxt, char *devs)
+auth2_challenge(struct ssh *ssh, char *devs)
 {
+	Authctxt *authctxt = ssh->authctxt;
 	debug("auth2_challenge: user=%s devs=%s",
 	    authctxt->user ? authctxt->user : "<nouser>",
 	    devs ? devs : "<no devs>");
@@ -205,15 +202,16 @@
 		return 0;
 	if (authctxt->kbdintctxt == NULL)
 		authctxt->kbdintctxt = kbdint_alloc(devs);
-	return auth2_challenge_start(authctxt);
+	return auth2_challenge_start(ssh);
 }
 
 /* unregister kbd-int callbacks and context */
 void
-auth2_challenge_stop(Authctxt *authctxt)
+auth2_challenge_stop(struct ssh *ssh)
 {
+	Authctxt *authctxt = ssh->authctxt;
 	/* unregister callback */
-	dispatch_set(SSH2_MSG_USERAUTH_INFO_RESPONSE, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_INFO_RESPONSE, NULL);
 	if (authctxt->kbdintctxt != NULL) {
 		kbdint_free(authctxt->kbdintctxt);
 		authctxt->kbdintctxt = NULL;
@@ -222,29 +220,30 @@
 
 /* side effect: sets authctxt->postponed if a reply was sent*/
 static int
-auth2_challenge_start(Authctxt *authctxt)
+auth2_challenge_start(struct ssh *ssh)
 {
+	Authctxt *authctxt = ssh->authctxt;
 	KbdintAuthctxt *kbdintctxt = authctxt->kbdintctxt;
 
 	debug2("auth2_challenge_start: devices %s",
 	    kbdintctxt->devices ?  kbdintctxt->devices : "<empty>");
 
 	if (kbdint_next_device(authctxt, kbdintctxt) == 0) {
-		auth2_challenge_stop(authctxt);
+		auth2_challenge_stop(ssh);
 		return 0;
 	}
 	debug("auth2_challenge_start: trying authentication method '%s'",
 	    kbdintctxt->device->name);
 
 	if ((kbdintctxt->ctxt = kbdintctxt->device->init_ctx(authctxt)) == NULL) {
-		auth2_challenge_stop(authctxt);
+		auth2_challenge_stop(ssh);
 		return 0;
 	}
-	if (send_userauth_info_request(authctxt) == 0) {
-		auth2_challenge_stop(authctxt);
+	if (send_userauth_info_request(ssh) == 0) {
+		auth2_challenge_stop(ssh);
 		return 0;
 	}
-	dispatch_set(SSH2_MSG_USERAUTH_INFO_RESPONSE,
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_INFO_RESPONSE,
 	    &input_userauth_info_response);
 
 	authctxt->postponed = 1;
@@ -252,28 +251,32 @@
 }
 
 static int
-send_userauth_info_request(Authctxt *authctxt)
+send_userauth_info_request(struct ssh *ssh)
 {
+	Authctxt *authctxt = ssh->authctxt;
 	KbdintAuthctxt *kbdintctxt;
 	char *name, *instr, **prompts;
-	u_int i, *echo_on;
+	u_int r, i, *echo_on;
 
 	kbdintctxt = authctxt->kbdintctxt;
 	if (kbdintctxt->device->query(kbdintctxt->ctxt,
 	    &name, &instr, &kbdintctxt->nreq, &prompts, &echo_on))
 		return 0;
 
-	packet_start(SSH2_MSG_USERAUTH_INFO_REQUEST);
-	packet_put_cstring(name);
-	packet_put_cstring(instr);
-	packet_put_cstring("");		/* language not used */
-	packet_put_int(kbdintctxt->nreq);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_INFO_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, name)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, instr)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, "")) != 0 ||	/* language not used */
+	    (r = sshpkt_put_u32(ssh, kbdintctxt->nreq)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 	for (i = 0; i < kbdintctxt->nreq; i++) {
-		packet_put_cstring(prompts[i]);
-		packet_put_char(echo_on[i]);
+		if ((r = sshpkt_put_cstring(ssh, prompts[i])) != 0 ||
+		    (r = sshpkt_put_u8(ssh, echo_on[i])) != 0)
+			fatal("%s: %s", __func__, ssh_err(r));
 	}
-	packet_send();
-	packet_write_wait();
+	if ((r = sshpkt_send(ssh)) != 0 ||
+	    (r = ssh_packet_write_wait(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
 	for (i = 0; i < kbdintctxt->nreq; i++)
 		free(prompts[i]);
@@ -285,11 +288,12 @@
 }
 
 static int
-input_userauth_info_response(int type, u_int32_t seq, void *ctxt)
+input_userauth_info_response(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	KbdintAuthctxt *kbdintctxt;
 	int authenticated = 0, res;
+	int r;
 	u_int i, nresp;
 	const char *devicename = NULL;
 	char **response = NULL;
@@ -303,7 +307,8 @@
 		fatal("input_userauth_info_response: no device");
 
 	authctxt->postponed = 0;	/* reset */
-	nresp = packet_get_int();
+	if ((r = sshpkt_get_u32(ssh, &nresp)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 	if (nresp != kbdintctxt->nreq)
 		fatal("input_userauth_info_response: wrong number of replies");
 	if (nresp > 100)
@@ -311,9 +316,12 @@
 	if (nresp > 0) {
 		response = xcalloc(nresp, sizeof(char *));
 		for (i = 0; i < nresp; i++)
-			response[i] = packet_get_string(NULL);
+			if ((r = sshpkt_get_cstring(ssh, &response[i],
+			    NULL)) != 0)
+				fatal("%s: %s", __func__, ssh_err(r));
 	}
-	packet_check_eom();
+	if ((r = sshpkt_get_end(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
 	res = kbdintctxt->device->respond(kbdintctxt->ctxt, nresp, response);
 
@@ -330,7 +338,7 @@
 		break;
 	case 1:
 		/* Authentication needs further interaction */
-		if (send_userauth_info_request(authctxt) == 1)
+		if (send_userauth_info_request(ssh) == 1)
 			authctxt->postponed = 1;
 		break;
 	default:
@@ -340,14 +348,14 @@
 	devicename = kbdintctxt->device->name;
 	if (!authctxt->postponed) {
 		if (authenticated) {
-			auth2_challenge_stop(authctxt);
+			auth2_challenge_stop(ssh);
 		} else {
 			/* start next device */
 			/* may set authctxt->postponed */
-			auth2_challenge_start(authctxt);
+			auth2_challenge_start(ssh);
 		}
 	}
-	userauth_finish(authctxt, authenticated, "keyboard-interactive",
+	userauth_finish(ssh, authenticated, "keyboard-interactive",
 	    devicename);
 	return 0;
 }
@@ -355,7 +363,7 @@
 void
 privsep_challenge_enable(void)
 {
-#if defined(BSD_AUTH) || defined(USE_PAM) || defined(SKEY)
+#if defined(BSD_AUTH) || defined(USE_PAM)
 	int n = 0;
 #endif
 #ifdef BSD_AUTH
@@ -364,9 +372,6 @@
 #ifdef USE_PAM
 	extern KbdintDevice mm_sshpam_device;
 #endif
-#ifdef SKEY
-	extern KbdintDevice mm_skey_device;
-#endif
 
 #ifdef BSD_AUTH
 	devices[n++] = &mm_bsdauth_device;
@@ -374,8 +379,5 @@
 #ifdef USE_PAM
 	devices[n++] = &mm_sshpam_device;
 #endif
-#ifdef SKEY
-	devices[n++] = &mm_skey_device;
-#endif
 #endif
 }
diff --git a/auth2-gss.c b/auth2-gss.c
index 1ca8357..9351e04 100644
--- a/auth2-gss.c
+++ b/auth2-gss.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-gss.c,v 1.22 2015/01/19 20:07:45 markus Exp $ */
+/* $OpenBSD: auth2-gss.c,v 1.29 2018/07/31 03:10:27 djm Exp $ */
 
 /*
  * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
@@ -33,13 +33,14 @@
 #include <stdarg.h>
 
 #include "xmalloc.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "ssh2.h"
 #include "log.h"
 #include "dispatch.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 #include "misc.h"
 #include "servconf.h"
 #include "packet.h"
@@ -48,30 +49,30 @@
 
 extern ServerOptions options;
 
-static int input_gssapi_token(int type, u_int32_t plen, void *ctxt);
-static int input_gssapi_mic(int type, u_int32_t plen, void *ctxt);
-static int input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt);
-static int input_gssapi_errtok(int, u_int32_t, void *);
+static int input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh);
+static int input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh);
+static int input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh);
+static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
 
 /*
  * We only support those mechanisms that we know about (ie ones that we know
  * how to check local user kuserok and the like)
  */
 static int
-userauth_gssapi(Authctxt *authctxt)
+userauth_gssapi(struct ssh *ssh)
 {
+	Authctxt *authctxt = ssh->authctxt;
 	gss_OID_desc goid = {0, NULL};
 	Gssctxt *ctxt = NULL;
-	int mechs;
-	int present;
+	int r, present;
+	u_int mechs;
 	OM_uint32 ms;
-	u_int len;
+	size_t len;
 	u_char *doid = NULL;
 
-	if (!authctxt->valid || authctxt->user == NULL)
-		return (0);
+	if ((r = sshpkt_get_u32(ssh, &mechs)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
-	mechs = packet_get_int();
 	if (mechs == 0) {
 		debug("Mechanism negotiation is not supported");
 		return (0);
@@ -83,7 +84,8 @@
 		free(doid);
 
 		present = 0;
-		doid = packet_get_string(&len);
+		if ((r = sshpkt_get_string(ssh, &doid, &len)) != 0)
+			fatal("%s: %s", __func__, ssh_err(r));
 
 		if (len > 2 && doid[0] == SSH_GSS_OIDTYPE &&
 		    doid[1] == len - 2) {
@@ -101,6 +103,12 @@
 		return (0);
 	}
 
+	if (!authctxt->valid || authctxt->user == NULL) {
+		debug2("%s: disabled because of invalid user", __func__);
+		free(doid);
+		return (0);
+	}
+
 	if (GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctxt, &goid)))) {
 		if (ctxt != NULL)
 			ssh_gssapi_delete_ctx(&ctxt);
@@ -111,67 +119,76 @@
 
 	authctxt->methoddata = (void *)ctxt;
 
-	packet_start(SSH2_MSG_USERAUTH_GSSAPI_RESPONSE);
-
 	/* Return the OID that we received */
-	packet_put_string(doid, len);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_GSSAPI_RESPONSE)) != 0 ||
+	    (r = sshpkt_put_string(ssh, doid, len)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
-	packet_send();
 	free(doid);
 
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, &input_gssapi_token);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, &input_gssapi_errtok);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, &input_gssapi_token);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, &input_gssapi_errtok);
 	authctxt->postponed = 1;
 
 	return (0);
 }
 
 static int
-input_gssapi_token(int type, u_int32_t plen, void *ctxt)
+input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	Gssctxt *gssctxt;
 	gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
 	gss_buffer_desc recv_tok;
 	OM_uint32 maj_status, min_status, flags;
-	u_int len;
+	u_char *p;
+	size_t len;
+	int r;
 
 	if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
 		fatal("No authentication or GSSAPI context");
 
 	gssctxt = authctxt->methoddata;
-	recv_tok.value = packet_get_string(&len);
-	recv_tok.length = len; /* u_int vs. size_t */
+	if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
-	packet_check_eom();
-
+	recv_tok.value = p;
+	recv_tok.length = len;
 	maj_status = PRIVSEP(ssh_gssapi_accept_ctx(gssctxt, &recv_tok,
 	    &send_tok, &flags));
 
-	free(recv_tok.value);
+	free(p);
 
 	if (GSS_ERROR(maj_status)) {
 		if (send_tok.length != 0) {
-			packet_start(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK);
-			packet_put_string(send_tok.value, send_tok.length);
-			packet_send();
+			if ((r = sshpkt_start(ssh,
+			    SSH2_MSG_USERAUTH_GSSAPI_ERRTOK)) != 0 ||
+			    (r = sshpkt_put_string(ssh, send_tok.value,
+			    send_tok.length)) != 0 ||
+			    (r = sshpkt_send(ssh)) != 0)
+				fatal("%s: %s", __func__, ssh_err(r));
 		}
 		authctxt->postponed = 0;
-		dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
-		userauth_finish(authctxt, 0, "gssapi-with-mic", NULL);
+		ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
+		userauth_finish(ssh, 0, "gssapi-with-mic", NULL);
 	} else {
 		if (send_tok.length != 0) {
-			packet_start(SSH2_MSG_USERAUTH_GSSAPI_TOKEN);
-			packet_put_string(send_tok.value, send_tok.length);
-			packet_send();
+			if ((r = sshpkt_start(ssh,
+			    SSH2_MSG_USERAUTH_GSSAPI_TOKEN)) != 0 ||
+			    (r = sshpkt_put_string(ssh, send_tok.value,
+			    send_tok.length)) != 0 ||
+			    (r = sshpkt_send(ssh)) != 0)
+				fatal("%s: %s", __func__, ssh_err(r));
 		}
 		if (maj_status == GSS_S_COMPLETE) {
-			dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
+			ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
 			if (flags & GSS_C_INTEG_FLAG)
-				dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_MIC,
+				ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_MIC,
 				    &input_gssapi_mic);
 			else
-				dispatch_set(
+				ssh_dispatch_set(ssh,
 				    SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE,
 				    &input_gssapi_exchange_complete);
 		}
@@ -182,24 +199,27 @@
 }
 
 static int
-input_gssapi_errtok(int type, u_int32_t plen, void *ctxt)
+input_gssapi_errtok(int type, u_int32_t plen, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	Gssctxt *gssctxt;
 	gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
 	gss_buffer_desc recv_tok;
 	OM_uint32 maj_status;
-	u_int len;
+	int r;
+	u_char *p;
+	size_t len;
 
 	if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
 		fatal("No authentication or GSSAPI context");
 
 	gssctxt = authctxt->methoddata;
-	recv_tok.value = packet_get_string(&len);
+	if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
+	recv_tok.value = p;
 	recv_tok.length = len;
 
-	packet_check_eom();
-
 	/* Push the error token into GSSAPI to see what it says */
 	maj_status = PRIVSEP(ssh_gssapi_accept_ctx(gssctxt, &recv_tok,
 	    &send_tok, NULL));
@@ -207,8 +227,8 @@
 	free(recv_tok.value);
 
 	/* We can't return anything to the client, even if we wanted to */
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL);
 
 	/* The client will have already moved on to the next auth */
 
@@ -223,10 +243,11 @@
  */
 
 static int
-input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt)
+input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
-	int authenticated;
+	Authctxt *authctxt = ssh->authctxt;
+	int r, authenticated;
+	const char *displayname;
 
 	if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
 		fatal("No authentication or GSSAPI context");
@@ -236,57 +257,72 @@
 	 * the dispatcher once the exchange is complete
 	 */
 
-	packet_check_eom();
+	if ((r = sshpkt_get_end(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
 	authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
 
+	if ((!use_privsep || mm_is_monitor()) &&
+	    (displayname = ssh_gssapi_displayname()) != NULL)
+		auth2_record_info(authctxt, "%s", displayname);
+
 	authctxt->postponed = 0;
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_MIC, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);
-	userauth_finish(authctxt, authenticated, "gssapi-with-mic", NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_MIC, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);
+	userauth_finish(ssh, authenticated, "gssapi-with-mic", NULL);
 	return 0;
 }
 
 static int
-input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
+input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	Gssctxt *gssctxt;
-	int authenticated = 0;
-	Buffer b;
+	int r, authenticated = 0;
+	struct sshbuf *b;
 	gss_buffer_desc mic, gssbuf;
-	u_int len;
+	const char *displayname;
+	u_char *p;
+	size_t len;
 
 	if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
 		fatal("No authentication or GSSAPI context");
 
 	gssctxt = authctxt->methoddata;
 
-	mic.value = packet_get_string(&len);
+	if ((r = sshpkt_get_string(ssh, &p, &len)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mic.value = p;
 	mic.length = len;
-
-	ssh_gssapi_buildmic(&b, authctxt->user, authctxt->service,
+	ssh_gssapi_buildmic(b, authctxt->user, authctxt->service,
 	    "gssapi-with-mic");
 
-	gssbuf.value = buffer_ptr(&b);
-	gssbuf.length = buffer_len(&b);
+	if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL)
+		fatal("%s: sshbuf_mutable_ptr failed", __func__);
+	gssbuf.length = sshbuf_len(b);
 
 	if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic))))
 		authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
 	else
 		logit("GSSAPI MIC check failed");
 
-	buffer_free(&b);
+	sshbuf_free(b);
 	free(mic.value);
 
+	if ((!use_privsep || mm_is_monitor()) &&
+	    (displayname = ssh_gssapi_displayname()) != NULL)
+		auth2_record_info(authctxt, "%s", displayname);
+
 	authctxt->postponed = 0;
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_MIC, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);
-	userauth_finish(authctxt, authenticated, "gssapi-with-mic", NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_MIC, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);
+	userauth_finish(ssh, authenticated, "gssapi-with-mic", NULL);
 	return 0;
 }
 
diff --git a/auth2-hostbased.c b/auth2-hostbased.c
index 1b3c3b2..3593932 100644
--- a/auth2-hostbased.c
+++ b/auth2-hostbased.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-hostbased.c,v 1.26 2016/03/07 19:02:43 djm Exp $ */
+/* $OpenBSD: auth2-hostbased.c,v 1.36 2018/07/31 03:10:27 djm Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -34,12 +34,12 @@
 #include "xmalloc.h"
 #include "ssh2.h"
 #include "packet.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "log.h"
 #include "misc.h"
 #include "servconf.h"
 #include "compat.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "canohost.h"
@@ -48,6 +48,7 @@
 #endif
 #include "monitor_wrap.h"
 #include "pathnames.h"
+#include "ssherr.h"
 #include "match.h"
 
 /* import */
@@ -56,97 +57,99 @@
 extern u_int session_id2_len;
 
 static int
-userauth_hostbased(Authctxt *authctxt)
+userauth_hostbased(struct ssh *ssh)
 {
-	Buffer b;
-	Key *key = NULL;
-	char *pkalg, *cuser, *chost, *service;
+	Authctxt *authctxt = ssh->authctxt;
+	struct sshbuf *b;
+	struct sshkey *key = NULL;
+	char *pkalg, *cuser, *chost;
 	u_char *pkblob, *sig;
-	u_int alen, blen, slen;
-	int pktype;
-	int authenticated = 0;
+	size_t alen, blen, slen;
+	int r, pktype, authenticated = 0;
 
-	if (!authctxt->valid) {
-		debug2("userauth_hostbased: disabled because of invalid user");
-		return 0;
-	}
-	pkalg = packet_get_string(&alen);
-	pkblob = packet_get_string(&blen);
-	chost = packet_get_string(NULL);
-	cuser = packet_get_string(NULL);
-	sig = packet_get_string(&slen);
+	/* XXX use sshkey_froms() */
+	if ((r = sshpkt_get_cstring(ssh, &pkalg, &alen)) != 0 ||
+	    (r = sshpkt_get_string(ssh, &pkblob, &blen)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &chost, NULL)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &cuser, NULL)) != 0 ||
+	    (r = sshpkt_get_string(ssh, &sig, &slen)) != 0)
+		fatal("%s: packet parsing: %s", __func__, ssh_err(r));
 
-	debug("userauth_hostbased: cuser %s chost %s pkalg %s slen %d",
+	debug("%s: cuser %s chost %s pkalg %s slen %zu", __func__,
 	    cuser, chost, pkalg, slen);
 #ifdef DEBUG_PK
 	debug("signature:");
-	buffer_init(&b);
-	buffer_append(&b, sig, slen);
-	buffer_dump(&b);
-	buffer_free(&b);
+	sshbuf_dump_data(sig, siglen, stderr);
 #endif
-	pktype = key_type_from_name(pkalg);
+	pktype = sshkey_type_from_name(pkalg);
 	if (pktype == KEY_UNSPEC) {
 		/* this is perfectly legal */
-		logit("userauth_hostbased: unsupported "
-		    "public key algorithm: %s", pkalg);
+		logit("%s: unsupported public key algorithm: %s",
+		    __func__, pkalg);
 		goto done;
 	}
-	key = key_from_blob(pkblob, blen);
+	if ((r = sshkey_from_blob(pkblob, blen, &key)) != 0) {
+		error("%s: key_from_blob: %s", __func__, ssh_err(r));
+		goto done;
+	}
 	if (key == NULL) {
-		error("userauth_hostbased: cannot decode key: %s", pkalg);
+		error("%s: cannot decode key: %s", __func__, pkalg);
 		goto done;
 	}
 	if (key->type != pktype) {
-		error("userauth_hostbased: type mismatch for decoded key "
-		    "(received %d, expected %d)", key->type, pktype);
+		error("%s: type mismatch for decoded key "
+		    "(received %d, expected %d)", __func__, key->type, pktype);
 		goto done;
 	}
-	if (key_type_plain(key->type) == KEY_RSA &&
-	    (datafellows & SSH_BUG_RSASIGMD5) != 0) {
+	if (sshkey_type_plain(key->type) == KEY_RSA &&
+	    (ssh->compat & SSH_BUG_RSASIGMD5) != 0) {
 		error("Refusing RSA key because peer uses unsafe "
 		    "signature format");
 		goto done;
 	}
-	if (match_pattern_list(sshkey_ssh_name(key),
-	    options.hostbased_key_types, 0) != 1) {
+	if (match_pattern_list(pkalg, options.hostbased_key_types, 0) != 1) {
 		logit("%s: key type %s not in HostbasedAcceptedKeyTypes",
 		    __func__, sshkey_type(key));
 		goto done;
 	}
 
-	service = datafellows & SSH_BUG_HBSERVICE ? "ssh-userauth" :
-	    authctxt->service;
-	buffer_init(&b);
-	buffer_put_string(&b, session_id2, session_id2_len);
+	if (!authctxt->valid || authctxt->user == NULL) {
+		debug2("%s: disabled because of invalid user", __func__);
+		goto done;
+	}
+
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	/* reconstruct packet */
-	buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
-	buffer_put_cstring(&b, authctxt->user);
-	buffer_put_cstring(&b, service);
-	buffer_put_cstring(&b, "hostbased");
-	buffer_put_string(&b, pkalg, alen);
-	buffer_put_string(&b, pkblob, blen);
-	buffer_put_cstring(&b, chost);
-	buffer_put_cstring(&b, cuser);
+	if ((r = sshbuf_put_string(b, session_id2, session_id2_len)) != 0 ||
+	    (r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshbuf_put_cstring(b, authctxt->user)) != 0 ||
+	    (r = sshbuf_put_cstring(b, authctxt->service)) != 0 ||
+	    (r = sshbuf_put_cstring(b, "hostbased")) != 0 ||
+	    (r = sshbuf_put_string(b, pkalg, alen)) != 0 ||
+	    (r = sshbuf_put_string(b, pkblob, blen)) != 0 ||
+	    (r = sshbuf_put_cstring(b, chost)) != 0 ||
+	    (r = sshbuf_put_cstring(b, cuser)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 #ifdef DEBUG_PK
-	buffer_dump(&b);
+	sshbuf_dump(b, stderr);
 #endif
 
-	pubkey_auth_info(authctxt, key,
+	auth2_record_info(authctxt,
 	    "client user \"%.100s\", client host \"%.100s\"", cuser, chost);
 
 	/* test for allowed key and correct signature */
 	authenticated = 0;
 	if (PRIVSEP(hostbased_key_allowed(authctxt->pw, cuser, chost, key)) &&
-	    PRIVSEP(key_verify(key, sig, slen, buffer_ptr(&b),
-			buffer_len(&b))) == 1)
+	    PRIVSEP(sshkey_verify(key, sig, slen,
+	    sshbuf_ptr(b), sshbuf_len(b), pkalg, ssh->compat)) == 0)
 		authenticated = 1;
 
-	buffer_free(&b);
+	auth2_record_key(authctxt, authenticated, key);
+	sshbuf_free(b);
 done:
-	debug2("userauth_hostbased: authenticated %d", authenticated);
-	if (key != NULL)
-		key_free(key);
+	debug2("%s: authenticated %d", __func__, authenticated);
+	sshkey_free(key);
 	free(pkalg);
 	free(pkblob);
 	free(cuser);
@@ -158,7 +161,7 @@
 /* return 1 if given hostkey is allowed */
 int
 hostbased_key_allowed(struct passwd *pw, const char *cuser, char *chost,
-    Key *key)
+    struct sshkey *key)
 {
 	struct ssh *ssh = active_state; /* XXX */
 	const char *resolvedname, *ipaddr, *lookup, *reason;
@@ -203,8 +206,8 @@
 	}
 	debug2("%s: access allowed by auth_rhosts2", __func__);
 
-	if (key_is_cert(key) && 
-	    key_cert_check_authority(key, 1, 0, lookup, &reason)) {
+	if (sshkey_is_cert(key) &&
+	    sshkey_cert_check_authority(key, 1, 0, lookup, &reason)) {
 		error("%s", reason);
 		auth_debug_add("%s", reason);
 		return 0;
@@ -223,20 +226,20 @@
 	}
 
 	if (host_status == HOST_OK) {
-		if (key_is_cert(key)) {
+		if (sshkey_is_cert(key)) {
 			if ((fp = sshkey_fingerprint(key->cert->signature_key,
 			    options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
 				fatal("%s: sshkey_fingerprint fail", __func__);
 			verbose("Accepted certificate ID \"%s\" signed by "
 			    "%s CA %s from %s@%s", key->cert->key_id,
-			    key_type(key->cert->signature_key), fp,
+			    sshkey_type(key->cert->signature_key), fp,
 			    cuser, lookup);
 		} else {
 			if ((fp = sshkey_fingerprint(key,
 			    options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
 				fatal("%s: sshkey_fingerprint fail", __func__);
 			verbose("Accepted %s public key %s from %s@%s",
-			    key_type(key), fp, cuser, lookup);
+			    sshkey_type(key), fp, cuser, lookup);
 		}
 		free(fp);
 	}
diff --git a/auth2-kbdint.c b/auth2-kbdint.c
index bf75c60..a813b8f 100644
--- a/auth2-kbdint.c
+++ b/auth2-kbdint.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-kbdint.c,v 1.7 2014/07/15 15:54:14 millert Exp $ */
+/* $OpenBSD: auth2-kbdint.c,v 1.9 2018/07/09 21:35:50 markus Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -31,31 +31,31 @@
 
 #include "xmalloc.h"
 #include "packet.h"
-#include "key.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "log.h"
-#include "buffer.h"
 #include "misc.h"
 #include "servconf.h"
+#include "ssherr.h"
 
 /* import */
 extern ServerOptions options;
 
 static int
-userauth_kbdint(Authctxt *authctxt)
+userauth_kbdint(struct ssh *ssh)
 {
-	int authenticated = 0;
+	int r, authenticated = 0;
 	char *lang, *devs;
 
-	lang = packet_get_string(NULL);
-	devs = packet_get_string(NULL);
-	packet_check_eom();
+	if ((r = sshpkt_get_cstring(ssh, &lang, NULL)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &devs, NULL)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
 	debug("keyboard-interactive devs %s", devs);
 
 	if (options.challenge_response_authentication)
-		authenticated = auth2_challenge(authctxt, devs);
+		authenticated = auth2_challenge(ssh, devs);
 
 	free(devs);
 	free(lang);
diff --git a/auth2-none.c b/auth2-none.c
index e71e221..dacb5fb 100644
--- a/auth2-none.c
+++ b/auth2-none.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-none.c,v 1.18 2014/07/15 15:54:14 millert Exp $ */
+/* $OpenBSD: auth2-none.c,v 1.22 2018/07/09 21:35:50 markus Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -37,16 +37,16 @@
 
 #include "atomicio.h"
 #include "xmalloc.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "packet.h"
 #include "log.h"
-#include "buffer.h"
 #include "misc.h"
 #include "servconf.h"
 #include "compat.h"
 #include "ssh2.h"
+#include "ssherr.h"
 #ifdef GSSAPI
 #include "ssh-gss.h"
 #endif
@@ -59,12 +59,15 @@
 static int none_enabled = 1;
 
 static int
-userauth_none(Authctxt *authctxt)
+userauth_none(struct ssh *ssh)
 {
+	int r;
+
 	none_enabled = 0;
-	packet_check_eom();
+	if ((r = sshpkt_get_end(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 	if (options.permit_empty_passwd && options.password_authentication)
-		return (PRIVSEP(auth_password(authctxt, "")));
+		return (PRIVSEP(auth_password(ssh, "")));
 	return (0);
 }
 
diff --git a/auth2-passwd.c b/auth2-passwd.c
index b638e87..0395a69 100644
--- a/auth2-passwd.c
+++ b/auth2-passwd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-passwd.c,v 1.12 2014/07/15 15:54:14 millert Exp $ */
+/* $OpenBSD: auth2-passwd.c,v 1.16 2018/07/09 21:35:50 markus Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -30,13 +30,12 @@
 #include <string.h>
 #include <stdarg.h>
 
-#include "xmalloc.h"
 #include "packet.h"
+#include "ssherr.h"
 #include "log.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
-#include "buffer.h"
 #ifdef GSSAPI
 #include "ssh-gss.h"
 #endif
@@ -48,26 +47,22 @@
 extern ServerOptions options;
 
 static int
-userauth_passwd(Authctxt *authctxt)
+userauth_passwd(struct ssh *ssh)
 {
-	char *password, *newpass;
-	int authenticated = 0;
-	int change;
-	u_int len, newlen;
+	char *password;
+	int authenticated = 0, r;
+	u_char change;
+	size_t len;
 
-	change = packet_get_char();
-	password = packet_get_string(&len);
-	if (change) {
-		/* discard new password from packet */
-		newpass = packet_get_string(&newlen);
-		explicit_bzero(newpass, newlen);
-		free(newpass);
-	}
-	packet_check_eom();
+	if ((r = sshpkt_get_u8(ssh, &change)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &password, &len)) != 0 ||
+	    (change && (r = sshpkt_get_cstring(ssh, NULL, NULL)) != 0) ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
 	if (change)
 		logit("password change not supported");
-	else if (PRIVSEP(auth_password(authctxt, password)) == 1)
+	else if (PRIVSEP(auth_password(ssh, password)) == 1)
 		authenticated = 1;
 	explicit_bzero(password, len);
 	free(password);
diff --git a/auth2-pubkey.c b/auth2-pubkey.c
index 3e5706f..3d9f9af 100644
--- a/auth2-pubkey.c
+++ b/auth2-pubkey.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-pubkey.c,v 1.62 2017/01/30 01:03:00 djm Exp $ */
+/* $OpenBSD: auth2-pubkey.c,v 1.84 2018/08/23 03:01:08 djm Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -27,7 +27,6 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/wait.h>
 
 #include <errno.h>
 #include <fcntl.h>
@@ -47,12 +46,12 @@
 #include "ssh.h"
 #include "ssh2.h"
 #include "packet.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "log.h"
 #include "misc.h"
 #include "servconf.h"
 #include "compat.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "pathnames.h"
@@ -74,43 +73,46 @@
 extern u_char *session_id2;
 extern u_int session_id2_len;
 
-static int
-userauth_pubkey(Authctxt *authctxt)
+static char *
+format_key(const struct sshkey *key)
 {
-	Buffer b;
-	Key *key = NULL;
-	char *pkalg, *userstyle, *fp = NULL;
-	u_char *pkblob, *sig;
-	u_int alen, blen, slen;
-	int have_sig, pktype;
-	int authenticated = 0;
+	char *ret, *fp = sshkey_fingerprint(key,
+	    options.fingerprint_hash, SSH_FP_DEFAULT);
 
-	if (!authctxt->valid) {
-		debug2("%s: disabled because of invalid user", __func__);
-		return 0;
-	}
-	have_sig = packet_get_char();
-	if (datafellows & SSH_BUG_PKAUTH) {
-		debug2("%s: SSH_BUG_PKAUTH", __func__);
-		/* no explicit pkalg given */
-		pkblob = packet_get_string(&blen);
-		buffer_init(&b);
-		buffer_append(&b, pkblob, blen);
-		/* so we have to extract the pkalg from the pkblob */
-		pkalg = buffer_get_string(&b, &alen);
-		buffer_free(&b);
-	} else {
-		pkalg = packet_get_string(&alen);
-		pkblob = packet_get_string(&blen);
-	}
-	pktype = key_type_from_name(pkalg);
+	xasprintf(&ret, "%s %s", sshkey_type(key), fp);
+	free(fp);
+	return ret;
+}
+
+static int
+userauth_pubkey(struct ssh *ssh)
+{
+	Authctxt *authctxt = ssh->authctxt;
+	struct passwd *pw = authctxt->pw;
+	struct sshbuf *b = NULL;
+	struct sshkey *key = NULL;
+	char *pkalg = NULL, *userstyle = NULL, *key_s = NULL, *ca_s = NULL;
+	u_char *pkblob = NULL, *sig = NULL, have_sig;
+	size_t blen, slen;
+	int r, pktype;
+	int authenticated = 0;
+	struct sshauthopt *authopts = NULL;
+
+	if ((r = sshpkt_get_u8(ssh, &have_sig)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &pkalg, NULL)) != 0 ||
+	    (r = sshpkt_get_string(ssh, &pkblob, &blen)) != 0)
+		fatal("%s: parse request failed: %s", __func__, ssh_err(r));
+	pktype = sshkey_type_from_name(pkalg);
 	if (pktype == KEY_UNSPEC) {
 		/* this is perfectly legal */
-		logit("%s: unsupported public key algorithm: %s",
+		verbose("%s: unsupported public key algorithm: %s",
 		    __func__, pkalg);
 		goto done;
 	}
-	key = key_from_blob(pkblob, blen);
+	if ((r = sshkey_from_blob(pkblob, blen, &key)) != 0) {
+		error("%s: could not parse key: %s", __func__, ssh_err(r));
+		goto done;
+	}
 	if (key == NULL) {
 		error("%s: cannot decode key: %s", __func__, pkalg);
 		goto done;
@@ -120,76 +122,92 @@
 		    "(received %d, expected %d)", __func__, key->type, pktype);
 		goto done;
 	}
-	if (key_type_plain(key->type) == KEY_RSA &&
-	    (datafellows & SSH_BUG_RSASIGMD5) != 0) {
+	if (sshkey_type_plain(key->type) == KEY_RSA &&
+	    (ssh->compat & SSH_BUG_RSASIGMD5) != 0) {
 		logit("Refusing RSA key because client uses unsafe "
 		    "signature scheme");
 		goto done;
 	}
-	fp = sshkey_fingerprint(key, options.fingerprint_hash, SSH_FP_DEFAULT);
-	if (auth2_userkey_already_used(authctxt, key)) {
-		logit("refusing previously-used %s key", key_type(key));
+	if (auth2_key_already_used(authctxt, key)) {
+		logit("refusing previously-used %s key", sshkey_type(key));
 		goto done;
 	}
-	if (match_pattern_list(sshkey_ssh_name(key),
-	    options.pubkey_key_types, 0) != 1) {
+	if (match_pattern_list(pkalg, options.pubkey_key_types, 0) != 1) {
 		logit("%s: key type %s not in PubkeyAcceptedKeyTypes",
 		    __func__, sshkey_ssh_name(key));
 		goto done;
 	}
 
+	key_s = format_key(key);
+	if (sshkey_is_cert(key))
+		ca_s = format_key(key->cert->signature_key);
+
 	if (have_sig) {
-		debug3("%s: have signature for %s %s",
-		    __func__, sshkey_type(key), fp);
-		sig = packet_get_string(&slen);
-		packet_check_eom();
-		buffer_init(&b);
-		if (datafellows & SSH_OLD_SESSIONID) {
-			buffer_append(&b, session_id2, session_id2_len);
+		debug3("%s: have %s signature for %s%s%s",
+		    __func__, pkalg, key_s,
+		    ca_s == NULL ? "" : " CA ",
+		    ca_s == NULL ? "" : ca_s);
+		if ((r = sshpkt_get_string(ssh, &sig, &slen)) != 0 ||
+		    (r = sshpkt_get_end(ssh)) != 0)
+			fatal("%s: %s", __func__, ssh_err(r));
+		if ((b = sshbuf_new()) == NULL)
+			fatal("%s: sshbuf_new failed", __func__);
+		if (ssh->compat & SSH_OLD_SESSIONID) {
+			if ((r = sshbuf_put(b, session_id2,
+			    session_id2_len)) != 0)
+				fatal("%s: sshbuf_put session id: %s",
+				    __func__, ssh_err(r));
 		} else {
-			buffer_put_string(&b, session_id2, session_id2_len);
+			if ((r = sshbuf_put_string(b, session_id2,
+			    session_id2_len)) != 0)
+				fatal("%s: sshbuf_put_string session id: %s",
+				    __func__, ssh_err(r));
+		}
+		if (!authctxt->valid || authctxt->user == NULL) {
+			debug2("%s: disabled because of invalid user",
+			    __func__);
+			goto done;
 		}
 		/* reconstruct packet */
-		buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
 		xasprintf(&userstyle, "%s%s%s", authctxt->user,
 		    authctxt->style ? ":" : "",
 		    authctxt->style ? authctxt->style : "");
-		buffer_put_cstring(&b, userstyle);
-		free(userstyle);
-		buffer_put_cstring(&b,
-		    datafellows & SSH_BUG_PKSERVICE ?
-		    "ssh-userauth" :
-		    authctxt->service);
-		if (datafellows & SSH_BUG_PKAUTH) {
-			buffer_put_char(&b, have_sig);
-		} else {
-			buffer_put_cstring(&b, "publickey");
-			buffer_put_char(&b, have_sig);
-			buffer_put_cstring(&b, pkalg);
-		}
-		buffer_put_string(&b, pkblob, blen);
+		if ((r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+		    (r = sshbuf_put_cstring(b, userstyle)) != 0 ||
+		    (r = sshbuf_put_cstring(b, authctxt->service)) != 0 ||
+		    (r = sshbuf_put_cstring(b, "publickey")) != 0 ||
+		    (r = sshbuf_put_u8(b, have_sig)) != 0 ||
+		    (r = sshbuf_put_cstring(b, pkalg) != 0) ||
+		    (r = sshbuf_put_string(b, pkblob, blen)) != 0)
+			fatal("%s: build packet failed: %s",
+			    __func__, ssh_err(r));
 #ifdef DEBUG_PK
-		buffer_dump(&b);
+		sshbuf_dump(b, stderr);
 #endif
-		pubkey_auth_info(authctxt, key, NULL);
-
 		/* test for correct signature */
 		authenticated = 0;
-		if (PRIVSEP(user_key_allowed(authctxt->pw, key, 1)) &&
-		    PRIVSEP(key_verify(key, sig, slen, buffer_ptr(&b),
-		    buffer_len(&b))) == 1) {
+		if (PRIVSEP(user_key_allowed(ssh, pw, key, 1, &authopts)) &&
+		    PRIVSEP(sshkey_verify(key, sig, slen,
+		    sshbuf_ptr(b), sshbuf_len(b),
+		    (ssh->compat & SSH_BUG_SIGTYPE) == 0 ? pkalg : NULL,
+		    ssh->compat)) == 0) {
 			authenticated = 1;
-			/* Record the successful key to prevent reuse */
-			auth2_record_userkey(authctxt, key);
-			key = NULL; /* Don't free below */
 		}
-		buffer_free(&b);
-		free(sig);
+		auth2_record_key(authctxt, authenticated, key);
 	} else {
-		debug("%s: test whether pkalg/pkblob are acceptable for %s %s",
-		    __func__, sshkey_type(key), fp);
-		packet_check_eom();
+		debug("%s: test pkalg %s pkblob %s%s%s",
+		    __func__, pkalg, key_s,
+		    ca_s == NULL ? "" : " CA ",
+		    ca_s == NULL ? "" : ca_s);
 
+		if ((r = sshpkt_get_end(ssh)) != 0)
+			fatal("%s: %s", __func__, ssh_err(r));
+
+		if (!authctxt->valid || authctxt->user == NULL) {
+			debug2("%s: disabled because of invalid user",
+			    __func__);
+			goto done;
+		}
 		/* XXX fake reply and always send PK_OK ? */
 		/*
 		 * XXX this allows testing whether a user is allowed
@@ -198,346 +216,36 @@
 		 * if a user is not allowed to login. is this an
 		 * issue? -markus
 		 */
-		if (PRIVSEP(user_key_allowed(authctxt->pw, key, 0))) {
-			packet_start(SSH2_MSG_USERAUTH_PK_OK);
-			packet_put_string(pkalg, alen);
-			packet_put_string(pkblob, blen);
-			packet_send();
-			packet_write_wait();
+		if (PRIVSEP(user_key_allowed(ssh, pw, key, 0, NULL))) {
+			if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_PK_OK))
+			    != 0 ||
+			    (r = sshpkt_put_cstring(ssh, pkalg)) != 0 ||
+			    (r = sshpkt_put_string(ssh, pkblob, blen)) != 0 ||
+			    (r = sshpkt_send(ssh)) != 0 ||
+			    (r = ssh_packet_write_wait(ssh)) != 0)
+				fatal("%s: %s", __func__, ssh_err(r));
 			authctxt->postponed = 1;
 		}
 	}
-	if (authenticated != 1)
-		auth_clear_options();
 done:
+	if (authenticated == 1 && auth_activate_options(ssh, authopts) != 0) {
+		debug("%s: key options inconsistent with existing", __func__);
+		authenticated = 0;
+	}
 	debug2("%s: authenticated %d pkalg %s", __func__, authenticated, pkalg);
-	if (key != NULL)
-		key_free(key);
+
+	sshbuf_free(b);
+	sshauthopt_free(authopts);
+	sshkey_free(key);
+	free(userstyle);
 	free(pkalg);
 	free(pkblob);
-	free(fp);
+	free(key_s);
+	free(ca_s);
+	free(sig);
 	return authenticated;
 }
 
-void
-pubkey_auth_info(Authctxt *authctxt, const Key *key, const char *fmt, ...)
-{
-	char *fp, *extra;
-	va_list ap;
-	int i;
-
-	extra = NULL;
-	if (fmt != NULL) {
-		va_start(ap, fmt);
-		i = vasprintf(&extra, fmt, ap);
-		va_end(ap);
-		if (i < 0 || extra == NULL)
-			fatal("%s: vasprintf failed", __func__);	
-	}
-
-	if (key_is_cert(key)) {
-		fp = sshkey_fingerprint(key->cert->signature_key,
-		    options.fingerprint_hash, SSH_FP_DEFAULT);
-		auth_info(authctxt, "%s ID %s (serial %llu) CA %s %s%s%s", 
-		    key_type(key), key->cert->key_id,
-		    (unsigned long long)key->cert->serial,
-		    key_type(key->cert->signature_key),
-		    fp == NULL ? "(null)" : fp,
-		    extra == NULL ? "" : ", ", extra == NULL ? "" : extra);
-		free(fp);
-	} else {
-		fp = sshkey_fingerprint(key, options.fingerprint_hash,
-		    SSH_FP_DEFAULT);
-		auth_info(authctxt, "%s %s%s%s", key_type(key),
-		    fp == NULL ? "(null)" : fp,
-		    extra == NULL ? "" : ", ", extra == NULL ? "" : extra);
-		free(fp);
-	}
-	free(extra);
-}
-
-/*
- * Splits 's' into an argument vector. Handles quoted string and basic
- * escape characters (\\, \", \'). Caller must free the argument vector
- * and its members.
- */
-static int
-split_argv(const char *s, int *argcp, char ***argvp)
-{
-	int r = SSH_ERR_INTERNAL_ERROR;
-	int argc = 0, quote, i, j;
-	char *arg, **argv = xcalloc(1, sizeof(*argv));
-
-	*argvp = NULL;
-	*argcp = 0;
-
-	for (i = 0; s[i] != '\0'; i++) {
-		/* Skip leading whitespace */
-		if (s[i] == ' ' || s[i] == '\t')
-			continue;
-
-		/* Start of a token */
-		quote = 0;
-		if (s[i] == '\\' &&
-		    (s[i + 1] == '\'' || s[i + 1] == '\"' || s[i + 1] == '\\'))
-			i++;
-		else if (s[i] == '\'' || s[i] == '"')
-			quote = s[i++];
-
-		argv = xreallocarray(argv, (argc + 2), sizeof(*argv));
-		arg = argv[argc++] = xcalloc(1, strlen(s + i) + 1);
-		argv[argc] = NULL;
-
-		/* Copy the token in, removing escapes */
-		for (j = 0; s[i] != '\0'; i++) {
-			if (s[i] == '\\') {
-				if (s[i + 1] == '\'' ||
-				    s[i + 1] == '\"' ||
-				    s[i + 1] == '\\') {
-					i++; /* Skip '\' */
-					arg[j++] = s[i];
-				} else {
-					/* Unrecognised escape */
-					arg[j++] = s[i];
-				}
-			} else if (quote == 0 && (s[i] == ' ' || s[i] == '\t'))
-				break; /* done */
-			else if (quote != 0 && s[i] == quote)
-				break; /* done */
-			else
-				arg[j++] = s[i];
-		}
-		if (s[i] == '\0') {
-			if (quote != 0) {
-				/* Ran out of string looking for close quote */
-				r = SSH_ERR_INVALID_FORMAT;
-				goto out;
-			}
-			break;
-		}
-	}
-	/* Success */
-	*argcp = argc;
-	*argvp = argv;
-	argc = 0;
-	argv = NULL;
-	r = 0;
- out:
-	if (argc != 0 && argv != NULL) {
-		for (i = 0; i < argc; i++)
-			free(argv[i]);
-		free(argv);
-	}
-	return r;
-}
-
-/*
- * Reassemble an argument vector into a string, quoting and escaping as
- * necessary. Caller must free returned string.
- */
-static char *
-assemble_argv(int argc, char **argv)
-{
-	int i, j, ws, r;
-	char c, *ret;
-	struct sshbuf *buf, *arg;
-
-	if ((buf = sshbuf_new()) == NULL || (arg = sshbuf_new()) == NULL)
-		fatal("%s: sshbuf_new failed", __func__);
-
-	for (i = 0; i < argc; i++) {
-		ws = 0;
-		sshbuf_reset(arg);
-		for (j = 0; argv[i][j] != '\0'; j++) {
-			r = 0;
-			c = argv[i][j];
-			switch (c) {
-			case ' ':
-			case '\t':
-				ws = 1;
-				r = sshbuf_put_u8(arg, c);
-				break;
-			case '\\':
-			case '\'':
-			case '"':
-				if ((r = sshbuf_put_u8(arg, '\\')) != 0)
-					break;
-				/* FALLTHROUGH */
-			default:
-				r = sshbuf_put_u8(arg, c);
-				break;
-			}
-			if (r != 0)
-				fatal("%s: sshbuf_put_u8: %s",
-				    __func__, ssh_err(r));
-		}
-		if ((i != 0 && (r = sshbuf_put_u8(buf, ' ')) != 0) ||
-		    (ws != 0 && (r = sshbuf_put_u8(buf, '"')) != 0) ||
-		    (r = sshbuf_putb(buf, arg)) != 0 ||
-		    (ws != 0 && (r = sshbuf_put_u8(buf, '"')) != 0))
-			fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	}
-	if ((ret = malloc(sshbuf_len(buf) + 1)) == NULL)
-		fatal("%s: malloc failed", __func__);
-	memcpy(ret, sshbuf_ptr(buf), sshbuf_len(buf));
-	ret[sshbuf_len(buf)] = '\0';
-	sshbuf_free(buf);
-	sshbuf_free(arg);
-	return ret;
-}
-
-/*
- * Runs command in a subprocess. Returns pid on success and a FILE* to the
- * subprocess' stdout or 0 on failure.
- * NB. "command" is only used for logging.
- */
-static pid_t
-subprocess(const char *tag, struct passwd *pw, const char *command,
-    int ac, char **av, FILE **child)
-{
-	FILE *f;
-	struct stat st;
-	int devnull, p[2], i;
-	pid_t pid;
-	char *cp, errmsg[512];
-	u_int envsize;
-	char **child_env;
-
-	*child = NULL;
-
-	debug3("%s: %s command \"%s\" running as %s", __func__,
-	    tag, command, pw->pw_name);
-
-	/* Verify the path exists and is safe-ish to execute */
-	if (*av[0] != '/') {
-		error("%s path is not absolute", tag);
-		return 0;
-	}
-	temporarily_use_uid(pw);
-	if (stat(av[0], &st) < 0) {
-		error("Could not stat %s \"%s\": %s", tag,
-		    av[0], strerror(errno));
-		restore_uid();
-		return 0;
-	}
-	if (auth_secure_path(av[0], &st, NULL, 0,
-	    errmsg, sizeof(errmsg)) != 0) {
-		error("Unsafe %s \"%s\": %s", tag, av[0], errmsg);
-		restore_uid();
-		return 0;
-	}
-
-	/*
-	 * Run the command; stderr is left in place, stdout is the
-	 * authorized_keys output.
-	 */
-	if (pipe(p) != 0) {
-		error("%s: pipe: %s", tag, strerror(errno));
-		restore_uid();
-		return 0;
-	}
-
-	/*
-	 * Don't want to call this in the child, where it can fatal() and
-	 * run cleanup_exit() code.
-	 */
-	restore_uid();
-
-	switch ((pid = fork())) {
-	case -1: /* error */
-		error("%s: fork: %s", tag, strerror(errno));
-		close(p[0]);
-		close(p[1]);
-		return 0;
-	case 0: /* child */
-		/* Prepare a minimal environment for the child. */
-		envsize = 5;
-		child_env = xcalloc(sizeof(*child_env), envsize);
-		child_set_env(&child_env, &envsize, "PATH", _PATH_STDPATH);
-		child_set_env(&child_env, &envsize, "USER", pw->pw_name);
-		child_set_env(&child_env, &envsize, "LOGNAME", pw->pw_name);
-		child_set_env(&child_env, &envsize, "HOME", pw->pw_dir);
-		if ((cp = getenv("LANG")) != NULL)
-			child_set_env(&child_env, &envsize, "LANG", cp);
-
-		for (i = 0; i < NSIG; i++)
-			signal(i, SIG_DFL);
-
-		if ((devnull = open(_PATH_DEVNULL, O_RDWR)) == -1) {
-			error("%s: open %s: %s", tag, _PATH_DEVNULL,
-			    strerror(errno));
-			_exit(1);
-		}
-		/* Keep stderr around a while longer to catch errors */
-		if (dup2(devnull, STDIN_FILENO) == -1 ||
-		    dup2(p[1], STDOUT_FILENO) == -1) {
-			error("%s: dup2: %s", tag, strerror(errno));
-			_exit(1);
-		}
-		closefrom(STDERR_FILENO + 1);
-
-		/* Don't use permanently_set_uid() here to avoid fatal() */
-		if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) != 0) {
-			error("%s: setresgid %u: %s", tag, (u_int)pw->pw_gid,
-			    strerror(errno));
-			_exit(1);
-		}
-		if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) != 0) {
-			error("%s: setresuid %u: %s", tag, (u_int)pw->pw_uid,
-			    strerror(errno));
-			_exit(1);
-		}
-		/* stdin is pointed to /dev/null at this point */
-		if (dup2(STDIN_FILENO, STDERR_FILENO) == -1) {
-			error("%s: dup2: %s", tag, strerror(errno));
-			_exit(1);
-		}
-
-		execve(av[0], av, child_env);
-		error("%s exec \"%s\": %s", tag, command, strerror(errno));
-		_exit(127);
-	default: /* parent */
-		break;
-	}
-
-	close(p[1]);
-	if ((f = fdopen(p[0], "r")) == NULL) {
-		error("%s: fdopen: %s", tag, strerror(errno));
-		close(p[0]);
-		/* Don't leave zombie child */
-		kill(pid, SIGTERM);
-		while (waitpid(pid, NULL, 0) == -1 && errno == EINTR)
-			;
-		return 0;
-	}
-	/* Success */
-	debug3("%s: %s pid %ld", __func__, tag, (long)pid);
-	*child = f;
-	return pid;
-}
-
-/* Returns 0 if pid exited cleanly, non-zero otherwise */
-static int
-exited_cleanly(pid_t pid, const char *tag, const char *cmd)
-{
-	int status;
-
-	while (waitpid(pid, &status, 0) == -1) {
-		if (errno != EINTR) {
-			error("%s: waitpid: %s", tag, strerror(errno));
-			return -1;
-		}
-	}
-	if (WIFSIGNALED(status)) {
-		error("%s %s exited on signal %d", tag, cmd, WTERMSIG(status));
-		return -1;
-	} else if (WEXITSTATUS(status) != 0) {
-		error("%s %s failed, status %d", tag, cmd, WEXITSTATUS(status));
-		return -1;
-	}
-	return 0;
-}
-
 static int
 match_principals_option(const char *principal_list, struct sshkey_cert *cert)
 {
@@ -558,18 +266,79 @@
 	return 0;
 }
 
+/*
+ * Process a single authorized_principals format line. Returns 0 and sets
+ * authoptsp is principal is authorised, -1 otherwise. "loc" is used as a
+ * log preamble for file/line information.
+ */
 static int
-process_principals(FILE *f, char *file, struct passwd *pw,
-    const struct sshkey_cert *cert)
+check_principals_line(struct ssh *ssh, char *cp, const struct sshkey_cert *cert,
+    const char *loc, struct sshauthopt **authoptsp)
 {
-	char line[SSH_MAX_PUBKEY_BYTES], *cp, *ep, *line_opts;
-	u_long linenum = 0;
-	u_int i, found_principal = 0;
+	u_int i, found = 0;
+	char *ep, *line_opts;
+	const char *reason = NULL;
+	struct sshauthopt *opts = NULL;
 
-	while (read_keyfile_line(f, file, line, sizeof(line), &linenum) != -1) {
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
+
+	/* Trim trailing whitespace. */
+	ep = cp + strlen(cp) - 1;
+	while (ep > cp && (*ep == '\n' || *ep == ' ' || *ep == '\t'))
+		*ep-- = '\0';
+
+	/*
+	 * If the line has internal whitespace then assume it has
+	 * key options.
+	 */
+	line_opts = NULL;
+	if ((ep = strrchr(cp, ' ')) != NULL ||
+	    (ep = strrchr(cp, '\t')) != NULL) {
+		for (; *ep == ' ' || *ep == '\t'; ep++)
+			;
+		line_opts = cp;
+		cp = ep;
+	}
+	if ((opts = sshauthopt_parse(line_opts, &reason)) == NULL) {
+		debug("%s: bad principals options: %s", loc, reason);
+		auth_debug_add("%s: bad principals options: %s", loc, reason);
+		return -1;
+	}
+	/* Check principals in cert against those on line */
+	for (i = 0; i < cert->nprincipals; i++) {
+		if (strcmp(cp, cert->principals[i]) != 0)
+			continue;
+		debug3("%s: matched principal \"%.100s\"",
+		    loc, cert->principals[i]);
+		found = 1;
+	}
+	if (found && authoptsp != NULL) {
+		*authoptsp = opts;
+		opts = NULL;
+	}
+	sshauthopt_free(opts);
+	return found ? 0 : -1;
+}
+
+static int
+process_principals(struct ssh *ssh, FILE *f, const char *file,
+    const struct sshkey_cert *cert, struct sshauthopt **authoptsp)
+{
+	char loc[256], *line = NULL, *cp, *ep;
+	size_t linesize = 0;
+	u_long linenum = 0;
+	u_int found_principal = 0;
+
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
+
+	while (getline(&line, &linesize, f) != -1) {
+		linenum++;
 		/* Always consume entire input */
 		if (found_principal)
 			continue;
+
 		/* Skip leading whitespace. */
 		for (cp = line; *cp == ' ' || *cp == '\t'; cp++)
 			;
@@ -578,51 +347,34 @@
 			*ep = '\0';
 		if (!*cp || *cp == '\n')
 			continue;
-		/* Trim trailing whitespace. */
-		ep = cp + strlen(cp) - 1;
-		while (ep > cp && (*ep == '\n' || *ep == ' ' || *ep == '\t'))
-			*ep-- = '\0';
-		/*
-		 * If the line has internal whitespace then assume it has
-		 * key options.
-		 */
-		line_opts = NULL;
-		if ((ep = strrchr(cp, ' ')) != NULL ||
-		    (ep = strrchr(cp, '\t')) != NULL) {
-			for (; *ep == ' ' || *ep == '\t'; ep++)
-				;
-			line_opts = cp;
-			cp = ep;
-		}
-		for (i = 0; i < cert->nprincipals; i++) {
-			if (strcmp(cp, cert->principals[i]) == 0) {
-				debug3("%s:%lu: matched principal \"%.100s\"",
-				    file == NULL ? "(command)" : file,
-				    linenum, cert->principals[i]);
-				if (auth_parse_options(pw, line_opts,
-				    file, linenum) != 1)
-					continue;
-				found_principal = 1;
-				continue;
-			}
-		}
+
+		snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum);
+		if (check_principals_line(ssh, cp, cert, loc, authoptsp) == 0)
+			found_principal = 1;
 	}
+	free(line);
 	return found_principal;
 }
 
+/* XXX remove pw args here and elsewhere once ssh->authctxt is guaranteed */
+
 static int
-match_principals_file(char *file, struct passwd *pw, struct sshkey_cert *cert)
+match_principals_file(struct ssh *ssh, struct passwd *pw, char *file,
+    struct sshkey_cert *cert, struct sshauthopt **authoptsp)
 {
 	FILE *f;
 	int success;
 
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
+
 	temporarily_use_uid(pw);
 	debug("trying authorized principals file %s", file);
 	if ((f = auth_openprincipals(file, pw, options.strict_modes)) == NULL) {
 		restore_uid();
 		return 0;
 	}
-	success = process_principals(f, file, pw, cert);
+	success = process_principals(ssh, f, file, cert, authoptsp);
 	fclose(f);
 	restore_uid();
 	return success;
@@ -633,19 +385,22 @@
  * returns 1 if the principal is allowed or 0 otherwise.
  */
 static int
-match_principals_command(struct passwd *user_pw, const struct sshkey *key)
+match_principals_command(struct ssh *ssh, struct passwd *user_pw,
+    const struct sshkey *key, struct sshauthopt **authoptsp)
 {
+	struct passwd *runas_pw = NULL;
 	const struct sshkey_cert *cert = key->cert;
 	FILE *f = NULL;
 	int r, ok, found_principal = 0;
-	struct passwd *pw;
 	int i, ac = 0, uid_swapped = 0;
 	pid_t pid;
 	char *tmp, *username = NULL, *command = NULL, **av = NULL;
 	char *ca_fp = NULL, *key_fp = NULL, *catext = NULL, *keytext = NULL;
-	char serial_s[16];
+	char serial_s[16], uidstr[32];
 	void (*osigchld)(int);
 
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
 	if (options.authorized_principals_command == NULL)
 		return 0;
 	if (options.authorized_principals_command_user == NULL) {
@@ -663,15 +418,15 @@
 	/* Prepare and verify the user for the command */
 	username = percent_expand(options.authorized_principals_command_user,
 	    "u", user_pw->pw_name, (char *)NULL);
-	pw = getpwnam(username);
-	if (pw == NULL) {
+	runas_pw = getpwnam(username);
+	if (runas_pw == NULL) {
 		error("AuthorizedPrincipalsCommandUser \"%s\" not found: %s",
 		    username, strerror(errno));
 		goto out;
 	}
 
 	/* Turn the command into an argument vector */
-	if (split_argv(options.authorized_principals_command, &ac, &av) != 0) {
+	if (argv_split(options.authorized_principals_command, &ac, &av) != 0) {
 		error("AuthorizedPrincipalsCommand \"%s\" contains "
 		    "invalid quotes", command);
 		goto out;
@@ -701,8 +456,11 @@
 	}
 	snprintf(serial_s, sizeof(serial_s), "%llu",
 	    (unsigned long long)cert->serial);
+	snprintf(uidstr, sizeof(uidstr), "%llu",
+	    (unsigned long long)user_pw->pw_uid);
 	for (i = 1; i < ac; i++) {
 		tmp = percent_expand(av[i],
+		    "U", uidstr,
 		    "u", user_pw->pw_name,
 		    "h", user_pw->pw_dir,
 		    "t", sshkey_ssh_name(key),
@@ -720,21 +478,22 @@
 		av[i] = tmp;
 	}
 	/* Prepare a printable command for logs, etc. */
-	command = assemble_argv(ac, av);
+	command = argv_assemble(ac, av);
 
-	if ((pid = subprocess("AuthorizedPrincipalsCommand", pw, command,
-	    ac, av, &f)) == 0)
+	if ((pid = subprocess("AuthorizedPrincipalsCommand", runas_pw, command,
+	    ac, av, &f,
+	    SSH_SUBPROCESS_STDOUT_CAPTURE|SSH_SUBPROCESS_STDERR_DISCARD)) == 0)
 		goto out;
 
 	uid_swapped = 1;
-	temporarily_use_uid(pw);
+	temporarily_use_uid(runas_pw);
 
-	ok = process_principals(f, NULL, pw, cert);
+	ok = process_principals(ssh, f, "(command)", cert, authoptsp);
 
 	fclose(f);
 	f = NULL;
 
-	if (exited_cleanly(pid, "AuthorizedPrincipalsCommand", command) != 0)
+	if (exited_cleanly(pid, "AuthorizedPrincipalsCommand", command, 0) != 0)
 		goto out;
 
 	/* Read completed successfully */
@@ -756,144 +515,240 @@
 	free(keytext);
 	return found_principal;
 }
+
+static void
+skip_space(char **cpp)
+{
+	char *cp;
+
+	for (cp = *cpp; *cp == ' ' || *cp == '\t'; cp++)
+		;
+	*cpp = cp;
+}
+
+/*
+ * Advanced *cpp past the end of key options, defined as the first unquoted
+ * whitespace character. Returns 0 on success or -1 on failure (e.g.
+ * unterminated quotes).
+ */
+static int
+advance_past_options(char **cpp)
+{
+	char *cp = *cpp;
+	int quoted = 0;
+
+	for (; *cp && (quoted || (*cp != ' ' && *cp != '\t')); cp++) {
+		if (*cp == '\\' && cp[1] == '"')
+			cp++;	/* Skip both */
+		else if (*cp == '"')
+			quoted = !quoted;
+	}
+	*cpp = cp;
+	/* return failure for unterminated quotes */
+	return (*cp == '\0' && quoted) ? -1 : 0;
+}
+
+/*
+ * Check a single line of an authorized_keys-format file. Returns 0 if key
+ * matches, -1 otherwise. Will return key/cert options via *authoptsp
+ * on success. "loc" is used as file/line location in log messages.
+ */
+static int
+check_authkey_line(struct ssh *ssh, struct passwd *pw, struct sshkey *key,
+    char *cp, const char *loc, struct sshauthopt **authoptsp)
+{
+	int want_keytype = sshkey_is_cert(key) ? KEY_UNSPEC : key->type;
+	struct sshkey *found = NULL;
+	struct sshauthopt *keyopts = NULL, *certopts = NULL, *finalopts = NULL;
+	char *key_options = NULL, *fp = NULL;
+	const char *reason = NULL;
+	int ret = -1;
+
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
+
+	if ((found = sshkey_new(want_keytype)) == NULL) {
+		debug3("%s: keytype %d failed", __func__, want_keytype);
+		goto out;
+	}
+
+	/* XXX djm: peek at key type in line and skip if unwanted */
+
+	if (sshkey_read(found, &cp) != 0) {
+		/* no key?  check for options */
+		debug2("%s: check options: '%s'", loc, cp);
+		key_options = cp;
+		if (advance_past_options(&cp) != 0) {
+			reason = "invalid key option string";
+			goto fail_reason;
+		}
+		skip_space(&cp);
+		if (sshkey_read(found, &cp) != 0) {
+			/* still no key?  advance to next line*/
+			debug2("%s: advance: '%s'", loc, cp);
+			goto out;
+		}
+	}
+	/* Parse key options now; we need to know if this is a CA key */
+	if ((keyopts = sshauthopt_parse(key_options, &reason)) == NULL) {
+		debug("%s: bad key options: %s", loc, reason);
+		auth_debug_add("%s: bad key options: %s", loc, reason);
+		goto out;
+	}
+	/* Ignore keys that don't match or incorrectly marked as CAs */
+	if (sshkey_is_cert(key)) {
+		/* Certificate; check signature key against CA */
+		if (!sshkey_equal(found, key->cert->signature_key) ||
+		    !keyopts->cert_authority)
+			goto out;
+	} else {
+		/* Plain key: check it against key found in file */
+		if (!sshkey_equal(found, key) || keyopts->cert_authority)
+			goto out;
+	}
+
+	/* We have a candidate key, perform authorisation checks */
+	if ((fp = sshkey_fingerprint(found,
+	    options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
+		fatal("%s: fingerprint failed", __func__);
+
+	debug("%s: matching %s found: %s %s", loc,
+	    sshkey_is_cert(key) ? "CA" : "key", sshkey_type(found), fp);
+
+	if (auth_authorise_keyopts(ssh, pw, keyopts,
+	    sshkey_is_cert(key), loc) != 0) {
+		reason = "Refused by key options";
+		goto fail_reason;
+	}
+	/* That's all we need for plain keys. */
+	if (!sshkey_is_cert(key)) {
+		verbose("Accepted key %s %s found at %s",
+		    sshkey_type(found), fp, loc);
+		finalopts = keyopts;
+		keyopts = NULL;
+		goto success;
+	}
+
+	/*
+	 * Additional authorisation for certificates.
+	 */
+
+	/* Parse and check options present in certificate */
+	if ((certopts = sshauthopt_from_cert(key)) == NULL) {
+		reason = "Invalid certificate options";
+		goto fail_reason;
+	}
+	if (auth_authorise_keyopts(ssh, pw, certopts, 0, loc) != 0) {
+		reason = "Refused by certificate options";
+		goto fail_reason;
+	}
+	if ((finalopts = sshauthopt_merge(keyopts, certopts, &reason)) == NULL)
+		goto fail_reason;
+
+	/*
+	 * If the user has specified a list of principals as
+	 * a key option, then prefer that list to matching
+	 * their username in the certificate principals list.
+	 */
+	if (keyopts->cert_principals != NULL &&
+	    !match_principals_option(keyopts->cert_principals, key->cert)) {
+		reason = "Certificate does not contain an authorized principal";
+		goto fail_reason;
+	}
+	if (sshkey_cert_check_authority(key, 0, 0,
+	   keyopts->cert_principals == NULL ? pw->pw_name : NULL, &reason) != 0)
+		goto fail_reason;
+
+	verbose("Accepted certificate ID \"%s\" (serial %llu) "
+	    "signed by CA %s %s found at %s",
+	    key->cert->key_id,
+	    (unsigned long long)key->cert->serial,
+	    sshkey_type(found), fp, loc);
+
+ success:
+	if (finalopts == NULL)
+		fatal("%s: internal error: missing options", __func__);
+	if (authoptsp != NULL) {
+		*authoptsp = finalopts;
+		finalopts = NULL;
+	}
+	/* success */
+	ret = 0;
+	goto out;
+
+ fail_reason:
+	error("%s", reason);
+	auth_debug_add("%s", reason);
+ out:
+	free(fp);
+	sshauthopt_free(keyopts);
+	sshauthopt_free(certopts);
+	sshauthopt_free(finalopts);
+	sshkey_free(found);
+	return ret;
+}
+
 /*
  * Checks whether key is allowed in authorized_keys-format file,
  * returns 1 if the key is allowed or 0 otherwise.
  */
 static int
-check_authkeys_file(FILE *f, char *file, Key* key, struct passwd *pw)
+check_authkeys_file(struct ssh *ssh, struct passwd *pw, FILE *f,
+    char *file, struct sshkey *key, struct sshauthopt **authoptsp)
 {
-	char line[SSH_MAX_PUBKEY_BYTES];
+	char *cp, *line = NULL, loc[256];
+	size_t linesize = 0;
 	int found_key = 0;
 	u_long linenum = 0;
-	Key *found;
 
-	found_key = 0;
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
 
-	found = NULL;
-	while (read_keyfile_line(f, file, line, sizeof(line), &linenum) != -1) {
-		char *cp, *key_options = NULL, *fp = NULL;
-		const char *reason = NULL;
-
-		/* Always consume entrire file */
+	while (getline(&line, &linesize, f) != -1) {
+		linenum++;
+		/* Always consume entire file */
 		if (found_key)
 			continue;
-		if (found != NULL)
-			key_free(found);
-		found = key_new(key_is_cert(key) ? KEY_UNSPEC : key->type);
-		auth_clear_options();
 
 		/* Skip leading whitespace, empty and comment lines. */
-		for (cp = line; *cp == ' ' || *cp == '\t'; cp++)
-			;
+		cp = line;
+		skip_space(&cp);
 		if (!*cp || *cp == '\n' || *cp == '#')
 			continue;
-
-		if (key_read(found, &cp) != 1) {
-			/* no key?  check if there are options for this key */
-			int quoted = 0;
-			debug2("user_key_allowed: check options: '%s'", cp);
-			key_options = cp;
-			for (; *cp && (quoted || (*cp != ' ' && *cp != '\t')); cp++) {
-				if (*cp == '\\' && cp[1] == '"')
-					cp++;	/* Skip both */
-				else if (*cp == '"')
-					quoted = !quoted;
-			}
-			/* Skip remaining whitespace. */
-			for (; *cp == ' ' || *cp == '\t'; cp++)
-				;
-			if (key_read(found, &cp) != 1) {
-				debug2("user_key_allowed: advance: '%s'", cp);
-				/* still no key?  advance to next line*/
-				continue;
-			}
-		}
-		if (key_is_cert(key)) {
-			if (!key_equal(found, key->cert->signature_key))
-				continue;
-			if (auth_parse_options(pw, key_options, file,
-			    linenum) != 1)
-				continue;
-			if (!key_is_cert_authority)
-				continue;
-			if ((fp = sshkey_fingerprint(found,
-			    options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
-				continue;
-			debug("matching CA found: file %s, line %lu, %s %s",
-			    file, linenum, key_type(found), fp);
-			/*
-			 * If the user has specified a list of principals as
-			 * a key option, then prefer that list to matching
-			 * their username in the certificate principals list.
-			 */
-			if (authorized_principals != NULL &&
-			    !match_principals_option(authorized_principals,
-			    key->cert)) {
-				reason = "Certificate does not contain an "
-				    "authorized principal";
- fail_reason:
-				free(fp);
-				error("%s", reason);
-				auth_debug_add("%s", reason);
-				continue;
-			}
-			if (key_cert_check_authority(key, 0, 0,
-			    authorized_principals == NULL ? pw->pw_name : NULL,
-			    &reason) != 0)
-				goto fail_reason;
-			if (auth_cert_options(key, pw, &reason) != 0)
-				goto fail_reason;
-			verbose("Accepted certificate ID \"%s\" (serial %llu) "
-			    "signed by %s CA %s via %s", key->cert->key_id,
-			    (unsigned long long)key->cert->serial,
-			    key_type(found), fp, file);
-			free(fp);
+		snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum);
+		if (check_authkey_line(ssh, pw, key, cp, loc, authoptsp) == 0)
 			found_key = 1;
-			break;
-		} else if (key_equal(found, key)) {
-			if (auth_parse_options(pw, key_options, file,
-			    linenum) != 1)
-				continue;
-			if (key_is_cert_authority)
-				continue;
-			if ((fp = sshkey_fingerprint(found,
-			    options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
-				continue;
-			debug("matching key found: file %s, line %lu %s %s",
-			    file, linenum, key_type(found), fp);
-			free(fp);
-			found_key = 1;
-			continue;
-		}
 	}
-	if (found != NULL)
-		key_free(found);
-	if (!found_key)
-		debug2("key not found");
+	free(line);
 	return found_key;
 }
 
 /* Authenticate a certificate key against TrustedUserCAKeys */
 static int
-user_cert_trusted_ca(struct passwd *pw, Key *key)
+user_cert_trusted_ca(struct ssh *ssh, struct passwd *pw, struct sshkey *key,
+    struct sshauthopt **authoptsp)
 {
 	char *ca_fp, *principals_file = NULL;
 	const char *reason;
-	int ret = 0, found_principal = 0, use_authorized_principals;
+	struct sshauthopt *principals_opts = NULL, *cert_opts = NULL;
+	struct sshauthopt *final_opts = NULL;
+	int r, ret = 0, found_principal = 0, use_authorized_principals;
 
-	if (!key_is_cert(key) || options.trusted_user_ca_keys == NULL)
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
+
+	if (!sshkey_is_cert(key) || options.trusted_user_ca_keys == NULL)
 		return 0;
 
 	if ((ca_fp = sshkey_fingerprint(key->cert->signature_key,
 	    options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
 		return 0;
 
-	if (sshkey_in_file(key->cert->signature_key,
-	    options.trusted_user_ca_keys, 1, 0) != 0) {
-		debug2("%s: CA %s %s is not listed in %s", __func__,
-		    key_type(key->cert->signature_key), ca_fp,
-		    options.trusted_user_ca_keys);
+	if ((r = sshkey_in_file(key->cert->signature_key,
+	    options.trusted_user_ca_keys, 1, 0)) != 0) {
+		debug2("%s: CA %s %s is not listed in %s: %s", __func__,
+		    sshkey_type(key->cert->signature_key), ca_fp,
+		    options.trusted_user_ca_keys, ssh_err(r));
 		goto out;
 	}
 	/*
@@ -902,36 +757,69 @@
 	 * against the username.
 	 */
 	if ((principals_file = authorized_principals_file(pw)) != NULL) {
-		if (match_principals_file(principals_file, pw, key->cert))
+		if (match_principals_file(ssh, pw, principals_file,
+		    key->cert, &principals_opts))
 			found_principal = 1;
 	}
 	/* Try querying command if specified */
-	if (!found_principal && match_principals_command(pw, key))
+	if (!found_principal && match_principals_command(ssh, pw, key,
+	    &principals_opts))
 		found_principal = 1;
 	/* If principals file or command is specified, then require a match */
 	use_authorized_principals = principals_file != NULL ||
             options.authorized_principals_command != NULL;
 	if (!found_principal && use_authorized_principals) {
 		reason = "Certificate does not contain an authorized principal";
- fail_reason:
-		error("%s", reason);
-		auth_debug_add("%s", reason);
-		goto out;
+		goto fail_reason;
 	}
-	if (key_cert_check_authority(key, 0, 1,
+	if (use_authorized_principals && principals_opts == NULL)
+		fatal("%s: internal error: missing principals_opts", __func__);
+	if (sshkey_cert_check_authority(key, 0, 1,
 	    use_authorized_principals ? NULL : pw->pw_name, &reason) != 0)
 		goto fail_reason;
-	if (auth_cert_options(key, pw, &reason) != 0)
-		goto fail_reason;
 
+	/* Check authority from options in key and from principals file/cmd */
+	if ((cert_opts = sshauthopt_from_cert(key)) == NULL) {
+		reason = "Invalid certificate options";
+		goto fail_reason;
+	}
+	if (auth_authorise_keyopts(ssh, pw, cert_opts, 0, "cert") != 0) {
+		reason = "Refused by certificate options";
+		goto fail_reason;
+	}
+	if (principals_opts == NULL) {
+		final_opts = cert_opts;
+		cert_opts = NULL;
+	} else {
+		if (auth_authorise_keyopts(ssh, pw, principals_opts, 0,
+		    "principals") != 0) {
+			reason = "Refused by certificate principals options";
+			goto fail_reason;
+		}
+		if ((final_opts = sshauthopt_merge(principals_opts,
+		    cert_opts, &reason)) == NULL) {
+ fail_reason:
+			error("%s", reason);
+			auth_debug_add("%s", reason);
+			goto out;
+		}
+	}
+
+	/* Success */
 	verbose("Accepted certificate ID \"%s\" (serial %llu) signed by "
 	    "%s CA %s via %s", key->cert->key_id,
 	    (unsigned long long)key->cert->serial,
-	    key_type(key->cert->signature_key), ca_fp,
+	    sshkey_type(key->cert->signature_key), ca_fp,
 	    options.trusted_user_ca_keys);
+	if (authoptsp != NULL) {
+		*authoptsp = final_opts;
+		final_opts = NULL;
+	}
 	ret = 1;
-
  out:
+	sshauthopt_free(principals_opts);
+	sshauthopt_free(cert_opts);
+	sshauthopt_free(final_opts);
 	free(principals_file);
 	free(ca_fp);
 	return ret;
@@ -942,17 +830,22 @@
  * returns 1 if the key is allowed or 0 otherwise.
  */
 static int
-user_key_allowed2(struct passwd *pw, Key *key, char *file)
+user_key_allowed2(struct ssh *ssh, struct passwd *pw, struct sshkey *key,
+    char *file, struct sshauthopt **authoptsp)
 {
 	FILE *f;
 	int found_key = 0;
 
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
+
 	/* Temporarily use the user's uid. */
 	temporarily_use_uid(pw);
 
 	debug("trying public key file %s", file);
 	if ((f = auth_openkeyfile(file, pw, options.strict_modes)) != NULL) {
-		found_key = check_authkeys_file(f, file, key, pw);
+		found_key = check_authkeys_file(ssh, pw, f, file,
+		    key, authoptsp);
 		fclose(f);
 	}
 
@@ -965,17 +858,20 @@
  * returns 1 if the key is allowed or 0 otherwise.
  */
 static int
-user_key_command_allowed2(struct passwd *user_pw, Key *key)
+user_key_command_allowed2(struct ssh *ssh, struct passwd *user_pw,
+    struct sshkey *key, struct sshauthopt **authoptsp)
 {
+	struct passwd *runas_pw = NULL;
 	FILE *f = NULL;
 	int r, ok, found_key = 0;
-	struct passwd *pw;
 	int i, uid_swapped = 0, ac = 0;
 	pid_t pid;
 	char *username = NULL, *key_fp = NULL, *keytext = NULL;
-	char *tmp, *command = NULL, **av = NULL;
+	char uidstr[32], *tmp, *command = NULL, **av = NULL;
 	void (*osigchld)(int);
 
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
 	if (options.authorized_keys_command == NULL)
 		return 0;
 	if (options.authorized_keys_command_user == NULL) {
@@ -992,8 +888,8 @@
 	/* Prepare and verify the user for the command */
 	username = percent_expand(options.authorized_keys_command_user,
 	    "u", user_pw->pw_name, (char *)NULL);
-	pw = getpwnam(username);
-	if (pw == NULL) {
+	runas_pw = getpwnam(username);
+	if (runas_pw == NULL) {
 		error("AuthorizedKeysCommandUser \"%s\" not found: %s",
 		    username, strerror(errno));
 		goto out;
@@ -1011,7 +907,7 @@
 	}
 
 	/* Turn the command into an argument vector */
-	if (split_argv(options.authorized_keys_command, &ac, &av) != 0) {
+	if (argv_split(options.authorized_keys_command, &ac, &av) != 0) {
 		error("AuthorizedKeysCommand \"%s\" contains invalid quotes",
 		    command);
 		goto out;
@@ -1021,8 +917,11 @@
 		    command);
 		goto out;
 	}
+	snprintf(uidstr, sizeof(uidstr), "%llu",
+	    (unsigned long long)user_pw->pw_uid);
 	for (i = 1; i < ac; i++) {
 		tmp = percent_expand(av[i],
+		    "U", uidstr,
 		    "u", user_pw->pw_name,
 		    "h", user_pw->pw_dir,
 		    "t", sshkey_ssh_name(key),
@@ -1035,7 +934,7 @@
 		av[i] = tmp;
 	}
 	/* Prepare a printable command for logs, etc. */
-	command = assemble_argv(ac, av);
+	command = argv_assemble(ac, av);
 
 	/*
 	 * If AuthorizedKeysCommand was run without arguments
@@ -1051,19 +950,21 @@
 		xasprintf(&command, "%s %s", av[0], av[1]);
 	}
 
-	if ((pid = subprocess("AuthorizedKeysCommand", pw, command,
-	    ac, av, &f)) == 0)
+	if ((pid = subprocess("AuthorizedKeysCommand", runas_pw, command,
+	    ac, av, &f,
+	    SSH_SUBPROCESS_STDOUT_CAPTURE|SSH_SUBPROCESS_STDERR_DISCARD)) == 0)
 		goto out;
 
 	uid_swapped = 1;
-	temporarily_use_uid(pw);
+	temporarily_use_uid(runas_pw);
 
-	ok = check_authkeys_file(f, options.authorized_keys_command, key, pw);
+	ok = check_authkeys_file(ssh, user_pw, f,
+	    options.authorized_keys_command, key, authoptsp);
 
 	fclose(f);
 	f = NULL;
 
-	if (exited_cleanly(pid, "AuthorizedKeysCommand", command) != 0)
+	if (exited_cleanly(pid, "AuthorizedKeysCommand", command, 0) != 0)
 		goto out;
 
 	/* Read completed successfully */
@@ -1088,65 +989,47 @@
  * Check whether key authenticates and authorises the user.
  */
 int
-user_key_allowed(struct passwd *pw, Key *key, int auth_attempt)
+user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key,
+    int auth_attempt, struct sshauthopt **authoptsp)
 {
 	u_int success, i;
 	char *file;
+	struct sshauthopt *opts = NULL;
+	if (authoptsp != NULL)
+		*authoptsp = NULL;
 
 	if (auth_key_is_revoked(key))
 		return 0;
-	if (key_is_cert(key) && auth_key_is_revoked(key->cert->signature_key))
+	if (sshkey_is_cert(key) &&
+	    auth_key_is_revoked(key->cert->signature_key))
 		return 0;
 
-	success = user_cert_trusted_ca(pw, key);
-	if (success)
-		return success;
+	if ((success = user_cert_trusted_ca(ssh, pw, key, &opts)) != 0)
+		goto out;
+	sshauthopt_free(opts);
+	opts = NULL;
 
-	success = user_key_command_allowed2(pw, key);
-	if (success > 0)
-		return success;
+	if ((success = user_key_command_allowed2(ssh, pw, key, &opts)) != 0)
+		goto out;
+	sshauthopt_free(opts);
+	opts = NULL;
 
 	for (i = 0; !success && i < options.num_authkeys_files; i++) {
-
 		if (strcasecmp(options.authorized_keys_files[i], "none") == 0)
 			continue;
 		file = expand_authorized_keys(
 		    options.authorized_keys_files[i], pw);
-
-		success = user_key_allowed2(pw, key, file);
+		success = user_key_allowed2(ssh, pw, key, file, &opts);
 		free(file);
 	}
 
-	return success;
-}
-
-/* Records a public key in the list of previously-successful keys */
-void
-auth2_record_userkey(Authctxt *authctxt, struct sshkey *key)
-{
-	struct sshkey **tmp;
-
-	if (authctxt->nprev_userkeys >= INT_MAX ||
-	    (tmp = reallocarray(authctxt->prev_userkeys,
-	    authctxt->nprev_userkeys + 1, sizeof(*tmp))) == NULL)
-		fatal("%s: reallocarray failed", __func__);
-	authctxt->prev_userkeys = tmp;
-	authctxt->prev_userkeys[authctxt->nprev_userkeys] = key;
-	authctxt->nprev_userkeys++;
-}
-
-/* Checks whether a key has already been used successfully for authentication */
-int
-auth2_userkey_already_used(Authctxt *authctxt, struct sshkey *key)
-{
-	u_int i;
-
-	for (i = 0; i < authctxt->nprev_userkeys; i++) {
-		if (sshkey_equal_public(key, authctxt->prev_userkeys[i])) {
-			return 1;
-		}
+ out:
+	if (success && authoptsp != NULL) {
+		*authoptsp = opts;
+		opts = NULL;
 	}
-	return 0;
+	sshauthopt_free(opts);
+	return success;
 }
 
 Authmethod method_pubkey = {
diff --git a/auth2.c b/auth2.c
index 97dd2ef..7adf632 100644
--- a/auth2.c
+++ b/auth2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2.c,v 1.137 2017/02/03 23:05:57 djm Exp $ */
+/* $OpenBSD: auth2.c,v 1.149 2018/07/11 18:53:29 markus Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -30,9 +30,11 @@
 #include <sys/uio.h>
 
 #include <fcntl.h>
+#include <limits.h>
 #include <pwd.h>
 #include <stdarg.h>
 #include <string.h>
+#include <time.h>
 #include <unistd.h>
 
 #include "atomicio.h"
@@ -40,27 +42,30 @@
 #include "ssh2.h"
 #include "packet.h"
 #include "log.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "misc.h"
 #include "servconf.h"
 #include "compat.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "dispatch.h"
 #include "pathnames.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 
 #ifdef GSSAPI
 #include "ssh-gss.h"
 #endif
 #include "monitor_wrap.h"
+#include "ssherr.h"
+#include "digest.h"
 
 /* import */
 extern ServerOptions options;
 extern u_char *session_id2;
 extern u_int session_id2_len;
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
 
 /* methods */
 
@@ -87,8 +92,8 @@
 
 /* protocol */
 
-static int input_service_request(int, u_int32_t, void *);
-static int input_userauth_request(int, u_int32_t, void *);
+static int input_service_request(int, u_int32_t, struct ssh *);
+static int input_userauth_request(int, u_int32_t, struct ssh *);
 
 /* helper */
 static Authmethod *authmethod_lookup(Authctxt *, const char *);
@@ -136,9 +141,6 @@
 void
 userauth_send_banner(const char *msg)
 {
-	if (datafellows & SSH_BUG_BANNER)
-		return;
-
 	packet_start(SSH2_MSG_USERAUTH_BANNER);
 	packet_put_cstring(msg);
 	packet_put_cstring("");		/* language, unused */
@@ -151,7 +153,7 @@
 {
 	char *banner = NULL;
 
-	if (options.banner == NULL || (datafellows & SSH_BUG_BANNER) != 0)
+	if (options.banner == NULL)
 		return;
 
 	if ((banner = PRIVSEP(auth2_read_banner())) == NULL)
@@ -168,16 +170,19 @@
 void
 do_authentication2(Authctxt *authctxt)
 {
-	dispatch_init(&dispatch_protocol_error);
-	dispatch_set(SSH2_MSG_SERVICE_REQUEST, &input_service_request);
-	dispatch_run(DISPATCH_BLOCK, &authctxt->success, authctxt);
+	struct ssh *ssh = active_state;		/* XXX */
+	ssh->authctxt = authctxt;		/* XXX move to caller */
+	ssh_dispatch_init(ssh, &dispatch_protocol_error);
+	ssh_dispatch_set(ssh, SSH2_MSG_SERVICE_REQUEST, &input_service_request);
+	ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &authctxt->success);
+	ssh->authctxt = NULL;
 }
 
 /*ARGSUSED*/
 static int
-input_service_request(int type, u_int32_t seq, void *ctxt)
+input_service_request(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	u_int len;
 	int acceptit = 0;
 	char *service = packet_get_cstring(&len);
@@ -190,7 +195,7 @@
 		if (!authctxt->success) {
 			acceptit = 1;
 			/* now we can handle user-auth requests */
-			dispatch_set(SSH2_MSG_USERAUTH_REQUEST, &input_userauth_request);
+			ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_REQUEST, &input_userauth_request);
 		}
 	}
 	/* XXX all other service requests are denied */
@@ -208,15 +213,52 @@
 	return 0;
 }
 
+#define MIN_FAIL_DELAY_SECONDS 0.005
+static double
+user_specific_delay(const char *user)
+{
+	char b[512];
+	size_t len = ssh_digest_bytes(SSH_DIGEST_SHA512);
+	u_char *hash = xmalloc(len);
+	double delay;
+
+	(void)snprintf(b, sizeof b, "%llu%s",
+	     (unsigned long long)options.timing_secret, user);
+	if (ssh_digest_memory(SSH_DIGEST_SHA512, b, strlen(b), hash, len) != 0)
+		fatal("%s: ssh_digest_memory", __func__);
+	/* 0-4.2 ms of delay */
+	delay = (double)PEEK_U32(hash) / 1000 / 1000 / 1000 / 1000;
+	freezero(hash, len);
+	debug3("%s: user specific delay %0.3lfms", __func__, delay/1000);
+	return MIN_FAIL_DELAY_SECONDS + delay;
+}
+
+static void
+ensure_minimum_time_since(double start, double seconds)
+{
+	struct timespec ts;
+	double elapsed = monotime_double() - start, req = seconds, remain;
+
+	/* if we've already passed the requested time, scale up */
+	while ((remain = seconds - elapsed) < 0.0)
+		seconds *= 2;
+
+	ts.tv_sec = remain;
+	ts.tv_nsec = (remain - ts.tv_sec) * 1000000000;
+	debug3("%s: elapsed %0.3lfms, delaying %0.3lfms (requested %0.3lfms)",
+	    __func__, elapsed*1000, remain*1000, req*1000);
+	nanosleep(&ts, NULL);
+}
+
 /*ARGSUSED*/
 static int
-input_userauth_request(int type, u_int32_t seq, void *ctxt)
+input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = active_state;	/* XXX */
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	Authmethod *m = NULL;
 	char *user, *service, *method, *style = NULL;
 	int authenticated = 0;
+	double tstart = monotime_double();
 
 	if (authctxt == NULL)
 		fatal("input_userauth_request: no authctxt");
@@ -267,14 +309,15 @@
 		    authctxt->user, authctxt->service, user, service);
 	}
 	/* reset state */
-	auth2_challenge_stop(authctxt);
+	auth2_challenge_stop(ssh);
 
 #ifdef GSSAPI
 	/* XXX move to auth2_gssapi_stop() */
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);
 #endif
 
+	auth2_authctxt_reset_info(authctxt);
 	authctxt->postponed = 0;
 	authctxt->server_caused_failure = 0;
 
@@ -282,9 +325,12 @@
 	m = authmethod_lookup(authctxt, method);
 	if (m != NULL && authctxt->failures < options.max_authtries) {
 		debug2("input_userauth_request: try method %s", method);
-		authenticated =	m->userauth(authctxt);
+		authenticated =	m->userauth(ssh);
 	}
-	userauth_finish(authctxt, authenticated, method, NULL);
+	if (!authctxt->authenticated)
+		ensure_minimum_time_since(tstart,
+		    user_specific_delay(authctxt->user));
+	userauth_finish(ssh, authenticated, method, NULL);
 
 	free(service);
 	free(user);
@@ -293,10 +339,10 @@
 }
 
 void
-userauth_finish(Authctxt *authctxt, int authenticated, const char *method,
+userauth_finish(struct ssh *ssh, int authenticated, const char *method,
     const char *submethod)
 {
-	struct ssh *ssh = active_state;	/* XXX */
+	Authctxt *authctxt = ssh->authctxt;
 	char *methods;
 	int partial = 0;
 
@@ -308,7 +354,7 @@
 
 	/* Special handling for root */
 	if (authenticated && authctxt->pw->pw_uid == 0 &&
-	    !auth_root_allowed(method)) {
+	    !auth_root_allowed(ssh, method)) {
 		authenticated = 0;
 #ifdef SSH_AUDIT_EVENTS
 		PRIVSEP(audit_event(SSH_LOGIN_ROOT_DENIED));
@@ -325,16 +371,24 @@
 	/* Log before sending the reply */
 	auth_log(authctxt, authenticated, partial, method, submethod);
 
+	/* Update information exposed to session */
+	if (authenticated || partial)
+		auth2_update_session_info(authctxt, method, submethod);
+
 	if (authctxt->postponed)
 		return;
 
 #ifdef USE_PAM
 	if (options.use_pam && authenticated) {
+		int r;
+
 		if (!PRIVSEP(do_pam_account())) {
 			/* if PAM returned a message, send it to the user */
-			if (buffer_len(&loginmsg) > 0) {
-				buffer_append(&loginmsg, "\0", 1);
-				userauth_send_banner(buffer_ptr(&loginmsg));
+			if (sshbuf_len(loginmsg) > 0) {
+				if ((r = sshbuf_put(loginmsg, "\0", 1)) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
+				userauth_send_banner(sshbuf_ptr(loginmsg));
 				packet_write_wait();
 			}
 			fatal("Access denied for user %s by PAM account "
@@ -343,16 +397,9 @@
 	}
 #endif
 
-#ifdef _UNICOS
-	if (authenticated && cray_access_denied(authctxt->user)) {
-		authenticated = 0;
-		fatal("Access denied for user %s.", authctxt->user);
-	}
-#endif /* _UNICOS */
-
 	if (authenticated == 1) {
 		/* turn off userauth */
-		dispatch_set(SSH2_MSG_USERAUTH_REQUEST, &dispatch_protocol_ignore);
+		ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_REQUEST, &dispatch_protocol_ignore);
 		packet_start(SSH2_MSG_USERAUTH_SUCCESS);
 		packet_send();
 		packet_write_wait();
@@ -360,7 +407,6 @@
 		authctxt->success = 1;
 		ssh_packet_set_log_preamble(ssh, "user %s", authctxt->user);
 	} else {
-
 		/* Allow initial try of "none" auth without failure penalty */
 		if (!partial && !authctxt->server_caused_failure &&
 		    (authctxt->attempt > 1 || strcmp(method, "none") != 0))
@@ -411,11 +457,12 @@
 static char *
 authmethods_get(Authctxt *authctxt)
 {
-	Buffer b;
+	struct sshbuf *b;
 	char *list;
-	u_int i;
+	int i, r;
 
-	buffer_init(&b);
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	for (i = 0; authmethods[i] != NULL; i++) {
 		if (strcmp(authmethods[i]->name, "none") == 0)
 			continue;
@@ -425,14 +472,13 @@
 		if (!auth2_method_allowed(authctxt, authmethods[i]->name,
 		    NULL))
 			continue;
-		if (buffer_len(&b) > 0)
-			buffer_append(&b, ",", 1);
-		buffer_append(&b, authmethods[i]->name,
-		    strlen(authmethods[i]->name));
+		if ((r = sshbuf_putf(b, "%s%s", sshbuf_len(b) ? "," : "",
+		    authmethods[i]->name)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
-	if ((list = sshbuf_dup_string(&b)) == NULL)
+	if ((list = sshbuf_dup_string(b)) == NULL)
 		fatal("%s: sshbuf_dup_string failed", __func__);
-	buffer_free(&b);
+	sshbuf_free(b);
 	return list;
 }
 
@@ -622,4 +668,128 @@
 	return 0;
 }
 
+/* Reset method-specific information */
+void auth2_authctxt_reset_info(Authctxt *authctxt)
+{
+	sshkey_free(authctxt->auth_method_key);
+	free(authctxt->auth_method_info);
+	authctxt->auth_method_key = NULL;
+	authctxt->auth_method_info = NULL;
+}
+
+/* Record auth method-specific information for logs */
+void
+auth2_record_info(Authctxt *authctxt, const char *fmt, ...)
+{
+	va_list ap;
+        int i;
+
+	free(authctxt->auth_method_info);
+	authctxt->auth_method_info = NULL;
+
+	va_start(ap, fmt);
+	i = vasprintf(&authctxt->auth_method_info, fmt, ap);
+	va_end(ap);
+
+	if (i < 0 || authctxt->auth_method_info == NULL)
+		fatal("%s: vasprintf failed", __func__);
+}
+
+/*
+ * Records a public key used in authentication. This is used for logging
+ * and to ensure that the same key is not subsequently accepted again for
+ * multiple authentication.
+ */
+void
+auth2_record_key(Authctxt *authctxt, int authenticated,
+    const struct sshkey *key)
+{
+	struct sshkey **tmp, *dup;
+	int r;
+
+	if ((r = sshkey_demote(key, &dup)) != 0)
+		fatal("%s: copy key: %s", __func__, ssh_err(r));
+	sshkey_free(authctxt->auth_method_key);
+	authctxt->auth_method_key = dup;
+
+	if (!authenticated)
+		return;
+
+	/* If authenticated, make sure we don't accept this key again */
+	if ((r = sshkey_demote(key, &dup)) != 0)
+		fatal("%s: copy key: %s", __func__, ssh_err(r));
+	if (authctxt->nprev_keys >= INT_MAX ||
+	    (tmp = recallocarray(authctxt->prev_keys, authctxt->nprev_keys,
+	    authctxt->nprev_keys + 1, sizeof(*authctxt->prev_keys))) == NULL)
+		fatal("%s: reallocarray failed", __func__);
+	authctxt->prev_keys = tmp;
+	authctxt->prev_keys[authctxt->nprev_keys] = dup;
+	authctxt->nprev_keys++;
+
+}
+
+/* Checks whether a key has already been previously used for authentication */
+int
+auth2_key_already_used(Authctxt *authctxt, const struct sshkey *key)
+{
+	u_int i;
+	char *fp;
+
+	for (i = 0; i < authctxt->nprev_keys; i++) {
+		if (sshkey_equal_public(key, authctxt->prev_keys[i])) {
+			fp = sshkey_fingerprint(authctxt->prev_keys[i],
+			    options.fingerprint_hash, SSH_FP_DEFAULT);
+			debug3("%s: key already used: %s %s", __func__,
+			    sshkey_type(authctxt->prev_keys[i]),
+			    fp == NULL ? "UNKNOWN" : fp);
+			free(fp);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/*
+ * Updates authctxt->session_info with details of authentication. Should be
+ * whenever an authentication method succeeds.
+ */
+void
+auth2_update_session_info(Authctxt *authctxt, const char *method,
+    const char *submethod)
+{
+	int r;
+
+	if (authctxt->session_info == NULL) {
+		if ((authctxt->session_info = sshbuf_new()) == NULL)
+			fatal("%s: sshbuf_new", __func__);
+	}
+
+	/* Append method[/submethod] */
+	if ((r = sshbuf_putf(authctxt->session_info, "%s%s%s",
+	    method, submethod == NULL ? "" : "/",
+	    submethod == NULL ? "" : submethod)) != 0)
+		fatal("%s: append method: %s", __func__, ssh_err(r));
+
+	/* Append key if present */
+	if (authctxt->auth_method_key != NULL) {
+		if ((r = sshbuf_put_u8(authctxt->session_info, ' ')) != 0 ||
+		    (r = sshkey_format_text(authctxt->auth_method_key,
+		    authctxt->session_info)) != 0)
+			fatal("%s: append key: %s", __func__, ssh_err(r));
+	}
+
+	if (authctxt->auth_method_info != NULL) {
+		/* Ensure no ambiguity here */
+		if (strchr(authctxt->auth_method_info, '\n') != NULL)
+			fatal("%s: auth_method_info contains \\n", __func__);
+		if ((r = sshbuf_put_u8(authctxt->session_info, ' ')) != 0 ||
+		    (r = sshbuf_putf(authctxt->session_info, "%s",
+		    authctxt->auth_method_info)) != 0) {
+			fatal("%s: append method info: %s",
+			    __func__, ssh_err(r));
+		}
+	}
+	if ((r = sshbuf_put_u8(authctxt->session_info, '\n')) != 0)
+		fatal("%s: append: %s", __func__, ssh_err(r));
+}
 
diff --git a/authfd.c b/authfd.c
index a634bcb..ecdd869 100644
--- a/authfd.c
+++ b/authfd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: authfd.c,v 1.100 2015/12/04 16:41:28 markus Exp $ */
+/* $OpenBSD: authfd.c,v 1.111 2018/07/09 21:59:10 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -51,7 +51,6 @@
 
 #include "xmalloc.h"
 #include "ssh.h"
-#include "rsa.h"
 #include "sshbuf.h"
 #include "sshkey.h"
 #include "authfd.h"
@@ -130,11 +129,11 @@
 
 	/* Get the length of the message, and format it in the buffer. */
 	len = sshbuf_len(request);
-	put_u32(buf, len);
+	POKE_U32(buf, len);
 
 	/* Send the length and then the packet to the agent. */
 	if (atomicio(vwrite, sock, buf, 4) != 4 ||
-	    atomicio(vwrite, sock, (u_char *)sshbuf_ptr(request),
+	    atomicio(vwrite, sock, sshbuf_mutable_ptr(request),
 	    sshbuf_len(request)) != sshbuf_len(request))
 		return SSH_ERR_AGENT_COMMUNICATION;
 	/*
@@ -145,7 +144,7 @@
 	    return SSH_ERR_AGENT_COMMUNICATION;
 
 	/* Extract the length, and check it for sanity. */
-	len = get_u32(buf);
+	len = PEEK_U32(buf);
 	if (len > MAX_AGENT_REPLY_LEN)
 		return SSH_ERR_INVALID_FORMAT;
 
@@ -199,43 +198,6 @@
 	return r;
 }
 
-#ifdef WITH_SSH1
-static int
-deserialise_identity1(struct sshbuf *ids, struct sshkey **keyp, char **commentp)
-{
-	struct sshkey *key;
-	int r, keybits;
-	u_int32_t bits;
-	char *comment = NULL;
-
-	if ((key = sshkey_new(KEY_RSA1)) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-	if ((r = sshbuf_get_u32(ids, &bits)) != 0 ||
-	    (r = sshbuf_get_bignum1(ids, key->rsa->e)) != 0 ||
-	    (r = sshbuf_get_bignum1(ids, key->rsa->n)) != 0 ||
-	    (r = sshbuf_get_cstring(ids, &comment, NULL)) != 0)
-		goto out;
-	keybits = BN_num_bits(key->rsa->n);
-	/* XXX previously we just warned here. I think we should be strict */
-	if (keybits < 0 || bits != (u_int)keybits) {
-		r = SSH_ERR_KEY_BITS_MISMATCH;
-		goto out;
-	}
-	if (keyp != NULL) {
-		*keyp = key;
-		key = NULL;
-	}
-	if (commentp != NULL) {
-		*commentp = comment;
-		comment = NULL;
-	}
-	r = 0;
- out:
-	sshkey_free(key);
-	free(comment);
-	return r;
-}
-#endif
 
 static int
 deserialise_identity2(struct sshbuf *ids, struct sshkey **keyp, char **commentp)
@@ -264,35 +226,21 @@
  * Fetch list of identities held by the agent.
  */
 int
-ssh_fetch_identitylist(int sock, int version, struct ssh_identitylist **idlp)
+ssh_fetch_identitylist(int sock, struct ssh_identitylist **idlp)
 {
-	u_char type, code1 = 0, code2 = 0;
+	u_char type;
 	u_int32_t num, i;
 	struct sshbuf *msg;
 	struct ssh_identitylist *idl = NULL;
 	int r;
 
-	/* Determine request and expected response types */
-	switch (version) {
-	case 1:
-		code1 = SSH_AGENTC_REQUEST_RSA_IDENTITIES;
-		code2 = SSH_AGENT_RSA_IDENTITIES_ANSWER;
-		break;
-	case 2:
-		code1 = SSH2_AGENTC_REQUEST_IDENTITIES;
-		code2 = SSH2_AGENT_IDENTITIES_ANSWER;
-		break;
-	default:
-		return SSH_ERR_INVALID_ARGUMENT;
-	}
-
 	/*
 	 * Send a message to the agent requesting for a list of the
 	 * identities it can represent.
 	 */
 	if ((msg = sshbuf_new()) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
-	if ((r = sshbuf_put_u8(msg, code1)) != 0)
+	if ((r = sshbuf_put_u8(msg, SSH2_AGENTC_REQUEST_IDENTITIES)) != 0)
 		goto out;
 
 	if ((r = ssh_request_reply(sock, msg, msg)) != 0)
@@ -304,7 +252,7 @@
 	if (agent_failed(type)) {
 		r = SSH_ERR_AGENT_FAILURE;
 		goto out;
-	} else if (type != code2) {
+	} else if (type != SSH2_AGENT_IDENTITIES_ANSWER) {
 		r = SSH_ERR_INVALID_FORMAT;
 		goto out;
 	}
@@ -329,25 +277,14 @@
 		goto out;
 	}
 	for (i = 0; i < num;) {
-		switch (version) {
-		case 1:
-#ifdef WITH_SSH1
-			if ((r = deserialise_identity1(msg,
-			    &(idl->keys[i]), &(idl->comments[i]))) != 0)
+		if ((r = deserialise_identity2(msg, &(idl->keys[i]),
+		    &(idl->comments[i]))) != 0) {
+			if (r == SSH_ERR_KEY_TYPE_UNKNOWN) {
+				/* Gracefully skip unknown key types */
+				num--;
+				continue;
+			} else
 				goto out;
-#endif
-			break;
-		case 2:
-			if ((r = deserialise_identity2(msg,
-			    &(idl->keys[i]), &(idl->comments[i]))) != 0) {
-				if (r == SSH_ERR_KEY_TYPE_UNKNOWN) {
-					/* Gracefully skip unknown key types */
-					num--;
-					continue;
-				} else
-					goto out;
-			}
-			break;
 		}
 		i++;
 	}
@@ -385,50 +322,10 @@
  * otherwise.
  */
 
-#ifdef WITH_SSH1
-int
-ssh_decrypt_challenge(int sock, struct sshkey* key, BIGNUM *challenge,
-    u_char session_id[16], u_char response[16])
-{
-	struct sshbuf *msg;
-	int r;
-	u_char type;
 
-	if (key->type != KEY_RSA1)
-		return SSH_ERR_INVALID_ARGUMENT;
-	if ((msg = sshbuf_new()) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-	if ((r = sshbuf_put_u8(msg, SSH_AGENTC_RSA_CHALLENGE)) != 0 ||
-	    (r = sshbuf_put_u32(msg, BN_num_bits(key->rsa->n))) != 0 ||
-	    (r = sshbuf_put_bignum1(msg, key->rsa->e)) != 0 ||
-	    (r = sshbuf_put_bignum1(msg, key->rsa->n)) != 0 ||
-	    (r = sshbuf_put_bignum1(msg, challenge)) != 0 ||
-	    (r = sshbuf_put(msg, session_id, 16)) != 0 ||
-	    (r = sshbuf_put_u32(msg, 1)) != 0) /* Response type for proto 1.1 */
-		goto out;
-	if ((r = ssh_request_reply(sock, msg, msg)) != 0)
-		goto out;
-	if ((r = sshbuf_get_u8(msg, &type)) != 0)
-		goto out;
-	if (agent_failed(type)) {
-		r = SSH_ERR_AGENT_FAILURE;
-		goto out;
-	} else if (type != SSH_AGENT_RSA_RESPONSE) {
-		r = SSH_ERR_INVALID_FORMAT;
-		goto out;
-	}
-	if ((r = sshbuf_get(msg, response, 16)) != 0)
-		goto out;
-	r = 0;
- out:
-	sshbuf_free(msg);
-	return r;
-}
-#endif
-
-/* encode signature algoritm in flag bits, so we can keep the msg format */
+/* encode signature algorithm in flag bits, so we can keep the msg format */
 static u_int
-agent_encode_alg(struct sshkey *key, const char *alg)
+agent_encode_alg(const struct sshkey *key, const char *alg)
 {
 	if (alg != NULL && key->type == KEY_RSA) {
 		if (strcmp(alg, "rsa-sha2-256") == 0)
@@ -441,13 +338,13 @@
 
 /* ask agent to sign data, returns err.h code on error, 0 on success */
 int
-ssh_agent_sign(int sock, struct sshkey *key,
+ssh_agent_sign(int sock, const struct sshkey *key,
     u_char **sigp, size_t *lenp,
     const u_char *data, size_t datalen, const char *alg, u_int compat)
 {
 	struct sshbuf *msg;
-	u_char *blob = NULL, type;
-	size_t blen = 0, len = 0;
+	u_char *sig = NULL, type = 0;
+	size_t len = 0;
 	u_int flags = 0;
 	int r = SSH_ERR_INTERNAL_ERROR;
 
@@ -456,15 +353,11 @@
 
 	if (datalen > SSH_KEY_MAX_SIGN_DATA_SIZE)
 		return SSH_ERR_INVALID_ARGUMENT;
-	if (compat & SSH_BUG_SIGBLOB)
-		flags |= SSH_AGENT_OLD_SIGNATURE;
 	if ((msg = sshbuf_new()) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
-	if ((r = sshkey_to_blob(key, &blob, &blen)) != 0)
-		goto out;
 	flags |= agent_encode_alg(key, alg);
 	if ((r = sshbuf_put_u8(msg, SSH2_AGENTC_SIGN_REQUEST)) != 0 ||
-	    (r = sshbuf_put_string(msg, blob, blen)) != 0 ||
+	    (r = sshkey_puts(key, msg)) != 0 ||
 	    (r = sshbuf_put_string(msg, data, datalen)) != 0 ||
 	    (r = sshbuf_put_u32(msg, flags)) != 0)
 		goto out;
@@ -479,55 +372,28 @@
 		r = SSH_ERR_INVALID_FORMAT;
 		goto out;
 	}
-	if ((r = sshbuf_get_string(msg, sigp, &len)) != 0)
+	if ((r = sshbuf_get_string(msg, &sig, &len)) != 0)
 		goto out;
+	/* Check what we actually got back from the agent. */
+	if ((r = sshkey_check_sigtype(sig, len, alg)) != 0)
+		goto out;
+	/* success */
+	*sigp = sig;
 	*lenp = len;
+	sig = NULL;
+	len = 0;
 	r = 0;
  out:
-	if (blob != NULL) {
-		explicit_bzero(blob, blen);
-		free(blob);
-	}
+	freezero(sig, len);
 	sshbuf_free(msg);
 	return r;
 }
 
 /* Encode key for a message to the agent. */
 
-#ifdef WITH_SSH1
-static int
-ssh_encode_identity_rsa1(struct sshbuf *b, RSA *key, const char *comment)
-{
-	int r;
-
-	/* To keep within the protocol: p < q for ssh. in SSL p > q */
-	if ((r = sshbuf_put_u32(b, BN_num_bits(key->n))) != 0 ||
-	    (r = sshbuf_put_bignum1(b, key->n)) != 0 ||
-	    (r = sshbuf_put_bignum1(b, key->e)) != 0 ||
-	    (r = sshbuf_put_bignum1(b, key->d)) != 0 ||
-	    (r = sshbuf_put_bignum1(b, key->iqmp)) != 0 ||
-	    (r = sshbuf_put_bignum1(b, key->q)) != 0 ||
-	    (r = sshbuf_put_bignum1(b, key->p)) != 0 ||
-	    (r = sshbuf_put_cstring(b, comment)) != 0)
-		return r;
-	return 0;
-}
-#endif
 
 static int
-ssh_encode_identity_ssh2(struct sshbuf *b, struct sshkey *key,
-    const char *comment)
-{
-	int r;
-
-	if ((r = sshkey_private_serialize(key, b)) != 0 ||
-	    (r = sshbuf_put_cstring(b, comment)) != 0)
-		return r;
-	return 0;
-}
-
-static int
-encode_constraints(struct sshbuf *m, u_int life, u_int confirm)
+encode_constraints(struct sshbuf *m, u_int life, u_int confirm, u_int maxsign)
 {
 	int r;
 
@@ -540,6 +406,11 @@
 		if ((r = sshbuf_put_u8(m, SSH_AGENT_CONSTRAIN_CONFIRM)) != 0)
 			goto out;
 	}
+	if (maxsign != 0) {
+		if ((r = sshbuf_put_u8(m, SSH_AGENT_CONSTRAIN_MAXSIGN)) != 0 ||
+		    (r = sshbuf_put_u32(m, maxsign)) != 0)
+			goto out;
+	}
 	r = 0;
  out:
 	return r;
@@ -550,27 +421,17 @@
  * This call is intended only for use by ssh-add(1) and like applications.
  */
 int
-ssh_add_identity_constrained(int sock, struct sshkey *key, const char *comment,
-    u_int life, u_int confirm)
+ssh_add_identity_constrained(int sock, const struct sshkey *key,
+    const char *comment, u_int life, u_int confirm, u_int maxsign)
 {
 	struct sshbuf *msg;
-	int r, constrained = (life || confirm);
+	int r, constrained = (life || confirm || maxsign);
 	u_char type;
 
 	if ((msg = sshbuf_new()) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
 
 	switch (key->type) {
-#ifdef WITH_SSH1
-	case KEY_RSA1:
-		type = constrained ?
-		    SSH_AGENTC_ADD_RSA_ID_CONSTRAINED :
-		    SSH_AGENTC_ADD_RSA_IDENTITY;
-		if ((r = sshbuf_put_u8(msg, type)) != 0 ||
-		    (r = ssh_encode_identity_rsa1(msg, key->rsa, comment)) != 0)
-			goto out;
-		break;
-#endif
 #ifdef WITH_OPENSSL
 	case KEY_RSA:
 	case KEY_RSA_CERT:
@@ -581,11 +442,15 @@
 #endif
 	case KEY_ED25519:
 	case KEY_ED25519_CERT:
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
 		type = constrained ?
 		    SSH2_AGENTC_ADD_ID_CONSTRAINED :
 		    SSH2_AGENTC_ADD_IDENTITY;
 		if ((r = sshbuf_put_u8(msg, type)) != 0 ||
-		    (r = ssh_encode_identity_ssh2(msg, key, comment)) != 0)
+		    (r = sshkey_private_serialize_maxsign(key, msg, maxsign,
+		    NULL)) != 0 ||
+		    (r = sshbuf_put_cstring(msg, comment)) != 0)
 			goto out;
 		break;
 	default:
@@ -593,7 +458,7 @@
 		goto out;
 	}
 	if (constrained &&
-	    (r = encode_constraints(msg, life, confirm)) != 0)
+	    (r = encode_constraints(msg, life, confirm, maxsign)) != 0)
 		goto out;
 	if ((r = ssh_request_reply(sock, msg, msg)) != 0)
 		goto out;
@@ -620,16 +485,6 @@
 	if ((msg = sshbuf_new()) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
 
-#ifdef WITH_SSH1
-	if (key->type == KEY_RSA1) {
-		if ((r = sshbuf_put_u8(msg,
-		    SSH_AGENTC_REMOVE_RSA_IDENTITY)) != 0 ||
-		    (r = sshbuf_put_u32(msg, BN_num_bits(key->rsa->n))) != 0 ||
-		    (r = sshbuf_put_bignum1(msg, key->rsa->e)) != 0 ||
-		    (r = sshbuf_put_bignum1(msg, key->rsa->n)) != 0)
-			goto out;
-	} else
-#endif
 	if (key->type != KEY_UNSPEC) {
 		if ((r = sshkey_to_blob(key, &blob, &blen)) != 0)
 			goto out;
@@ -681,7 +536,7 @@
 	    (r = sshbuf_put_cstring(msg, pin)) != 0)
 		goto out;
 	if (constrained &&
-	    (r = encode_constraints(msg, life, confirm)) != 0)
+	    (r = encode_constraints(msg, life, confirm, 0)) != 0)
 		goto out;
 	if ((r = ssh_request_reply(sock, msg, msg)) != 0)
 		goto out;
@@ -696,6 +551,10 @@
 /*
  * Removes all identities from the agent.
  * This call is intended only for use by ssh-add(1) and like applications.
+ *
+ * This supports the SSH protocol 1 message to because, when clearing all
+ * keys from an agent, we generally want to clear both protocol v1 and v2
+ * keys.
  */
 int
 ssh_remove_all_identities(int sock, int version)
diff --git a/authfd.h b/authfd.h
index 4b417e3..a032fd5 100644
--- a/authfd.h
+++ b/authfd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: authfd.h,v 1.39 2015/12/04 16:41:28 markus Exp $ */
+/* $OpenBSD: authfd.h,v 1.44 2018/07/12 04:35:25 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -27,19 +27,16 @@
 void	ssh_close_authentication_socket(int sock);
 
 int	ssh_lock_agent(int sock, int lock, const char *password);
-int	ssh_fetch_identitylist(int sock, int version,
-	    struct ssh_identitylist **idlp);
+int	ssh_fetch_identitylist(int sock, struct ssh_identitylist **idlp);
 void	ssh_free_identitylist(struct ssh_identitylist *idl);
-int	ssh_add_identity_constrained(int sock, struct sshkey *key,
-	    const char *comment, u_int life, u_int confirm);
+int	ssh_add_identity_constrained(int sock, const struct sshkey *key,
+	    const char *comment, u_int life, u_int confirm, u_int maxsign);
 int	ssh_remove_identity(int sock, struct sshkey *key);
 int	ssh_update_card(int sock, int add, const char *reader_id,
 	    const char *pin, u_int life, u_int confirm);
 int	ssh_remove_all_identities(int sock, int version);
 
-int	ssh_decrypt_challenge(int sock, struct sshkey* key, BIGNUM *challenge,
-	    u_char session_id[16], u_char response[16]);
-int	ssh_agent_sign(int sock, struct sshkey *key,
+int	ssh_agent_sign(int sock, const struct sshkey *key,
 	    u_char **sigp, size_t *lenp,
 	    const u_char *data, size_t datalen, const char *alg, u_int compat);
 
@@ -78,6 +75,7 @@
 
 #define	SSH_AGENT_CONSTRAIN_LIFETIME		1
 #define	SSH_AGENT_CONSTRAIN_CONFIRM		2
+#define	SSH_AGENT_CONSTRAIN_MAXSIGN		3
 
 /* extended failure messages */
 #define SSH2_AGENT_FAILURE			30
diff --git a/authfile.c b/authfile.c
index 7411b68..be4a577 100644
--- a/authfile.c
+++ b/authfile.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: authfile.c,v 1.122 2016/11/25 23:24:45 djm Exp $ */
+/* $OpenBSD: authfile.c,v 1.130 2018/07/09 21:59:10 markus Exp $ */
 /*
  * Copyright (c) 2000, 2013 Markus Friedl.  All rights reserved.
  *
@@ -42,7 +42,6 @@
 #include "ssh.h"
 #include "log.h"
 #include "authfile.h"
-#include "rsa.h"
 #include "misc.h"
 #include "atomicio.h"
 #include "sshkey.h"
@@ -60,7 +59,7 @@
 
 	if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
 		return SSH_ERR_SYSTEM_ERROR;
-	if (atomicio(vwrite, fd, (u_char *)sshbuf_ptr(keybuf),
+	if (atomicio(vwrite, fd, sshbuf_mutable_ptr(keybuf),
 	    sshbuf_len(keybuf)) != sshbuf_len(keybuf)) {
 		oerrno = errno;
 		close(fd);
@@ -100,25 +99,13 @@
 	u_char buf[1024];
 	size_t len;
 	struct stat st;
-	int r, dontmax = 0;
+	int r;
 
 	if (fstat(fd, &st) < 0)
 		return SSH_ERR_SYSTEM_ERROR;
 	if ((st.st_mode & (S_IFSOCK|S_IFCHR|S_IFIFO)) == 0 &&
 	    st.st_size > MAX_KEY_FILE_SIZE)
 		return SSH_ERR_INVALID_FORMAT;
-	/*
-	 * Pre-allocate the buffer used for the key contents and clamp its
-	 * maximum size. This ensures that key contents are never leaked via
-	 * implicit realloc() in the sshbuf code.
-	 */
-	if ((st.st_mode & S_IFREG) == 0 || st.st_size <= 0) {
-		st.st_size = 64*1024; /* 64k should be enough for anyone :) */
-		dontmax = 1;
-	}
-	if ((r = sshbuf_allocate(blob, st.st_size)) != 0 ||
-	    (dontmax && (r = sshbuf_set_max_size(blob, st.st_size)) != 0))
-		return r;
 	for (;;) {
 		if ((len = atomicio(read, fd, buf, sizeof(buf))) == 0) {
 			if (errno == EPIPE)
@@ -147,35 +134,6 @@
 	return r;
 }
 
-#ifdef WITH_SSH1
-/*
- * Loads the public part of the ssh v1 key file.  Returns NULL if an error was
- * encountered (the file does not exist or is not readable), and the key
- * otherwise.
- */
-static int
-sshkey_load_public_rsa1(int fd, struct sshkey **keyp, char **commentp)
-{
-	struct sshbuf *b = NULL;
-	int r;
-
-	if (keyp != NULL)
-		*keyp = NULL;
-	if (commentp != NULL)
-		*commentp = NULL;
-
-	if ((b = sshbuf_new()) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-	if ((r = sshkey_load_file(fd, b)) != 0)
-		goto out;
-	if ((r = sshkey_parse_public_rsa1_fileblob(b, keyp, commentp)) != 0)
-		goto out;
-	r = 0;
- out:
-	sshbuf_free(b);
-	return r;
-}
-#endif /* WITH_SSH1 */
 
 /* XXX remove error() calls from here? */
 int
@@ -233,6 +191,8 @@
 		*perm_ok = 1;
 
 	r = sshkey_load_private_type_fd(fd, type, passphrase, keyp, commentp);
+	if (r == 0 && keyp && *keyp)
+		r = sshkey_set_filename(*keyp, filename);
  out:
 	close(fd);
 	return r;
@@ -291,6 +251,9 @@
 	    (r = sshkey_parse_private_fileblob(buffer, passphrase, keyp,
 	    commentp)) != 0)
 		goto out;
+	if (keyp && *keyp &&
+	    (r = sshkey_set_filename(*keyp, filename)) != 0)
+		goto out;
 	r = 0;
  out:
 	close(fd);
@@ -302,17 +265,15 @@
 sshkey_try_load_public(struct sshkey *k, const char *filename, char **commentp)
 {
 	FILE *f;
-	char line[SSH_MAX_PUBKEY_BYTES];
-	char *cp;
-	u_long linenum = 0;
+	char *line = NULL, *cp;
+	size_t linesize = 0;
 	int r;
 
 	if (commentp != NULL)
 		*commentp = NULL;
 	if ((f = fopen(filename, "r")) == NULL)
 		return SSH_ERR_SYSTEM_ERROR;
-	while (read_keyfile_line(f, filename, line, sizeof(line),
-		    &linenum) != -1) {
+	while (getline(&line, &linesize, f) != -1) {
 		cp = line;
 		switch (*cp) {
 		case '#':
@@ -336,84 +297,59 @@
 					if (*commentp == NULL)
 						r = SSH_ERR_ALLOC_FAIL;
 				}
+				free(line);
 				fclose(f);
 				return r;
 			}
 		}
 	}
+	free(line);
 	fclose(f);
 	return SSH_ERR_INVALID_FORMAT;
 }
 
-/* load public key from ssh v1 private or any pubkey file */
+/* load public key from any pubkey file */
 int
 sshkey_load_public(const char *filename, struct sshkey **keyp, char **commentp)
 {
 	struct sshkey *pub = NULL;
-	char file[PATH_MAX];
-	int r, fd;
+	char *file = NULL;
+	int r;
 
 	if (keyp != NULL)
 		*keyp = NULL;
 	if (commentp != NULL)
 		*commentp = NULL;
 
-	/* XXX should load file once and attempt to parse each format */
-
-	if ((fd = open(filename, O_RDONLY)) < 0)
-		goto skip;
-#ifdef WITH_SSH1
-	/* try rsa1 private key */
-	r = sshkey_load_public_rsa1(fd, keyp, commentp);
-	close(fd);
-	switch (r) {
-	case SSH_ERR_INTERNAL_ERROR:
-	case SSH_ERR_ALLOC_FAIL:
-	case SSH_ERR_INVALID_ARGUMENT:
-	case SSH_ERR_SYSTEM_ERROR:
-	case 0:
-		return r;
-	}
-#else /* WITH_SSH1 */
-	close(fd);
-#endif /* WITH_SSH1 */
-
-	/* try ssh2 public key */
 	if ((pub = sshkey_new(KEY_UNSPEC)) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
 	if ((r = sshkey_try_load_public(pub, filename, commentp)) == 0) {
-		if (keyp != NULL)
+		if (keyp != NULL) {
 			*keyp = pub;
-		return 0;
+			pub = NULL;
+		}
+		r = 0;
+		goto out;
 	}
 	sshkey_free(pub);
 
-#ifdef WITH_SSH1
-	/* try rsa1 public key */
-	if ((pub = sshkey_new(KEY_RSA1)) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-	if ((r = sshkey_try_load_public(pub, filename, commentp)) == 0) {
-		if (keyp != NULL)
-			*keyp = pub;
-		return 0;
-	}
-	sshkey_free(pub);
-#endif /* WITH_SSH1 */
-
- skip:
 	/* try .pub suffix */
-	if ((pub = sshkey_new(KEY_UNSPEC)) == NULL)
+	if (asprintf(&file, "%s.pub", filename) == -1)
 		return SSH_ERR_ALLOC_FAIL;
-	r = SSH_ERR_ALLOC_FAIL;	/* in case strlcpy or strlcat fail */
-	if ((strlcpy(file, filename, sizeof file) < sizeof(file)) &&
-	    (strlcat(file, ".pub", sizeof file) < sizeof(file)) &&
-	    (r = sshkey_try_load_public(pub, file, commentp)) == 0) {
-		if (keyp != NULL)
-			*keyp = pub;
-		return 0;
+	if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
 	}
+	if ((r = sshkey_try_load_public(pub, file, commentp)) == 0) {
+		if (keyp != NULL) {
+			*keyp = pub;
+			pub = NULL;
+		}
+		r = 0;
+	}
+ out:
+	free(file);
 	sshkey_free(pub);
-
 	return r;
 }
 
@@ -466,6 +402,7 @@
 	case KEY_ECDSA:
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
+	case KEY_XMSS:
 	case KEY_UNSPEC:
 		break;
 	default:
@@ -510,19 +447,18 @@
     int check_ca)
 {
 	FILE *f;
-	char line[SSH_MAX_PUBKEY_BYTES];
-	char *cp;
-	u_long linenum = 0;
+	char *line = NULL, *cp;
+	size_t linesize = 0;
 	int r = 0;
 	struct sshkey *pub = NULL;
+
 	int (*sshkey_compare)(const struct sshkey *, const struct sshkey *) =
 	    strict_type ?  sshkey_equal : sshkey_equal_public;
 
 	if ((f = fopen(filename, "r")) == NULL)
 		return SSH_ERR_SYSTEM_ERROR;
 
-	while (read_keyfile_line(f, filename, line, sizeof(line),
-	    &linenum) != -1) {
+	while (getline(&line, &linesize, f) != -1) {
 		cp = line;
 
 		/* Skip leading whitespace. */
@@ -554,6 +490,7 @@
 	}
 	r = SSH_ERR_KEY_NOT_FOUND;
  out:
+	free(line);
 	sshkey_free(pub);
 	fclose(f);
 	return r;
diff --git a/bitmap.c b/bitmap.c
index f950322..5ecfe68 100644
--- a/bitmap.c
+++ b/bitmap.c
@@ -1,3 +1,4 @@
+/* $OpenBSD: bitmap.c,v 1.9 2017/10/20 01:56:39 djm Exp $ */
 /*
  * Copyright (c) 2015 Damien Miller <djm@mindrot.org>
  *
@@ -53,8 +54,9 @@
 bitmap_free(struct bitmap *b)
 {
 	if (b != NULL && b->d != NULL) {
-		explicit_bzero(b->d, b->len);
+		bitmap_zero(b);
 		free(b->d);
+		b->d = NULL;
 	}
 	free(b);
 }
@@ -86,10 +88,10 @@
 		return -1; /* invalid */
 	nlen = (n / BITMAP_BITS) + 1;
 	if (b->len < nlen) {
-		if ((tmp = reallocarray(b->d, nlen, BITMAP_BYTES)) == NULL)
+		if ((tmp = recallocarray(b->d, b->len,
+		    nlen, BITMAP_BYTES)) == NULL)
 			return -1;
 		b->d = tmp;
-		memset(b->d + b->len, 0, (nlen - b->len) * BITMAP_BYTES);
 		b->len = nlen;
 	}
 	return 0;
@@ -188,7 +190,7 @@
 {
 	int r;
 	size_t i, offset, shift;
-	u_char *s = (u_char *)p;
+	const u_char *s = (const u_char *)p;
 
 	if (l > BITMAP_MAX / 8)
 		return -1;
diff --git a/bitmap.h b/bitmap.h
index c1bb174..336e90b 100644
--- a/bitmap.h
+++ b/bitmap.h
@@ -1,3 +1,4 @@
+/* $OpenBSD: bitmap.h,v 1.2 2017/10/20 01:56:39 djm Exp $ */
 /*
  * Copyright (c) 2015 Damien Miller <djm@mindrot.org>
  *
diff --git a/blocks.c b/blocks.c
deleted file mode 100644
index ad93fe5..0000000
--- a/blocks.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/* $OpenBSD: blocks.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */
-
-/*
- * Public Domain, Author: Daniel J. Bernstein
- * Copied from nacl-20110221/crypto_hashblocks/sha512/ref/blocks.c
- */
-
-#include "includes.h"
-
-#include "crypto_api.h"
-
-typedef unsigned long long uint64;
-
-static uint64 load_bigendian(const unsigned char *x)
-{
-  return
-      (uint64) (x[7]) \
-  | (((uint64) (x[6])) << 8) \
-  | (((uint64) (x[5])) << 16) \
-  | (((uint64) (x[4])) << 24) \
-  | (((uint64) (x[3])) << 32) \
-  | (((uint64) (x[2])) << 40) \
-  | (((uint64) (x[1])) << 48) \
-  | (((uint64) (x[0])) << 56)
-  ;
-}
-
-static void store_bigendian(unsigned char *x,uint64 u)
-{
-  x[7] = u; u >>= 8;
-  x[6] = u; u >>= 8;
-  x[5] = u; u >>= 8;
-  x[4] = u; u >>= 8;
-  x[3] = u; u >>= 8;
-  x[2] = u; u >>= 8;
-  x[1] = u; u >>= 8;
-  x[0] = u;
-}
-
-#define SHR(x,c) ((x) >> (c))
-#define ROTR(x,c) (((x) >> (c)) | ((x) << (64 - (c))))
-
-#define Ch(x,y,z) ((x & y) ^ (~x & z))
-#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
-#define Sigma0(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
-#define Sigma1(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
-#define sigma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x,7))
-#define sigma1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x,6))
-
-#define M(w0,w14,w9,w1) w0 = sigma1(w14) + w9 + sigma0(w1) + w0;
-
-#define EXPAND \
-  M(w0 ,w14,w9 ,w1 ) \
-  M(w1 ,w15,w10,w2 ) \
-  M(w2 ,w0 ,w11,w3 ) \
-  M(w3 ,w1 ,w12,w4 ) \
-  M(w4 ,w2 ,w13,w5 ) \
-  M(w5 ,w3 ,w14,w6 ) \
-  M(w6 ,w4 ,w15,w7 ) \
-  M(w7 ,w5 ,w0 ,w8 ) \
-  M(w8 ,w6 ,w1 ,w9 ) \
-  M(w9 ,w7 ,w2 ,w10) \
-  M(w10,w8 ,w3 ,w11) \
-  M(w11,w9 ,w4 ,w12) \
-  M(w12,w10,w5 ,w13) \
-  M(w13,w11,w6 ,w14) \
-  M(w14,w12,w7 ,w15) \
-  M(w15,w13,w8 ,w0 )
-
-#define F(w,k) \
-  T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \
-  T2 = Sigma0(a) + Maj(a,b,c); \
-  h = g; \
-  g = f; \
-  f = e; \
-  e = d + T1; \
-  d = c; \
-  c = b; \
-  b = a; \
-  a = T1 + T2;
-
-int crypto_hashblocks_sha512(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen)
-{
-  uint64 state[8];
-  uint64 a;
-  uint64 b;
-  uint64 c;
-  uint64 d;
-  uint64 e;
-  uint64 f;
-  uint64 g;
-  uint64 h;
-  uint64 T1;
-  uint64 T2;
-
-  a = load_bigendian(statebytes +  0); state[0] = a;
-  b = load_bigendian(statebytes +  8); state[1] = b;
-  c = load_bigendian(statebytes + 16); state[2] = c;
-  d = load_bigendian(statebytes + 24); state[3] = d;
-  e = load_bigendian(statebytes + 32); state[4] = e;
-  f = load_bigendian(statebytes + 40); state[5] = f;
-  g = load_bigendian(statebytes + 48); state[6] = g;
-  h = load_bigendian(statebytes + 56); state[7] = h;
-
-  while (inlen >= 128) {
-    uint64 w0  = load_bigendian(in +   0);
-    uint64 w1  = load_bigendian(in +   8);
-    uint64 w2  = load_bigendian(in +  16);
-    uint64 w3  = load_bigendian(in +  24);
-    uint64 w4  = load_bigendian(in +  32);
-    uint64 w5  = load_bigendian(in +  40);
-    uint64 w6  = load_bigendian(in +  48);
-    uint64 w7  = load_bigendian(in +  56);
-    uint64 w8  = load_bigendian(in +  64);
-    uint64 w9  = load_bigendian(in +  72);
-    uint64 w10 = load_bigendian(in +  80);
-    uint64 w11 = load_bigendian(in +  88);
-    uint64 w12 = load_bigendian(in +  96);
-    uint64 w13 = load_bigendian(in + 104);
-    uint64 w14 = load_bigendian(in + 112);
-    uint64 w15 = load_bigendian(in + 120);
-
-    F(w0 ,0x428a2f98d728ae22ULL)
-    F(w1 ,0x7137449123ef65cdULL)
-    F(w2 ,0xb5c0fbcfec4d3b2fULL)
-    F(w3 ,0xe9b5dba58189dbbcULL)
-    F(w4 ,0x3956c25bf348b538ULL)
-    F(w5 ,0x59f111f1b605d019ULL)
-    F(w6 ,0x923f82a4af194f9bULL)
-    F(w7 ,0xab1c5ed5da6d8118ULL)
-    F(w8 ,0xd807aa98a3030242ULL)
-    F(w9 ,0x12835b0145706fbeULL)
-    F(w10,0x243185be4ee4b28cULL)
-    F(w11,0x550c7dc3d5ffb4e2ULL)
-    F(w12,0x72be5d74f27b896fULL)
-    F(w13,0x80deb1fe3b1696b1ULL)
-    F(w14,0x9bdc06a725c71235ULL)
-    F(w15,0xc19bf174cf692694ULL)
-
-    EXPAND
-
-    F(w0 ,0xe49b69c19ef14ad2ULL)
-    F(w1 ,0xefbe4786384f25e3ULL)
-    F(w2 ,0x0fc19dc68b8cd5b5ULL)
-    F(w3 ,0x240ca1cc77ac9c65ULL)
-    F(w4 ,0x2de92c6f592b0275ULL)
-    F(w5 ,0x4a7484aa6ea6e483ULL)
-    F(w6 ,0x5cb0a9dcbd41fbd4ULL)
-    F(w7 ,0x76f988da831153b5ULL)
-    F(w8 ,0x983e5152ee66dfabULL)
-    F(w9 ,0xa831c66d2db43210ULL)
-    F(w10,0xb00327c898fb213fULL)
-    F(w11,0xbf597fc7beef0ee4ULL)
-    F(w12,0xc6e00bf33da88fc2ULL)
-    F(w13,0xd5a79147930aa725ULL)
-    F(w14,0x06ca6351e003826fULL)
-    F(w15,0x142929670a0e6e70ULL)
-
-    EXPAND
-
-    F(w0 ,0x27b70a8546d22ffcULL)
-    F(w1 ,0x2e1b21385c26c926ULL)
-    F(w2 ,0x4d2c6dfc5ac42aedULL)
-    F(w3 ,0x53380d139d95b3dfULL)
-    F(w4 ,0x650a73548baf63deULL)
-    F(w5 ,0x766a0abb3c77b2a8ULL)
-    F(w6 ,0x81c2c92e47edaee6ULL)
-    F(w7 ,0x92722c851482353bULL)
-    F(w8 ,0xa2bfe8a14cf10364ULL)
-    F(w9 ,0xa81a664bbc423001ULL)
-    F(w10,0xc24b8b70d0f89791ULL)
-    F(w11,0xc76c51a30654be30ULL)
-    F(w12,0xd192e819d6ef5218ULL)
-    F(w13,0xd69906245565a910ULL)
-    F(w14,0xf40e35855771202aULL)
-    F(w15,0x106aa07032bbd1b8ULL)
-
-    EXPAND
-
-    F(w0 ,0x19a4c116b8d2d0c8ULL)
-    F(w1 ,0x1e376c085141ab53ULL)
-    F(w2 ,0x2748774cdf8eeb99ULL)
-    F(w3 ,0x34b0bcb5e19b48a8ULL)
-    F(w4 ,0x391c0cb3c5c95a63ULL)
-    F(w5 ,0x4ed8aa4ae3418acbULL)
-    F(w6 ,0x5b9cca4f7763e373ULL)
-    F(w7 ,0x682e6ff3d6b2b8a3ULL)
-    F(w8 ,0x748f82ee5defb2fcULL)
-    F(w9 ,0x78a5636f43172f60ULL)
-    F(w10,0x84c87814a1f0ab72ULL)
-    F(w11,0x8cc702081a6439ecULL)
-    F(w12,0x90befffa23631e28ULL)
-    F(w13,0xa4506cebde82bde9ULL)
-    F(w14,0xbef9a3f7b2c67915ULL)
-    F(w15,0xc67178f2e372532bULL)
-
-    EXPAND
-
-    F(w0 ,0xca273eceea26619cULL)
-    F(w1 ,0xd186b8c721c0c207ULL)
-    F(w2 ,0xeada7dd6cde0eb1eULL)
-    F(w3 ,0xf57d4f7fee6ed178ULL)
-    F(w4 ,0x06f067aa72176fbaULL)
-    F(w5 ,0x0a637dc5a2c898a6ULL)
-    F(w6 ,0x113f9804bef90daeULL)
-    F(w7 ,0x1b710b35131c471bULL)
-    F(w8 ,0x28db77f523047d84ULL)
-    F(w9 ,0x32caab7b40c72493ULL)
-    F(w10,0x3c9ebe0a15c9bebcULL)
-    F(w11,0x431d67c49c100d4cULL)
-    F(w12,0x4cc5d4becb3e42b6ULL)
-    F(w13,0x597f299cfc657e2aULL)
-    F(w14,0x5fcb6fab3ad6faecULL)
-    F(w15,0x6c44198c4a475817ULL)
-
-    a += state[0];
-    b += state[1];
-    c += state[2];
-    d += state[3];
-    e += state[4];
-    f += state[5];
-    g += state[6];
-    h += state[7];
-  
-    state[0] = a;
-    state[1] = b;
-    state[2] = c;
-    state[3] = d;
-    state[4] = e;
-    state[5] = f;
-    state[6] = g;
-    state[7] = h;
-
-    in += 128;
-    inlen -= 128;
-  }
-
-  store_bigendian(statebytes +  0,state[0]);
-  store_bigendian(statebytes +  8,state[1]);
-  store_bigendian(statebytes + 16,state[2]);
-  store_bigendian(statebytes + 24,state[3]);
-  store_bigendian(statebytes + 32,state[4]);
-  store_bigendian(statebytes + 40,state[5]);
-  store_bigendian(statebytes + 48,state[6]);
-  store_bigendian(statebytes + 56,state[7]);
-
-  return inlen;
-}
diff --git a/bufaux.c b/bufaux.c
deleted file mode 100644
index 3976896..0000000
--- a/bufaux.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/* $OpenBSD: bufaux.c,v 1.60 2014/04/30 05:29:56 djm Exp $ */
-/*
- * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
-
-#include "includes.h"
-
-#include <sys/types.h>
-
-#include "buffer.h"
-#include "log.h"
-#include "ssherr.h"
-
-int
-buffer_get_short_ret(u_short *v, Buffer *buffer)
-{
-	int ret;
-
-	if ((ret = sshbuf_get_u16(buffer, v)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-u_short
-buffer_get_short(Buffer *buffer)
-{
-	u_short ret;
-
-	if (buffer_get_short_ret(&ret, buffer) == -1)
-		fatal("%s: buffer error", __func__);
-
-	return (ret);
-}
-
-int
-buffer_get_int_ret(u_int *v, Buffer *buffer)
-{
-	int ret;
-
-	if ((ret = sshbuf_get_u32(buffer, v)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-u_int
-buffer_get_int(Buffer *buffer)
-{
-	u_int ret;
-
-	if (buffer_get_int_ret(&ret, buffer) == -1)
-		fatal("%s: buffer error", __func__);
-
-	return (ret);
-}
-
-int
-buffer_get_int64_ret(u_int64_t *v, Buffer *buffer)
-{
-	int ret;
-
-	if ((ret = sshbuf_get_u64(buffer, v)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-u_int64_t
-buffer_get_int64(Buffer *buffer)
-{
-	u_int64_t ret;
-
-	if (buffer_get_int64_ret(&ret, buffer) == -1)
-		fatal("%s: buffer error", __func__);
-
-	return (ret);
-}
-
-void
-buffer_put_short(Buffer *buffer, u_short value)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_u16(buffer, value)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void
-buffer_put_int(Buffer *buffer, u_int value)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_u32(buffer, value)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void
-buffer_put_int64(Buffer *buffer, u_int64_t value)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_u64(buffer, value)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void *
-buffer_get_string_ret(Buffer *buffer, u_int *length_ptr)
-{
-	size_t len;
-	int ret;
-	u_char *value;
-
-	if ((ret = sshbuf_get_string(buffer, &value, &len)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return NULL;
-	}
-	if (length_ptr != NULL)
-		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
-	return value;
-}
-
-void *
-buffer_get_string(Buffer *buffer, u_int *length_ptr)
-{
-	void *ret;
-
-	if ((ret = buffer_get_string_ret(buffer, length_ptr)) == NULL)
-		fatal("%s: buffer error", __func__);
-	return (ret);
-}
-
-char *
-buffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr)
-{
-	size_t len;
-	int ret;
-	char *value;
-
-	if ((ret = sshbuf_get_cstring(buffer, &value, &len)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return NULL;
-	}
-	if (length_ptr != NULL)
-		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
-	return value;
-}
-
-char *
-buffer_get_cstring(Buffer *buffer, u_int *length_ptr)
-{
-	char *ret;
-
-	if ((ret = buffer_get_cstring_ret(buffer, length_ptr)) == NULL)
-		fatal("%s: buffer error", __func__);
-	return ret;
-}
-
-const void *
-buffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr)
-{
-	size_t len;
-	int ret;
-	const u_char *value;
-
-	if ((ret = sshbuf_get_string_direct(buffer, &value, &len)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return NULL;
-	}
-	if (length_ptr != NULL)
-		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
-	return value;
-}
-
-const void *
-buffer_get_string_ptr(Buffer *buffer, u_int *length_ptr)
-{
-	const void *ret;
-
-	if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL)
-		fatal("%s: buffer error", __func__);
-	return (ret);
-}
-
-void
-buffer_put_string(Buffer *buffer, const void *buf, u_int len)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_string(buffer, buf, len)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void
-buffer_put_cstring(Buffer *buffer, const char *s)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_cstring(buffer, s)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-int
-buffer_get_char_ret(char *v, Buffer *buffer)
-{
-	int ret;
-
-	if ((ret = sshbuf_get_u8(buffer, (u_char *)v)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-int
-buffer_get_char(Buffer *buffer)
-{
-	char ch;
-
-	if (buffer_get_char_ret(&ch, buffer) == -1)
-		fatal("%s: buffer error", __func__);
-	return (u_char) ch;
-}
-
-void
-buffer_put_char(Buffer *buffer, int value)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_u8(buffer, value)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void
-buffer_put_bignum2_from_string(Buffer *buffer, const u_char *s, u_int l)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_bignum2_bytes(buffer, s, l)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
diff --git a/bufbn.c b/bufbn.c
deleted file mode 100644
index 33ae7f7..0000000
--- a/bufbn.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* $OpenBSD: bufbn.c,v 1.12 2014/04/30 05:29:56 djm Exp $ */
-
-/*
- * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
-
-#include "includes.h"
-
-#ifdef WITH_OPENSSL
-
-#include <sys/types.h>
-
-#include "buffer.h"
-#include "log.h"
-#include "ssherr.h"
-
-#ifdef WITH_SSH1
-int
-buffer_put_bignum_ret(Buffer *buffer, const BIGNUM *value)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_bignum1(buffer, value)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-void
-buffer_put_bignum(Buffer *buffer, const BIGNUM *value)
-{
-	if (buffer_put_bignum_ret(buffer, value) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-int
-buffer_get_bignum_ret(Buffer *buffer, BIGNUM *value)
-{
-	int ret;
-
-	if ((ret = sshbuf_get_bignum1(buffer, value)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-void
-buffer_get_bignum(Buffer *buffer, BIGNUM *value)
-{
-	if (buffer_get_bignum_ret(buffer, value) == -1)
-		fatal("%s: buffer error", __func__);
-}
-#endif /* WITH_SSH1 */
-
-int
-buffer_put_bignum2_ret(Buffer *buffer, const BIGNUM *value)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_bignum2(buffer, value)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-void
-buffer_put_bignum2(Buffer *buffer, const BIGNUM *value)
-{
-	if (buffer_put_bignum2_ret(buffer, value) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-int
-buffer_get_bignum2_ret(Buffer *buffer, BIGNUM *value)
-{
-	int ret;
-
-	if ((ret = sshbuf_get_bignum2(buffer, value)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-void
-buffer_get_bignum2(Buffer *buffer, BIGNUM *value)
-{
-	if (buffer_get_bignum2_ret(buffer, value) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-#endif /* WITH_OPENSSL */
diff --git a/bufec.c b/bufec.c
deleted file mode 100644
index 749ce9d..0000000
--- a/bufec.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $OpenBSD: bufec.c,v 1.4 2014/04/30 05:29:56 djm Exp $ */
-
-/*
- * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
-
-#include "includes.h"
-
-#include <sys/types.h>
-
-#include "buffer.h"
-#include "log.h"
-#include "ssherr.h"
-
-#ifdef OPENSSL_HAS_ECC
-
-int
-buffer_put_ecpoint_ret(Buffer *buffer, const EC_GROUP *curve,
-    const EC_POINT *point)
-{
-	int ret;
-
-	if ((ret = sshbuf_put_ec(buffer, point, curve)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-void
-buffer_put_ecpoint(Buffer *buffer, const EC_GROUP *curve,
-    const EC_POINT *point)
-{
-	if (buffer_put_ecpoint_ret(buffer, curve, point) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-int
-buffer_get_ecpoint_ret(Buffer *buffer, const EC_GROUP *curve,
-    EC_POINT *point)
-{
-	int ret;
-
-	if ((ret = sshbuf_get_ec(buffer, point, curve)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-void
-buffer_get_ecpoint(Buffer *buffer, const EC_GROUP *curve,
-    EC_POINT *point)
-{
-	if (buffer_get_ecpoint_ret(buffer, curve, point) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-#endif /* OPENSSL_HAS_ECC */
-
diff --git a/buffer.c b/buffer.c
deleted file mode 100644
index c5f708a..0000000
--- a/buffer.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* $OpenBSD: buffer.c,v 1.36 2014/04/30 05:29:56 djm Exp $ */
-
-/*
- * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
-
-#include "includes.h"
-
-#include <sys/types.h>
-
-#include "buffer.h"
-#include "log.h"
-#include "ssherr.h"
-
-void
-buffer_append(Buffer *buffer, const void *data, u_int len)
-{
-	int ret;
-
-	if ((ret = sshbuf_put(buffer, data, len)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void *
-buffer_append_space(Buffer *buffer, u_int len)
-{
-	int ret;
-	u_char *p;
-
-	if ((ret = sshbuf_reserve(buffer, len, &p)) != 0)
-		fatal("%s: %s", __func__, ssh_err(ret));
-	return p;
-}
-
-int
-buffer_check_alloc(Buffer *buffer, u_int len)
-{
-	int ret = sshbuf_check_reserve(buffer, len);
-
-	if (ret == 0)
-		return 1;
-	if (ret == SSH_ERR_NO_BUFFER_SPACE)
-		return 0;
-	fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-int
-buffer_get_ret(Buffer *buffer, void *buf, u_int len)
-{
-	int ret;
-
-	if ((ret = sshbuf_get(buffer, buf, len)) != 0) {
-		error("%s: %s", __func__, ssh_err(ret));
-		return -1;
-	}
-	return 0;
-}
-
-void
-buffer_get(Buffer *buffer, void *buf, u_int len)
-{
-	if (buffer_get_ret(buffer, buf, len) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-int
-buffer_consume_ret(Buffer *buffer, u_int bytes)
-{
-	int ret = sshbuf_consume(buffer, bytes);
-
-	if (ret == 0)
-		return 0;
-	if (ret == SSH_ERR_MESSAGE_INCOMPLETE)
-		return -1;
-	fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void
-buffer_consume(Buffer *buffer, u_int bytes)
-{
-	if (buffer_consume_ret(buffer, bytes) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-int
-buffer_consume_end_ret(Buffer *buffer, u_int bytes)
-{
-	int ret = sshbuf_consume_end(buffer, bytes);
-
-	if (ret == 0)
-		return 0;
-	if (ret == SSH_ERR_MESSAGE_INCOMPLETE)
-		return -1;
-	fatal("%s: %s", __func__, ssh_err(ret));
-}
-
-void
-buffer_consume_end(Buffer *buffer, u_int bytes)
-{
-	if (buffer_consume_end_ret(buffer, bytes) == -1)
-		fatal("%s: buffer error", __func__);
-}
-
-
diff --git a/buffer.h b/buffer.h
deleted file mode 100644
index df1aebc..0000000
--- a/buffer.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* $OpenBSD: buffer.h,v 1.25 2014/04/30 05:29:56 djm Exp $ */
-
-/*
- * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
-
-#ifndef BUFFER_H
-#define BUFFER_H
-
-#include "sshbuf.h"
-
-typedef struct sshbuf Buffer;
-
-#define buffer_init(b)		sshbuf_init(b)
-#define buffer_clear(b)		sshbuf_reset(b)
-#define buffer_free(b)		sshbuf_free(b)
-#define buffer_dump(b)		sshbuf_dump(b, stderr)
-
-/* XXX cast is safe: sshbuf never stores more than len 2^31 */
-#define buffer_len(b)		((u_int) sshbuf_len(b))
-#define	buffer_ptr(b)		sshbuf_mutable_ptr(b)
-
-void	 buffer_append(Buffer *, const void *, u_int);
-void	*buffer_append_space(Buffer *, u_int);
-int	 buffer_check_alloc(Buffer *, u_int);
-void	 buffer_get(Buffer *, void *, u_int);
-
-void	 buffer_consume(Buffer *, u_int);
-void	 buffer_consume_end(Buffer *, u_int);
-
-
-int	 buffer_get_ret(Buffer *, void *, u_int);
-int	 buffer_consume_ret(Buffer *, u_int);
-int	 buffer_consume_end_ret(Buffer *, u_int);
-
-#include <openssl/objects.h>
-#include <openssl/bn.h>
-void    buffer_put_bignum(Buffer *, const BIGNUM *);
-void    buffer_put_bignum2(Buffer *, const BIGNUM *);
-void	buffer_get_bignum(Buffer *, BIGNUM *);
-void	buffer_get_bignum2(Buffer *, BIGNUM *);
-void	buffer_put_bignum2_from_string(Buffer *, const u_char *, u_int);
-
-u_short	buffer_get_short(Buffer *);
-void	buffer_put_short(Buffer *, u_short);
-
-u_int	buffer_get_int(Buffer *);
-void    buffer_put_int(Buffer *, u_int);
-
-u_int64_t buffer_get_int64(Buffer *);
-void	buffer_put_int64(Buffer *, u_int64_t);
-
-int     buffer_get_char(Buffer *);
-void    buffer_put_char(Buffer *, int);
-
-void   *buffer_get_string(Buffer *, u_int *);
-const void *buffer_get_string_ptr(Buffer *, u_int *);
-void    buffer_put_string(Buffer *, const void *, u_int);
-char   *buffer_get_cstring(Buffer *, u_int *);
-void	buffer_put_cstring(Buffer *, const char *);
-
-#define buffer_skip_string(b) (void)buffer_get_string_ptr(b, NULL);
-
-int	buffer_put_bignum_ret(Buffer *, const BIGNUM *);
-int	buffer_get_bignum_ret(Buffer *, BIGNUM *);
-int	buffer_put_bignum2_ret(Buffer *, const BIGNUM *);
-int	buffer_get_bignum2_ret(Buffer *, BIGNUM *);
-int	buffer_get_short_ret(u_short *, Buffer *);
-int	buffer_get_int_ret(u_int *, Buffer *);
-int	buffer_get_int64_ret(u_int64_t *, Buffer *);
-void	*buffer_get_string_ret(Buffer *, u_int *);
-char	*buffer_get_cstring_ret(Buffer *, u_int *);
-const void *buffer_get_string_ptr_ret(Buffer *, u_int *);
-int	buffer_get_char_ret(char *, Buffer *);
-
-#ifdef OPENSSL_HAS_ECC
-#include <openssl/ec.h>
-int	buffer_put_ecpoint_ret(Buffer *, const EC_GROUP *, const EC_POINT *);
-void	buffer_put_ecpoint(Buffer *, const EC_GROUP *, const EC_POINT *);
-int	buffer_get_ecpoint_ret(Buffer *, const EC_GROUP *, EC_POINT *);
-void	buffer_get_ecpoint(Buffer *, const EC_GROUP *, EC_POINT *);
-#endif
-
-#endif	/* BUFFER_H */
-
diff --git a/channels.c b/channels.c
index 398da9a..e90f7fe 100644
--- a/channels.c
+++ b/channels.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.357 2017/02/01 02:59:09 dtucker Exp $ */
+/* $OpenBSD: channels.c,v 1.384 2018/07/27 12:03:17 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -55,56 +55,52 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <limits.h>
 #include <netdb.h>
+#include <stdarg.h>
 #ifdef HAVE_STDINT_H
-#include <stdint.h>
+ #include <stdint.h>
 #endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <termios.h>
 #include <unistd.h>
-#include <stdarg.h>
 
 #include "openbsd-compat/sys-queue.h"
 #include "xmalloc.h"
 #include "ssh.h"
-#include "ssh1.h"
 #include "ssh2.h"
 #include "ssherr.h"
+#include "sshbuf.h"
 #include "packet.h"
 #include "log.h"
 #include "misc.h"
-#include "buffer.h"
 #include "channels.h"
 #include "compat.h"
 #include "canohost.h"
-#include "key.h"
+#include "sshkey.h"
 #include "authfd.h"
 #include "pathnames.h"
+#include "match.h"
 
-/* -- channel core */
-
-/*
- * Pointer to an array containing all allocated channels.  The array is
- * dynamically extended as needed.
- */
-static Channel **channels = NULL;
-
-/*
- * Size of the channel array.  All slots of the array must always be
- * initialized (at least the type field); unused slots set to NULL
- */
-static u_int channels_alloc = 0;
-
-/*
- * Maximum file descriptor value used in any of the channels.  This is
- * updated in channel_new.
- */
-static int channel_max_fd = 0;
-
+/* -- agent forwarding */
+#define	NUM_SOCKS	10
 
 /* -- tcp forwarding */
+/* special-case port number meaning allow any port */
+#define FWD_PERMIT_ANY_PORT	0
+
+/* special-case wildcard meaning allow any host */
+#define FWD_PERMIT_ANY_HOST	"*"
+
+/* -- X11 forwarding */
+/* Maximum number of fake X11 displays to try. */
+#define MAX_DISPLAYS  1000
+
+/* Per-channel callback for pre/post select() actions */
+typedef void chan_fn(struct ssh *, Channel *c,
+    fd_set *readset, fd_set *writeset);
 
 /*
  * Data structure for storing which hosts are permitted for forward requests.
@@ -115,110 +111,162 @@
 /* XXX: streamlocal wants a path instead of host:port */
 /*      Overload host_to_connect; we could just make this match Forward */
 /*	XXX - can we use listen_host instead of listen_path? */
-typedef struct {
+struct permission {
 	char *host_to_connect;		/* Connect to 'host'. */
 	int port_to_connect;		/* Connect to 'port'. */
 	char *listen_host;		/* Remote side should listen address. */
 	char *listen_path;		/* Remote side should listen path. */
 	int listen_port;		/* Remote side should listen port. */
 	Channel *downstream;		/* Downstream mux*/
-} ForwardPermission;
-
-/* List of all permitted host/port pairs to connect by the user. */
-static ForwardPermission *permitted_opens = NULL;
-
-/* List of all permitted host/port pairs to connect by the admin. */
-static ForwardPermission *permitted_adm_opens = NULL;
-
-/* Number of permitted host/port pairs in the array permitted by the user. */
-static int num_permitted_opens = 0;
-
-/* Number of permitted host/port pair in the array permitted by the admin. */
-static int num_adm_permitted_opens = 0;
-
-/* special-case port number meaning allow any port */
-#define FWD_PERMIT_ANY_PORT	0
-
-/* special-case wildcard meaning allow any host */
-#define FWD_PERMIT_ANY_HOST	"*"
+};
 
 /*
- * If this is true, all opens are permitted.  This is the case on the server
- * on which we have to trust the client anyway, and the user could do
- * anything after logging in anyway.
+ * Stores the forwarding permission state for a single direction (local or
+ * remote).
  */
-static int all_opens_permitted = 0;
+struct permission_set {
+	/*
+	 * List of all local permitted host/port pairs to allow for the
+	 * user.
+	 */
+	u_int num_permitted_user;
+	struct permission *permitted_user;
 
+	/*
+	 * List of all permitted host/port pairs to allow for the admin.
+	 */
+	u_int num_permitted_admin;
+	struct permission *permitted_admin;
 
-/* -- X11 forwarding */
+	/*
+	 * If this is true, all opens/listens are permitted.  This is the
+	 * case on the server on which we have to trust the client anyway,
+	 * and the user could do anything after logging in.
+	 */
+	int all_permitted;
+};
 
-/* Maximum number of fake X11 displays to try. */
-#define MAX_DISPLAYS  1000
+/* Master structure for channels state */
+struct ssh_channels {
+	/*
+	 * Pointer to an array containing all allocated channels.  The array
+	 * is dynamically extended as needed.
+	 */
+	Channel **channels;
 
-/* Saved X11 local (client) display. */
-static char *x11_saved_display = NULL;
+	/*
+	 * Size of the channel array.  All slots of the array must always be
+	 * initialized (at least the type field); unused slots set to NULL
+	 */
+	u_int channels_alloc;
 
-/* Saved X11 authentication protocol name. */
-static char *x11_saved_proto = NULL;
+	/*
+	 * Maximum file descriptor value used in any of the channels.  This is
+	 * updated in channel_new.
+	 */
+	int channel_max_fd;
 
-/* Saved X11 authentication data.  This is the real data. */
-static char *x11_saved_data = NULL;
-static u_int x11_saved_data_len = 0;
+	/*
+	 * 'channel_pre*' are called just before select() to add any bits
+	 * relevant to channels in the select bitmasks.
+	 *
+	 * 'channel_post*': perform any appropriate operations for
+	 * channels which have events pending.
+	 */
+	chan_fn **channel_pre;
+	chan_fn **channel_post;
 
-/* Deadline after which all X11 connections are refused */
-static u_int x11_refuse_time;
+	/* -- tcp forwarding */
+	struct permission_set local_perms;
+	struct permission_set remote_perms;
 
-/*
- * Fake X11 authentication data.  This is what the server will be sending us;
- * we should replace any occurrences of this by the real data.
- */
-static u_char *x11_fake_data = NULL;
-static u_int x11_fake_data_len;
+	/* -- X11 forwarding */
 
+	/* Saved X11 local (client) display. */
+	char *x11_saved_display;
 
-/* -- agent forwarding */
+	/* Saved X11 authentication protocol name. */
+	char *x11_saved_proto;
 
-#define	NUM_SOCKS	10
+	/* Saved X11 authentication data.  This is the real data. */
+	char *x11_saved_data;
+	u_int x11_saved_data_len;
 
-/* AF_UNSPEC or AF_INET or AF_INET6 */
-static int IPv4or6 = AF_UNSPEC;
+	/* Deadline after which all X11 connections are refused */
+	u_int x11_refuse_time;
+
+	/*
+	 * Fake X11 authentication data.  This is what the server will be
+	 * sending us; we should replace any occurrences of this by the
+	 * real data.
+	 */
+	u_char *x11_fake_data;
+	u_int x11_fake_data_len;
+
+	/* AF_UNSPEC or AF_INET or AF_INET6 */
+	int IPv4or6;
+};
 
 /* helper */
-static void port_open_helper(Channel *c, char *rtype);
+static void port_open_helper(struct ssh *ssh, Channel *c, char *rtype);
 static const char *channel_rfwd_bind_host(const char *listen_host);
 
 /* non-blocking connect helpers */
 static int connect_next(struct channel_connect *);
 static void channel_connect_ctx_free(struct channel_connect *);
+static Channel *rdynamic_connect_prepare(struct ssh *, char *, char *);
+static int rdynamic_connect_finish(struct ssh *, Channel *);
+
+/* Setup helper */
+static void channel_handler_init(struct ssh_channels *sc);
 
 /* -- channel core */
 
+void
+channel_init_channels(struct ssh *ssh)
+{
+	struct ssh_channels *sc;
+
+	if ((sc = calloc(1, sizeof(*sc))) == NULL ||
+	    (sc->channel_pre = calloc(SSH_CHANNEL_MAX_TYPE,
+	    sizeof(*sc->channel_pre))) == NULL ||
+	    (sc->channel_post = calloc(SSH_CHANNEL_MAX_TYPE,
+	    sizeof(*sc->channel_post))) == NULL)
+		fatal("%s: allocation failed", __func__);
+	sc->channels_alloc = 10;
+	sc->channels = xcalloc(sc->channels_alloc, sizeof(*sc->channels));
+	sc->IPv4or6 = AF_UNSPEC;
+	channel_handler_init(sc);
+
+	ssh->chanctxt = sc;
+}
+
 Channel *
-channel_by_id(int id)
+channel_by_id(struct ssh *ssh, int id)
 {
 	Channel *c;
 
-	if (id < 0 || (u_int)id >= channels_alloc) {
-		logit("channel_by_id: %d: bad id", id);
+	if (id < 0 || (u_int)id >= ssh->chanctxt->channels_alloc) {
+		logit("%s: %d: bad id", __func__, id);
 		return NULL;
 	}
-	c = channels[id];
+	c = ssh->chanctxt->channels[id];
 	if (c == NULL) {
-		logit("channel_by_id: %d: bad id: channel free", id);
+		logit("%s: %d: bad id: channel free", __func__, id);
 		return NULL;
 	}
 	return c;
 }
 
 Channel *
-channel_by_remote_id(int remote_id)
+channel_by_remote_id(struct ssh *ssh, u_int remote_id)
 {
 	Channel *c;
 	u_int i;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
-		if (c != NULL && c->remote_id == remote_id)
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		c = ssh->chanctxt->channels[i];
+		if (c != NULL && c->have_remote_id && c->remote_id == remote_id)
 			return c;
 	}
 	return NULL;
@@ -229,28 +277,28 @@
  * Private channels, like listening sockets, may not receive messages.
  */
 Channel *
-channel_lookup(int id)
+channel_lookup(struct ssh *ssh, int id)
 {
 	Channel *c;
 
-	if ((c = channel_by_id(id)) == NULL)
-		return (NULL);
+	if ((c = channel_by_id(ssh, id)) == NULL)
+		return NULL;
 
 	switch (c->type) {
 	case SSH_CHANNEL_X11_OPEN:
 	case SSH_CHANNEL_LARVAL:
 	case SSH_CHANNEL_CONNECTING:
 	case SSH_CHANNEL_DYNAMIC:
+	case SSH_CHANNEL_RDYNAMIC_OPEN:
+	case SSH_CHANNEL_RDYNAMIC_FINISH:
 	case SSH_CHANNEL_OPENING:
 	case SSH_CHANNEL_OPEN:
-	case SSH_CHANNEL_INPUT_DRAINING:
-	case SSH_CHANNEL_OUTPUT_DRAINING:
 	case SSH_CHANNEL_ABANDONED:
 	case SSH_CHANNEL_MUX_PROXY:
-		return (c);
+		return c;
 	}
 	logit("Non-public channel %d, type %d.", id, c->type);
-	return (NULL);
+	return NULL;
 }
 
 /*
@@ -258,13 +306,15 @@
  * when the channel consumer/producer is ready, e.g. shell exec'd
  */
 static void
-channel_register_fds(Channel *c, int rfd, int wfd, int efd,
+channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd,
     int extusage, int nonblock, int is_tty)
 {
+	struct ssh_channels *sc = ssh->chanctxt;
+
 	/* Update the maximum file descriptor value. */
-	channel_max_fd = MAXIMUM(channel_max_fd, rfd);
-	channel_max_fd = MAXIMUM(channel_max_fd, wfd);
-	channel_max_fd = MAXIMUM(channel_max_fd, efd);
+	sc->channel_max_fd = MAXIMUM(sc->channel_max_fd, rfd);
+	sc->channel_max_fd = MAXIMUM(sc->channel_max_fd, wfd);
+	sc->channel_max_fd = MAXIMUM(sc->channel_max_fd, efd);
 
 	if (rfd != -1)
 		fcntl(rfd, F_SETFD, FD_CLOEXEC);
@@ -302,192 +352,273 @@
  * remote_name to be freed.
  */
 Channel *
-channel_new(char *ctype, int type, int rfd, int wfd, int efd,
+channel_new(struct ssh *ssh, char *ctype, int type, int rfd, int wfd, int efd,
     u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock)
 {
-	int found;
-	u_int i;
+	struct ssh_channels *sc = ssh->chanctxt;
+	u_int i, found;
 	Channel *c;
 
-	/* Do initial allocation if this is the first call. */
-	if (channels_alloc == 0) {
-		channels_alloc = 10;
-		channels = xcalloc(channels_alloc, sizeof(Channel *));
-		for (i = 0; i < channels_alloc; i++)
-			channels[i] = NULL;
-	}
 	/* Try to find a free slot where to put the new channel. */
-	for (found = -1, i = 0; i < channels_alloc; i++)
-		if (channels[i] == NULL) {
+	for (i = 0; i < sc->channels_alloc; i++) {
+		if (sc->channels[i] == NULL) {
 			/* Found a free slot. */
-			found = (int)i;
+			found = i;
 			break;
 		}
-	if (found < 0) {
-		/* There are no free slots.  Take last+1 slot and expand the array.  */
-		found = channels_alloc;
-		if (channels_alloc > 10000)
-			fatal("channel_new: internal error: channels_alloc %d "
-			    "too big.", channels_alloc);
-		channels = xreallocarray(channels, channels_alloc + 10,
-		    sizeof(Channel *));
-		channels_alloc += 10;
-		debug2("channel: expanding %d", channels_alloc);
-		for (i = found; i < channels_alloc; i++)
-			channels[i] = NULL;
+	}
+	if (i >= sc->channels_alloc) {
+		/*
+		 * There are no free slots. Take last+1 slot and expand
+		 * the array.
+		 */
+		found = sc->channels_alloc;
+		if (sc->channels_alloc > CHANNELS_MAX_CHANNELS)
+			fatal("%s: internal error: channels_alloc %d too big",
+			    __func__, sc->channels_alloc);
+		sc->channels = xrecallocarray(sc->channels, sc->channels_alloc,
+		    sc->channels_alloc + 10, sizeof(*sc->channels));
+		sc->channels_alloc += 10;
+		debug2("channel: expanding %d", sc->channels_alloc);
 	}
 	/* Initialize and return new channel. */
-	c = channels[found] = xcalloc(1, sizeof(Channel));
-	buffer_init(&c->input);
-	buffer_init(&c->output);
-	buffer_init(&c->extended);
-	c->path = NULL;
-	c->listening_addr = NULL;
-	c->listening_port = 0;
+	c = sc->channels[found] = xcalloc(1, sizeof(Channel));
+	if ((c->input = sshbuf_new()) == NULL ||
+	    (c->output = sshbuf_new()) == NULL ||
+	    (c->extended = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	c->ostate = CHAN_OUTPUT_OPEN;
 	c->istate = CHAN_INPUT_OPEN;
-	c->flags = 0;
-	channel_register_fds(c, rfd, wfd, efd, extusage, nonblock, 0);
-	c->notbefore = 0;
+	channel_register_fds(ssh, c, rfd, wfd, efd, extusage, nonblock, 0);
 	c->self = found;
 	c->type = type;
 	c->ctype = ctype;
 	c->local_window = window;
 	c->local_window_max = window;
-	c->local_consumed = 0;
 	c->local_maxpacket = maxpack;
-	c->remote_id = -1;
 	c->remote_name = xstrdup(remote_name);
-	c->remote_window = 0;
-	c->remote_maxpacket = 0;
-	c->force_drain = 0;
-	c->single_connection = 0;
-	c->detach_user = NULL;
-	c->detach_close = 0;
-	c->open_confirm = NULL;
-	c->open_confirm_ctx = NULL;
-	c->input_filter = NULL;
-	c->output_filter = NULL;
-	c->filter_ctx = NULL;
-	c->filter_cleanup = NULL;
 	c->ctl_chan = -1;
-	c->mux_rcb = NULL;
-	c->mux_ctx = NULL;
-	c->mux_pause = 0;
 	c->delayed = 1;		/* prevent call to channel_post handler */
 	TAILQ_INIT(&c->status_confirms);
 	debug("channel %d: new [%s]", found, remote_name);
 	return c;
 }
 
-static int
-channel_find_maxfd(void)
+static void
+channel_find_maxfd(struct ssh_channels *sc)
 {
 	u_int i;
 	int max = 0;
 	Channel *c;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
+	for (i = 0; i < sc->channels_alloc; i++) {
+		c = sc->channels[i];
 		if (c != NULL) {
 			max = MAXIMUM(max, c->rfd);
 			max = MAXIMUM(max, c->wfd);
 			max = MAXIMUM(max, c->efd);
 		}
 	}
-	return max;
+	sc->channel_max_fd = max;
 }
 
 int
-channel_close_fd(int *fdp)
+channel_close_fd(struct ssh *ssh, int *fdp)
 {
+	struct ssh_channels *sc = ssh->chanctxt;
 	int ret = 0, fd = *fdp;
 
 	if (fd != -1) {
 		ret = close(fd);
 		*fdp = -1;
-		if (fd == channel_max_fd)
-			channel_max_fd = channel_find_maxfd();
+		if (fd == sc->channel_max_fd)
+			channel_find_maxfd(sc);
 	}
 	return ret;
 }
 
 /* Close all channel fd/socket. */
 static void
-channel_close_fds(Channel *c)
+channel_close_fds(struct ssh *ssh, Channel *c)
 {
-	channel_close_fd(&c->sock);
-	channel_close_fd(&c->rfd);
-	channel_close_fd(&c->wfd);
-	channel_close_fd(&c->efd);
+	int sock = c->sock, rfd = c->rfd, wfd = c->wfd, efd = c->efd;
+
+	channel_close_fd(ssh, &c->sock);
+	if (rfd != sock)
+		channel_close_fd(ssh, &c->rfd);
+	if (wfd != sock && wfd != rfd)
+		channel_close_fd(ssh, &c->wfd);
+	if (efd != sock && efd != rfd && efd != wfd)
+		channel_close_fd(ssh, &c->efd);
+}
+
+static void
+fwd_perm_clear(struct permission *perm)
+{
+	free(perm->host_to_connect);
+	free(perm->listen_host);
+	free(perm->listen_path);
+	bzero(perm, sizeof(*perm));
+}
+
+/* Returns an printable name for the specified forwarding permission list */
+static const char *
+fwd_ident(int who, int where)
+{
+	if (who == FORWARD_ADM) {
+		if (where == FORWARD_LOCAL)
+			return "admin local";
+		else if (where == FORWARD_REMOTE)
+			return "admin remote";
+	} else if (who == FORWARD_USER) {
+		if (where == FORWARD_LOCAL)
+			return "user local";
+		else if (where == FORWARD_REMOTE)
+			return "user remote";
+	}
+	fatal("Unknown forward permission list %d/%d", who, where);
+}
+
+/* Returns the forwarding permission list for the specified direction */
+static struct permission_set *
+permission_set_get(struct ssh *ssh, int where)
+{
+	struct ssh_channels *sc = ssh->chanctxt;
+
+	switch (where) {
+	case FORWARD_LOCAL:
+		return &sc->local_perms;
+		break;
+	case FORWARD_REMOTE:
+		return &sc->remote_perms;
+		break;
+	default:
+		fatal("%s: invalid forwarding direction %d", __func__, where);
+	}
+}
+
+/* Reutrns pointers to the specified forwarding list and its element count */
+static void
+permission_set_get_array(struct ssh *ssh, int who, int where,
+    struct permission ***permpp, u_int **npermpp)
+{
+	struct permission_set *pset = permission_set_get(ssh, where);
+
+	switch (who) {
+	case FORWARD_USER:
+		*permpp = &pset->permitted_user;
+		*npermpp = &pset->num_permitted_user;
+		break;
+	case FORWARD_ADM:
+		*permpp = &pset->permitted_admin;
+		*npermpp = &pset->num_permitted_admin;
+		break;
+	default:
+		fatal("%s: invalid forwarding client %d", __func__, who);
+	}
+}
+
+/* Adds an entry to the spcified forwarding list */
+static int
+permission_set_add(struct ssh *ssh, int who, int where,
+    const char *host_to_connect, int port_to_connect,
+    const char *listen_host, const char *listen_path, int listen_port,
+    Channel *downstream)
+{
+	struct permission **permp;
+	u_int n, *npermp;
+
+	permission_set_get_array(ssh, who, where, &permp, &npermp);
+
+	if (*npermp >= INT_MAX)
+		fatal("%s: %s overflow", __func__, fwd_ident(who, where));
+
+	*permp = xrecallocarray(*permp, *npermp, *npermp + 1, sizeof(**permp));
+	n = (*npermp)++;
+#define MAYBE_DUP(s) ((s == NULL) ? NULL : xstrdup(s))
+	(*permp)[n].host_to_connect = MAYBE_DUP(host_to_connect);
+	(*permp)[n].port_to_connect = port_to_connect;
+	(*permp)[n].listen_host = MAYBE_DUP(listen_host);
+	(*permp)[n].listen_path = MAYBE_DUP(listen_path);
+	(*permp)[n].listen_port = listen_port;
+	(*permp)[n].downstream = downstream;
+#undef MAYBE_DUP
+	return (int)n;
+}
+
+static void
+mux_remove_remote_forwardings(struct ssh *ssh, Channel *c)
+{
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->local_perms;
+	struct permission *perm;
+	int r;
+	u_int i;
+
+	for (i = 0; i < pset->num_permitted_user; i++) {
+		perm = &pset->permitted_user[i];
+		if (perm->downstream != c)
+			continue;
+
+		/* cancel on the server, since mux client is gone */
+		debug("channel %d: cleanup remote forward for %s:%u",
+		    c->self, perm->listen_host, perm->listen_port);
+		if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
+		    (r = sshpkt_put_cstring(ssh,
+		    "cancel-tcpip-forward")) != 0 ||
+		    (r = sshpkt_put_u8(ssh, 0)) != 0 ||
+		    (r = sshpkt_put_cstring(ssh,
+		    channel_rfwd_bind_host(perm->listen_host))) != 0 ||
+		    (r = sshpkt_put_u32(ssh, perm->listen_port)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0) {
+			fatal("%s: channel %i: %s", __func__,
+			    c->self, ssh_err(r));
+		}
+		fwd_perm_clear(perm); /* unregister */
+	}
 }
 
 /* Free the channel and close its fd/socket. */
 void
-channel_free(Channel *c)
+channel_free(struct ssh *ssh, Channel *c)
 {
+	struct ssh_channels *sc = ssh->chanctxt;
 	char *s;
 	u_int i, n;
 	Channel *other;
 	struct channel_confirm *cc;
 
-	for (n = 0, i = 0; i < channels_alloc; i++) {
-		if ((other = channels[i]) != NULL) {
-			n++;
-
-			/* detach from mux client and prepare for closing */
-			if (c->type == SSH_CHANNEL_MUX_CLIENT &&
-			    other->type == SSH_CHANNEL_MUX_PROXY &&
-			    other->mux_ctx == c) {
-				other->mux_ctx = NULL;
-				other->type = SSH_CHANNEL_OPEN;
-				other->istate = CHAN_INPUT_CLOSED;
-				other->ostate = CHAN_OUTPUT_CLOSED;
-			}
+	for (n = 0, i = 0; i < sc->channels_alloc; i++) {
+		if ((other = sc->channels[i]) == NULL)
+			continue;
+		n++;
+		/* detach from mux client and prepare for closing */
+		if (c->type == SSH_CHANNEL_MUX_CLIENT &&
+		    other->type == SSH_CHANNEL_MUX_PROXY &&
+		    other->mux_ctx == c) {
+			other->mux_ctx = NULL;
+			other->type = SSH_CHANNEL_OPEN;
+			other->istate = CHAN_INPUT_CLOSED;
+			other->ostate = CHAN_OUTPUT_CLOSED;
 		}
 	}
 	debug("channel %d: free: %s, nchannels %u", c->self,
 	    c->remote_name ? c->remote_name : "???", n);
 
-	/* XXX more MUX cleanup: remove remote forwardings */
-	if (c->type == SSH_CHANNEL_MUX_CLIENT) {
-		for (i = 0; i < (u_int)num_permitted_opens; i++) {
-			if (permitted_opens[i].downstream != c)
-				continue;
-			/* cancel on the server, since mux client is gone */
-			debug("channel %d: cleanup remote forward for %s:%u",
-			    c->self,
-			    permitted_opens[i].listen_host,
-			    permitted_opens[i].listen_port);
-			packet_start(SSH2_MSG_GLOBAL_REQUEST);
-			packet_put_cstring("cancel-tcpip-forward");
-			packet_put_char(0);
-			packet_put_cstring(channel_rfwd_bind_host(
-			    permitted_opens[i].listen_host));
-			packet_put_int(permitted_opens[i].listen_port);
-			packet_send();
-			/* unregister */
-			permitted_opens[i].listen_port = 0;
-			permitted_opens[i].port_to_connect = 0;
-			free(permitted_opens[i].host_to_connect);
-			permitted_opens[i].host_to_connect = NULL;
-			free(permitted_opens[i].listen_host);
-			permitted_opens[i].listen_host = NULL;
-			permitted_opens[i].listen_path = NULL;
-			permitted_opens[i].downstream = NULL;
-		}
+	if (c->type == SSH_CHANNEL_MUX_CLIENT)
+		mux_remove_remote_forwardings(ssh, c);
+
+	if (log_level_get() >= SYSLOG_LEVEL_DEBUG3) {
+		s = channel_open_message(ssh);
+		debug3("channel %d: status: %s", c->self, s);
+		free(s);
 	}
 
-	s = channel_open_message();
-	debug3("channel %d: status: %s", c->self, s);
-	free(s);
-
-	if (c->sock != -1)
-		shutdown(c->sock, SHUT_RDWR);
-	channel_close_fds(c);
-	buffer_free(&c->input);
-	buffer_free(&c->output);
-	buffer_free(&c->extended);
+	channel_close_fds(ssh, c);
+	sshbuf_free(c->input);
+	sshbuf_free(c->output);
+	sshbuf_free(c->extended);
+	c->input = c->output = c->extended = NULL;
 	free(c->remote_name);
 	c->remote_name = NULL;
 	free(c->path);
@@ -496,25 +627,26 @@
 	c->listening_addr = NULL;
 	while ((cc = TAILQ_FIRST(&c->status_confirms)) != NULL) {
 		if (cc->abandon_cb != NULL)
-			cc->abandon_cb(c, cc->ctx);
+			cc->abandon_cb(ssh, c, cc->ctx);
 		TAILQ_REMOVE(&c->status_confirms, cc, entry);
 		explicit_bzero(cc, sizeof(*cc));
 		free(cc);
 	}
 	if (c->filter_cleanup != NULL && c->filter_ctx != NULL)
-		c->filter_cleanup(c->self, c->filter_ctx);
-	channels[c->self] = NULL;
+		c->filter_cleanup(ssh, c->self, c->filter_ctx);
+	sc->channels[c->self] = NULL;
+	explicit_bzero(c, sizeof(*c));
 	free(c);
 }
 
 void
-channel_free_all(void)
+channel_free_all(struct ssh *ssh)
 {
 	u_int i;
 
-	for (i = 0; i < channels_alloc; i++)
-		if (channels[i] != NULL)
-			channel_free(channels[i]);
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++)
+		if (ssh->chanctxt->channels[i] != NULL)
+			channel_free(ssh, ssh->chanctxt->channels[i]);
 }
 
 /*
@@ -522,26 +654,26 @@
  * descriptors after a fork.
  */
 void
-channel_close_all(void)
+channel_close_all(struct ssh *ssh)
 {
 	u_int i;
 
-	for (i = 0; i < channels_alloc; i++)
-		if (channels[i] != NULL)
-			channel_close_fds(channels[i]);
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++)
+		if (ssh->chanctxt->channels[i] != NULL)
+			channel_close_fds(ssh, ssh->chanctxt->channels[i]);
 }
 
 /*
  * Stop listening to channels.
  */
 void
-channel_stop_listening(void)
+channel_stop_listening(struct ssh *ssh)
 {
 	u_int i;
 	Channel *c;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		c = ssh->chanctxt->channels[i];
 		if (c != NULL) {
 			switch (c->type) {
 			case SSH_CHANNEL_AUTH_SOCKET:
@@ -550,8 +682,8 @@
 			case SSH_CHANNEL_X11_LISTENER:
 			case SSH_CHANNEL_UNIX_LISTENER:
 			case SSH_CHANNEL_RUNIX_LISTENER:
-				channel_close_fd(&c->sock);
-				channel_free(c);
+				channel_close_fd(ssh, &c->sock);
+				channel_free(ssh, c);
 				break;
 			}
 		}
@@ -563,28 +695,20 @@
  * more channel is overfull.
  */
 int
-channel_not_very_much_buffered_data(void)
+channel_not_very_much_buffered_data(struct ssh *ssh)
 {
 	u_int i;
+	u_int maxsize = ssh_packet_get_maxsize(ssh);
 	Channel *c;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
-		if (c != NULL && c->type == SSH_CHANNEL_OPEN) {
-#if 0
-			if (!compat20 &&
-			    buffer_len(&c->input) > packet_get_maxsize()) {
-				debug2("channel %d: big input buffer %d",
-				    c->self, buffer_len(&c->input));
-				return 0;
-			}
-#endif
-			if (buffer_len(&c->output) > packet_get_maxsize()) {
-				debug2("channel %d: big output buffer %u > %u",
-				    c->self, buffer_len(&c->output),
-				    packet_get_maxsize());
-				return 0;
-			}
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		c = ssh->chanctxt->channels[i];
+		if (c == NULL || c->type != SSH_CHANNEL_OPEN)
+			continue;
+		if (sshbuf_len(c->output) > maxsize) {
+			debug2("channel %d: big output buffer %zu > %u",
+			    c->self, sshbuf_len(c->output), maxsize);
+			return 0;
 		}
 	}
 	return 1;
@@ -592,13 +716,13 @@
 
 /* Returns true if any channel is still open. */
 int
-channel_still_open(void)
+channel_still_open(struct ssh *ssh)
 {
 	u_int i;
 	Channel *c;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		c = ssh->chanctxt->channels[i];
 		if (c == NULL)
 			continue;
 		switch (c->type) {
@@ -609,6 +733,7 @@
 		case SSH_CHANNEL_CLOSED:
 		case SSH_CHANNEL_AUTH_SOCKET:
 		case SSH_CHANNEL_DYNAMIC:
+		case SSH_CHANNEL_RDYNAMIC_OPEN:
 		case SSH_CHANNEL_CONNECTING:
 		case SSH_CHANNEL_ZOMBIE:
 		case SSH_CHANNEL_ABANDONED:
@@ -616,22 +741,16 @@
 		case SSH_CHANNEL_RUNIX_LISTENER:
 			continue;
 		case SSH_CHANNEL_LARVAL:
-			if (!compat20)
-				fatal("cannot happen: SSH_CHANNEL_LARVAL");
 			continue;
 		case SSH_CHANNEL_OPENING:
 		case SSH_CHANNEL_OPEN:
+		case SSH_CHANNEL_RDYNAMIC_FINISH:
 		case SSH_CHANNEL_X11_OPEN:
 		case SSH_CHANNEL_MUX_CLIENT:
 		case SSH_CHANNEL_MUX_PROXY:
 			return 1;
-		case SSH_CHANNEL_INPUT_DRAINING:
-		case SSH_CHANNEL_OUTPUT_DRAINING:
-			if (!compat13)
-				fatal("cannot happen: OUT_DRAIN");
-			return 1;
 		default:
-			fatal("channel_still_open: bad channel type %d", c->type);
+			fatal("%s: bad channel type %d", __func__, c->type);
 			/* NOTREACHED */
 		}
 	}
@@ -640,18 +759,20 @@
 
 /* Returns the id of an open channel suitable for keepaliving */
 int
-channel_find_open(void)
+channel_find_open(struct ssh *ssh)
 {
 	u_int i;
 	Channel *c;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
-		if (c == NULL || c->remote_id < 0)
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		c = ssh->chanctxt->channels[i];
+		if (c == NULL || !c->have_remote_id)
 			continue;
 		switch (c->type) {
 		case SSH_CHANNEL_CLOSED:
 		case SSH_CHANNEL_DYNAMIC:
+		case SSH_CHANNEL_RDYNAMIC_OPEN:
+		case SSH_CHANNEL_RDYNAMIC_FINISH:
 		case SSH_CHANNEL_X11_LISTENER:
 		case SSH_CHANNEL_PORT_LISTENER:
 		case SSH_CHANNEL_RPORT_LISTENER:
@@ -670,13 +791,8 @@
 		case SSH_CHANNEL_OPEN:
 		case SSH_CHANNEL_X11_OPEN:
 			return i;
-		case SSH_CHANNEL_INPUT_DRAINING:
-		case SSH_CHANNEL_OUTPUT_DRAINING:
-			if (!compat13)
-				fatal("cannot happen: OUT_DRAIN");
-			return i;
 		default:
-			fatal("channel_find_open: bad channel type %d", c->type);
+			fatal("%s: bad channel type %d", __func__, c->type);
 			/* NOTREACHED */
 		}
 	}
@@ -689,18 +805,21 @@
  * newlines.
  */
 char *
-channel_open_message(void)
+channel_open_message(struct ssh *ssh)
 {
-	Buffer buffer;
+	struct sshbuf *buf;
 	Channel *c;
-	char buf[1024], *cp;
 	u_int i;
+	int r;
+	char *ret;
 
-	buffer_init(&buffer);
-	snprintf(buf, sizeof buf, "The following connections are open:\r\n");
-	buffer_append(&buffer, buf, strlen(buf));
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
+	if ((buf = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_putf(buf,
+	    "The following connections are open:\r\n")) != 0)
+		fatal("%s: sshbuf_putf: %s", __func__, ssh_err(r));
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		c = ssh->chanctxt->channels[i];
 		if (c == NULL)
 			continue;
 		switch (c->type) {
@@ -719,75 +838,95 @@
 		case SSH_CHANNEL_OPENING:
 		case SSH_CHANNEL_CONNECTING:
 		case SSH_CHANNEL_DYNAMIC:
+		case SSH_CHANNEL_RDYNAMIC_OPEN:
+		case SSH_CHANNEL_RDYNAMIC_FINISH:
 		case SSH_CHANNEL_OPEN:
 		case SSH_CHANNEL_X11_OPEN:
-		case SSH_CHANNEL_INPUT_DRAINING:
-		case SSH_CHANNEL_OUTPUT_DRAINING:
 		case SSH_CHANNEL_MUX_PROXY:
 		case SSH_CHANNEL_MUX_CLIENT:
-			snprintf(buf, sizeof buf,
-			    "  #%d %.300s (t%d r%d i%u/%d o%u/%d fd %d/%d cc %d)\r\n",
+			if ((r = sshbuf_putf(buf, "  #%d %.300s "
+			    "(t%d %s%u i%u/%zu o%u/%zu fd %d/%d cc %d)\r\n",
 			    c->self, c->remote_name,
-			    c->type, c->remote_id,
-			    c->istate, buffer_len(&c->input),
-			    c->ostate, buffer_len(&c->output),
-			    c->rfd, c->wfd, c->ctl_chan);
-			buffer_append(&buffer, buf, strlen(buf));
+			    c->type,
+			    c->have_remote_id ? "r" : "nr", c->remote_id,
+			    c->istate, sshbuf_len(c->input),
+			    c->ostate, sshbuf_len(c->output),
+			    c->rfd, c->wfd, c->ctl_chan)) != 0)
+				fatal("%s: sshbuf_putf: %s",
+				    __func__, ssh_err(r));
 			continue;
 		default:
-			fatal("channel_open_message: bad channel type %d", c->type);
+			fatal("%s: bad channel type %d", __func__, c->type);
 			/* NOTREACHED */
 		}
 	}
-	buffer_append(&buffer, "\0", 1);
-	cp = xstrdup((char *)buffer_ptr(&buffer));
-	buffer_free(&buffer);
-	return cp;
+	if ((ret = sshbuf_dup_string(buf)) == NULL)
+		fatal("%s: sshbuf_dup_string", __func__);
+	sshbuf_free(buf);
+	return ret;
+}
+
+static void
+open_preamble(struct ssh *ssh, const char *where, Channel *c, const char *type)
+{
+	int r;
+
+	if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_OPEN)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, type)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->self)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->local_maxpacket)) != 0) {
+		fatal("%s: channel %i: open: %s", where, c->self, ssh_err(r));
+	}
 }
 
 void
-channel_send_open(int id)
+channel_send_open(struct ssh *ssh, int id)
 {
-	Channel *c = channel_lookup(id);
+	Channel *c = channel_lookup(ssh, id);
+	int r;
 
 	if (c == NULL) {
 		logit("channel_send_open: %d: bad id", id);
 		return;
 	}
 	debug2("channel %d: send open", id);
-	packet_start(SSH2_MSG_CHANNEL_OPEN);
-	packet_put_cstring(c->ctype);
-	packet_put_int(c->self);
-	packet_put_int(c->local_window);
-	packet_put_int(c->local_maxpacket);
-	packet_send();
+	open_preamble(ssh, __func__, c, c->ctype);
+	if ((r = sshpkt_send(ssh)) != 0)
+		fatal("%s: channel %i: %s", __func__, c->self, ssh_err(r));
 }
 
 void
-channel_request_start(int id, char *service, int wantconfirm)
+channel_request_start(struct ssh *ssh, int id, char *service, int wantconfirm)
 {
-	Channel *c = channel_lookup(id);
+	Channel *c = channel_lookup(ssh, id);
+	int r;
 
 	if (c == NULL) {
-		logit("channel_request_start: %d: unknown channel id", id);
+		logit("%s: %d: unknown channel id", __func__, id);
 		return;
 	}
+	if (!c->have_remote_id)
+		fatal(":%s: channel %d: no remote id", __func__, c->self);
+
 	debug2("channel %d: request %s confirm %d", id, service, wantconfirm);
-	packet_start(SSH2_MSG_CHANNEL_REQUEST);
-	packet_put_int(c->remote_id);
-	packet_put_cstring(service);
-	packet_put_char(wantconfirm);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_REQUEST)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, service)) != 0 ||
+	    (r = sshpkt_put_u8(ssh, wantconfirm)) != 0) {
+		fatal("%s: channel %i: %s", __func__, c->self, ssh_err(r));
+	}
 }
 
 void
-channel_register_status_confirm(int id, channel_confirm_cb *cb,
-    channel_confirm_abandon_cb *abandon_cb, void *ctx)
+channel_register_status_confirm(struct ssh *ssh, int id,
+    channel_confirm_cb *cb, channel_confirm_abandon_cb *abandon_cb, void *ctx)
 {
 	struct channel_confirm *cc;
 	Channel *c;
 
-	if ((c = channel_lookup(id)) == NULL)
-		fatal("channel_register_expect: %d: bad id", id);
+	if ((c = channel_lookup(ssh, id)) == NULL)
+		fatal("%s: %d: bad id", __func__, id);
 
 	cc = xcalloc(1, sizeof(*cc));
 	cc->cb = cb;
@@ -797,12 +936,13 @@
 }
 
 void
-channel_register_open_confirm(int id, channel_open_fn *fn, void *ctx)
+channel_register_open_confirm(struct ssh *ssh, int id,
+    channel_open_fn *fn, void *ctx)
 {
-	Channel *c = channel_lookup(id);
+	Channel *c = channel_lookup(ssh, id);
 
 	if (c == NULL) {
-		logit("channel_register_open_confirm: %d: bad id", id);
+		logit("%s: %d: bad id", __func__, id);
 		return;
 	}
 	c->open_confirm = fn;
@@ -810,12 +950,13 @@
 }
 
 void
-channel_register_cleanup(int id, channel_callback_fn *fn, int do_close)
+channel_register_cleanup(struct ssh *ssh, int id,
+    channel_callback_fn *fn, int do_close)
 {
-	Channel *c = channel_by_id(id);
+	Channel *c = channel_by_id(ssh, id);
 
 	if (c == NULL) {
-		logit("channel_register_cleanup: %d: bad id", id);
+		logit("%s: %d: bad id", __func__, id);
 		return;
 	}
 	c->detach_user = fn;
@@ -823,12 +964,12 @@
 }
 
 void
-channel_cancel_cleanup(int id)
+channel_cancel_cleanup(struct ssh *ssh, int id)
 {
-	Channel *c = channel_by_id(id);
+	Channel *c = channel_by_id(ssh, id);
 
 	if (c == NULL) {
-		logit("channel_cancel_cleanup: %d: bad id", id);
+		logit("%s: %d: bad id", __func__, id);
 		return;
 	}
 	c->detach_user = NULL;
@@ -836,13 +977,13 @@
 }
 
 void
-channel_register_filter(int id, channel_infilter_fn *ifn,
+channel_register_filter(struct ssh *ssh, int id, channel_infilter_fn *ifn,
     channel_outfilter_fn *ofn, channel_filter_cleanup_fn *cfn, void *ctx)
 {
-	Channel *c = channel_lookup(id);
+	Channel *c = channel_lookup(ssh, id);
 
 	if (c == NULL) {
-		logit("channel_register_filter: %d: bad id", id);
+		logit("%s: %d: bad id", __func__, id);
 		return;
 	}
 	c->input_filter = ifn;
@@ -852,118 +993,80 @@
 }
 
 void
-channel_set_fds(int id, int rfd, int wfd, int efd,
+channel_set_fds(struct ssh *ssh, int id, int rfd, int wfd, int efd,
     int extusage, int nonblock, int is_tty, u_int window_max)
 {
-	Channel *c = channel_lookup(id);
+	Channel *c = channel_lookup(ssh, id);
+	int r;
 
 	if (c == NULL || c->type != SSH_CHANNEL_LARVAL)
 		fatal("channel_activate for non-larval channel %d.", id);
-	channel_register_fds(c, rfd, wfd, efd, extusage, nonblock, is_tty);
+	if (!c->have_remote_id)
+		fatal(":%s: channel %d: no remote id", __func__, c->self);
+
+	channel_register_fds(ssh, c, rfd, wfd, efd, extusage, nonblock, is_tty);
 	c->type = SSH_CHANNEL_OPEN;
 	c->local_window = c->local_window_max = window_max;
-	packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
-	packet_put_int(c->remote_id);
-	packet_put_int(c->local_window);
-	packet_send();
+
+	if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_WINDOW_ADJUST)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: channel %i: %s", __func__, c->self, ssh_err(r));
 }
 
-/*
- * 'channel_pre*' are called just before select() to add any bits relevant to
- * channels in the select bitmasks.
- */
-/*
- * 'channel_post*': perform any appropriate operations for channels which
- * have events pending.
- */
-typedef void chan_fn(Channel *c, fd_set *readset, fd_set *writeset);
-chan_fn *channel_pre[SSH_CHANNEL_MAX_TYPE];
-chan_fn *channel_post[SSH_CHANNEL_MAX_TYPE];
-
-/* ARGSUSED */
 static void
-channel_pre_listener(Channel *c, fd_set *readset, fd_set *writeset)
+channel_pre_listener(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	FD_SET(c->sock, readset);
 }
 
-/* ARGSUSED */
 static void
-channel_pre_connecting(Channel *c, fd_set *readset, fd_set *writeset)
+channel_pre_connecting(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	debug3("channel %d: waiting for connection", c->self);
 	FD_SET(c->sock, writeset);
 }
 
 static void
-channel_pre_open_13(Channel *c, fd_set *readset, fd_set *writeset)
+channel_pre_open(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
-	if (buffer_len(&c->input) < packet_get_maxsize())
-		FD_SET(c->sock, readset);
-	if (buffer_len(&c->output) > 0)
-		FD_SET(c->sock, writeset);
-}
-
-static void
-channel_pre_open(Channel *c, fd_set *readset, fd_set *writeset)
-{
-	u_int limit = compat20 ? c->remote_window : packet_get_maxsize();
-
 	if (c->istate == CHAN_INPUT_OPEN &&
-	    limit > 0 &&
-	    buffer_len(&c->input) < limit &&
-	    buffer_check_alloc(&c->input, CHAN_RBUF))
+	    c->remote_window > 0 &&
+	    sshbuf_len(c->input) < c->remote_window &&
+	    sshbuf_check_reserve(c->input, CHAN_RBUF) == 0)
 		FD_SET(c->rfd, readset);
 	if (c->ostate == CHAN_OUTPUT_OPEN ||
 	    c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
-		if (buffer_len(&c->output) > 0) {
+		if (sshbuf_len(c->output) > 0) {
 			FD_SET(c->wfd, writeset);
 		} else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
 			if (CHANNEL_EFD_OUTPUT_ACTIVE(c))
-				debug2("channel %d: obuf_empty delayed efd %d/(%d)",
-				    c->self, c->efd, buffer_len(&c->extended));
+				debug2("channel %d: "
+				    "obuf_empty delayed efd %d/(%zu)", c->self,
+				    c->efd, sshbuf_len(c->extended));
 			else
-				chan_obuf_empty(c);
+				chan_obuf_empty(ssh, c);
 		}
 	}
 	/** XXX check close conditions, too */
-	if (compat20 && c->efd != -1 && 
-	    !(c->istate == CHAN_INPUT_CLOSED && c->ostate == CHAN_OUTPUT_CLOSED)) {
+	if (c->efd != -1 && !(c->istate == CHAN_INPUT_CLOSED &&
+	    c->ostate == CHAN_OUTPUT_CLOSED)) {
 		if (c->extended_usage == CHAN_EXTENDED_WRITE &&
-		    buffer_len(&c->extended) > 0)
+		    sshbuf_len(c->extended) > 0)
 			FD_SET(c->efd, writeset);
 		else if (c->efd != -1 && !(c->flags & CHAN_EOF_SENT) &&
 		    (c->extended_usage == CHAN_EXTENDED_READ ||
 		    c->extended_usage == CHAN_EXTENDED_IGNORE) &&
-		    buffer_len(&c->extended) < c->remote_window)
+		    sshbuf_len(c->extended) < c->remote_window)
 			FD_SET(c->efd, readset);
 	}
 	/* XXX: What about efd? races? */
 }
 
-/* ARGSUSED */
-static void
-channel_pre_input_draining(Channel *c, fd_set *readset, fd_set *writeset)
-{
-	if (buffer_len(&c->input) == 0) {
-		packet_start(SSH_MSG_CHANNEL_CLOSE);
-		packet_put_int(c->remote_id);
-		packet_send();
-		c->type = SSH_CHANNEL_CLOSED;
-		debug2("channel %d: closing after input drain.", c->self);
-	}
-}
-
-/* ARGSUSED */
-static void
-channel_pre_output_draining(Channel *c, fd_set *readset, fd_set *writeset)
-{
-	if (buffer_len(&c->output) == 0)
-		chan_mark_dead(c);
-	else
-		FD_SET(c->sock, writeset);
-}
-
 /*
  * This is a special state for X11 authentication spoofing.  An opened X11
  * connection (when authentication spoofing is being done) remains in this
@@ -974,24 +1077,26 @@
  * Returns: 0 = need more data, -1 = wrong cookie, 1 = ok
  */
 static int
-x11_open_helper(Buffer *b)
+x11_open_helper(struct ssh *ssh, struct sshbuf *b)
 {
+	struct ssh_channels *sc = ssh->chanctxt;
 	u_char *ucp;
 	u_int proto_len, data_len;
 
 	/* Is this being called after the refusal deadline? */
-	if (x11_refuse_time != 0 && (u_int)monotime() >= x11_refuse_time) {
+	if (sc->x11_refuse_time != 0 &&
+	    (u_int)monotime() >= sc->x11_refuse_time) {
 		verbose("Rejected X11 connection after ForwardX11Timeout "
 		    "expired");
 		return -1;
 	}
 
 	/* Check if the fixed size part of the packet is in buffer. */
-	if (buffer_len(b) < 12)
+	if (sshbuf_len(b) < 12)
 		return 0;
 
 	/* Parse the lengths of variable-length fields. */
-	ucp = buffer_ptr(b);
+	ucp = sshbuf_mutable_ptr(b);
 	if (ucp[0] == 0x42) {	/* Byte order MSB first. */
 		proto_len = 256 * ucp[6] + ucp[7];
 		data_len = 256 * ucp[8] + ucp[9];
@@ -1005,27 +1110,27 @@
 	}
 
 	/* Check if the whole packet is in buffer. */
-	if (buffer_len(b) <
+	if (sshbuf_len(b) <
 	    12 + ((proto_len + 3) & ~3) + ((data_len + 3) & ~3))
 		return 0;
 
 	/* Check if authentication protocol matches. */
-	if (proto_len != strlen(x11_saved_proto) ||
-	    memcmp(ucp + 12, x11_saved_proto, proto_len) != 0) {
+	if (proto_len != strlen(sc->x11_saved_proto) ||
+	    memcmp(ucp + 12, sc->x11_saved_proto, proto_len) != 0) {
 		debug2("X11 connection uses different authentication protocol.");
 		return -1;
 	}
 	/* Check if authentication data matches our fake data. */
-	if (data_len != x11_fake_data_len ||
+	if (data_len != sc->x11_fake_data_len ||
 	    timingsafe_bcmp(ucp + 12 + ((proto_len + 3) & ~3),
-		x11_fake_data, x11_fake_data_len) != 0) {
+		sc->x11_fake_data, sc->x11_fake_data_len) != 0) {
 		debug2("X11 auth data does not match fake data.");
 		return -1;
 	}
 	/* Check fake data length */
-	if (x11_fake_data_len != x11_saved_data_len) {
+	if (sc->x11_fake_data_len != sc->x11_saved_data_len) {
 		error("X11 fake_data_len %d != saved_data_len %d",
-		    x11_fake_data_len, x11_saved_data_len);
+		    sc->x11_fake_data_len, sc->x11_saved_data_len);
 		return -1;
 	}
 	/*
@@ -1034,90 +1139,63 @@
 	 * data.
 	 */
 	memcpy(ucp + 12 + ((proto_len + 3) & ~3),
-	    x11_saved_data, x11_saved_data_len);
+	    sc->x11_saved_data, sc->x11_saved_data_len);
 	return 1;
 }
 
 static void
-channel_pre_x11_open_13(Channel *c, fd_set *readset, fd_set *writeset)
+channel_pre_x11_open(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
-	int ret = x11_open_helper(&c->output);
-
-	if (ret == 1) {
-		/* Start normal processing for the channel. */
-		c->type = SSH_CHANNEL_OPEN;
-		channel_pre_open_13(c, readset, writeset);
-	} else if (ret == -1) {
-		/*
-		 * We have received an X11 connection that has bad
-		 * authentication information.
-		 */
-		logit("X11 connection rejected because of wrong authentication.");
-		buffer_clear(&c->input);
-		buffer_clear(&c->output);
-		channel_close_fd(&c->sock);
-		c->sock = -1;
-		c->type = SSH_CHANNEL_CLOSED;
-		packet_start(SSH_MSG_CHANNEL_CLOSE);
-		packet_put_int(c->remote_id);
-		packet_send();
-	}
-}
-
-static void
-channel_pre_x11_open(Channel *c, fd_set *readset, fd_set *writeset)
-{
-	int ret = x11_open_helper(&c->output);
+	int ret = x11_open_helper(ssh, c->output);
 
 	/* c->force_drain = 1; */
 
 	if (ret == 1) {
 		c->type = SSH_CHANNEL_OPEN;
-		channel_pre_open(c, readset, writeset);
+		channel_pre_open(ssh, c, readset, writeset);
 	} else if (ret == -1) {
 		logit("X11 connection rejected because of wrong authentication.");
-		debug2("X11 rejected %d i%d/o%d", c->self, c->istate, c->ostate);
-		chan_read_failed(c);
-		buffer_clear(&c->input);
-		chan_ibuf_empty(c);
-		buffer_clear(&c->output);
-		/* for proto v1, the peer will send an IEOF */
-		if (compat20)
-			chan_write_failed(c);
-		else
-			c->type = SSH_CHANNEL_OPEN;
+		debug2("X11 rejected %d i%d/o%d",
+		    c->self, c->istate, c->ostate);
+		chan_read_failed(ssh, c);
+		sshbuf_reset(c->input);
+		chan_ibuf_empty(ssh, c);
+		sshbuf_reset(c->output);
+		chan_write_failed(ssh, c);
 		debug2("X11 closed %d i%d/o%d", c->self, c->istate, c->ostate);
 	}
 }
 
 static void
-channel_pre_mux_client(Channel *c, fd_set *readset, fd_set *writeset)
+channel_pre_mux_client(struct ssh *ssh,
+    Channel *c, fd_set *readset, fd_set *writeset)
 {
 	if (c->istate == CHAN_INPUT_OPEN && !c->mux_pause &&
-	    buffer_check_alloc(&c->input, CHAN_RBUF))
+	    sshbuf_check_reserve(c->input, CHAN_RBUF) == 0)
 		FD_SET(c->rfd, readset);
 	if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
 		/* clear buffer immediately (discard any partial packet) */
-		buffer_clear(&c->input);
-		chan_ibuf_empty(c);
+		sshbuf_reset(c->input);
+		chan_ibuf_empty(ssh, c);
 		/* Start output drain. XXX just kill chan? */
-		chan_rcvd_oclose(c);
+		chan_rcvd_oclose(ssh, c);
 	}
 	if (c->ostate == CHAN_OUTPUT_OPEN ||
 	    c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
-		if (buffer_len(&c->output) > 0)
+		if (sshbuf_len(c->output) > 0)
 			FD_SET(c->wfd, writeset);
 		else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN)
-			chan_obuf_empty(c);
+			chan_obuf_empty(ssh, c);
 	}
 }
 
 /* try to decode a socks4 header */
-/* ARGSUSED */
 static int
-channel_decode_socks4(Channel *c, fd_set *readset, fd_set *writeset)
+channel_decode_socks4(Channel *c, struct sshbuf *input, struct sshbuf *output)
 {
-	char *p, *host;
+	const u_char *p;
+	char *host;
 	u_int len, have, i, found, need;
 	char username[256];
 	struct {
@@ -1126,14 +1204,15 @@
 		u_int16_t dest_port;
 		struct in_addr dest_addr;
 	} s4_req, s4_rsp;
+	int r;
 
 	debug2("channel %d: decode socks4", c->self);
 
-	have = buffer_len(&c->input);
+	have = sshbuf_len(input);
 	len = sizeof(s4_req);
 	if (have < len)
 		return 0;
-	p = (char *)buffer_ptr(&c->input);
+	p = sshbuf_ptr(input);
 
 	need = 1;
 	/* SOCKS4A uses an invalid IP address 0.0.0.x */
@@ -1158,46 +1237,55 @@
 	}
 	if (found < need)
 		return 0;
-	buffer_get(&c->input, (char *)&s4_req.version, 1);
-	buffer_get(&c->input, (char *)&s4_req.command, 1);
-	buffer_get(&c->input, (char *)&s4_req.dest_port, 2);
-	buffer_get(&c->input, (char *)&s4_req.dest_addr, 4);
-	have = buffer_len(&c->input);
-	p = (char *)buffer_ptr(&c->input);
-	if (memchr(p, '\0', have) == NULL)
-		fatal("channel %d: decode socks4: user not nul terminated",
+	if ((r = sshbuf_get(input, &s4_req.version, 1)) != 0 ||
+	    (r = sshbuf_get(input, &s4_req.command, 1)) != 0 ||
+	    (r = sshbuf_get(input, &s4_req.dest_port, 2)) != 0 ||
+	    (r = sshbuf_get(input, &s4_req.dest_addr, 4)) != 0) {
+		debug("channels %d: decode socks4: %s", c->self, ssh_err(r));
+		return -1;
+	}
+	have = sshbuf_len(input);
+	p = sshbuf_ptr(input);
+	if (memchr(p, '\0', have) == NULL) {
+		error("channel %d: decode socks4: user not nul terminated",
 		    c->self);
+		return -1;
+	}
 	len = strlen(p);
 	debug2("channel %d: decode socks4: user %s/%d", c->self, p, len);
-	len++;					/* trailing '\0' */
-	if (len > have)
-		fatal("channel %d: decode socks4: len %d > have %d",
-		    c->self, len, have);
+	len++; /* trailing '\0' */
 	strlcpy(username, p, sizeof(username));
-	buffer_consume(&c->input, len);
-
+	if ((r = sshbuf_consume(input, len)) != 0) {
+		fatal("%s: channel %d: consume: %s", __func__,
+		    c->self, ssh_err(r));
+	}
 	free(c->path);
 	c->path = NULL;
 	if (need == 1) {			/* SOCKS4: one string */
 		host = inet_ntoa(s4_req.dest_addr);
 		c->path = xstrdup(host);
 	} else {				/* SOCKS4A: two strings */
-		have = buffer_len(&c->input);
-		p = (char *)buffer_ptr(&c->input);
+		have = sshbuf_len(input);
+		p = sshbuf_ptr(input);
+		if (memchr(p, '\0', have) == NULL) {
+			error("channel %d: decode socks4a: host not nul "
+			    "terminated", c->self);
+			return -1;
+		}
 		len = strlen(p);
 		debug2("channel %d: decode socks4a: host %s/%d",
 		    c->self, p, len);
 		len++;				/* trailing '\0' */
-		if (len > have)
-			fatal("channel %d: decode socks4a: len %d > have %d",
-			    c->self, len, have);
 		if (len > NI_MAXHOST) {
 			error("channel %d: hostname \"%.100s\" too long",
 			    c->self, p);
 			return -1;
 		}
 		c->path = xstrdup(p);
-		buffer_consume(&c->input, len);
+		if ((r = sshbuf_consume(input, len)) != 0) {
+			fatal("%s: channel %d: consume: %s", __func__,
+			    c->self, ssh_err(r));
+		}
 	}
 	c->host_port = ntohs(s4_req.dest_port);
 
@@ -1213,7 +1301,10 @@
 	s4_rsp.command = 90;			/* cd: req granted */
 	s4_rsp.dest_port = 0;			/* ignored */
 	s4_rsp.dest_addr.s_addr = INADDR_ANY;	/* ignored */
-	buffer_append(&c->output, &s4_rsp, sizeof(s4_rsp));
+	if ((r = sshbuf_put(output, &s4_rsp, sizeof(s4_rsp))) != 0) {
+		fatal("%s: channel %d: append reply: %s", __func__,
+		    c->self, ssh_err(r));
+	}
 	return 1;
 }
 
@@ -1226,10 +1317,10 @@
 #define SSH_SOCKS5_CONNECT	0x01
 #define SSH_SOCKS5_SUCCESS	0x00
 
-/* ARGSUSED */
 static int
-channel_decode_socks5(Channel *c, fd_set *readset, fd_set *writeset)
+channel_decode_socks5(Channel *c, struct sshbuf *input, struct sshbuf *output)
 {
+	/* XXX use get/put_u8 instead of trusting struct padding */
 	struct {
 		u_int8_t version;
 		u_int8_t command;
@@ -1238,14 +1329,15 @@
 	} s5_req, s5_rsp;
 	u_int16_t dest_port;
 	char dest_addr[255+1], ntop[INET6_ADDRSTRLEN];
-	u_char *p;
+	const u_char *p;
 	u_int have, need, i, found, nmethods, addrlen, af;
+	int r;
 
 	debug2("channel %d: decode socks5", c->self);
-	p = buffer_ptr(&c->input);
+	p = sshbuf_ptr(input);
 	if (p[0] != 0x05)
 		return -1;
-	have = buffer_len(&c->input);
+	have = sshbuf_len(input);
 	if (!(c->flags & SSH_SOCKS5_AUTHDONE)) {
 		/* format: ver | nmethods | methods */
 		if (have < 2)
@@ -1265,10 +1357,16 @@
 			    c->self);
 			return -1;
 		}
-		buffer_consume(&c->input, nmethods + 2);
-		buffer_put_char(&c->output, 0x05);		/* version */
-		buffer_put_char(&c->output, SSH_SOCKS5_NOAUTH);	/* method */
-		FD_SET(c->sock, writeset);
+		if ((r = sshbuf_consume(input, nmethods + 2)) != 0) {
+			fatal("%s: channel %d: consume: %s", __func__,
+			    c->self, ssh_err(r));
+		}
+		/* version, method */
+		if ((r = sshbuf_put_u8(output, 0x05)) != 0 ||
+		    (r = sshbuf_put_u8(output, SSH_SOCKS5_NOAUTH)) != 0) {
+			fatal("%s: channel %d: append reply: %s", __func__,
+			    c->self, ssh_err(r));
+		}
 		c->flags |= SSH_SOCKS5_AUTHDONE;
 		debug2("channel %d: socks5 auth done", c->self);
 		return 0;				/* need more */
@@ -1305,11 +1403,22 @@
 		need++;
 	if (have < need)
 		return 0;
-	buffer_consume(&c->input, sizeof(s5_req));
-	if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
-		buffer_consume(&c->input, 1);    /* host string length */
-	buffer_get(&c->input, &dest_addr, addrlen);
-	buffer_get(&c->input, (char *)&dest_port, 2);
+	if ((r = sshbuf_consume(input, sizeof(s5_req))) != 0) {
+		fatal("%s: channel %d: consume: %s", __func__,
+		    c->self, ssh_err(r));
+	}
+	if (s5_req.atyp == SSH_SOCKS5_DOMAIN) {
+		/* host string length */
+		if ((r = sshbuf_consume(input, 1)) != 0) {
+			fatal("%s: channel %d: consume: %s", __func__,
+			    c->self, ssh_err(r));
+		}
+	}
+	if ((r = sshbuf_get(input, &dest_addr, addrlen)) != 0 ||
+	    (r = sshbuf_get(input, &dest_port, 2)) != 0) {
+		debug("channel %d: parse addr/port: %s", c->self, ssh_err(r));
+		return -1;
+	}
 	dest_addr[addrlen] = '\0';
 	free(c->path);
 	c->path = NULL;
@@ -1336,22 +1445,23 @@
 	s5_rsp.atyp = SSH_SOCKS5_IPV4;
 	dest_port = 0;				/* ignored */
 
-	buffer_append(&c->output, &s5_rsp, sizeof(s5_rsp));
-	buffer_put_int(&c->output, ntohl(INADDR_ANY)); /* bind address */
-	buffer_append(&c->output, &dest_port, sizeof(dest_port));
+	if ((r = sshbuf_put(output, &s5_rsp, sizeof(s5_rsp))) != 0 ||
+	    (r = sshbuf_put_u32(output, ntohl(INADDR_ANY))) != 0 ||
+	    (r = sshbuf_put(output, &dest_port, sizeof(dest_port))) != 0)
+		fatal("%s: channel %d: append reply: %s", __func__,
+		    c->self, ssh_err(r));
 	return 1;
 }
 
 Channel *
-channel_connect_stdio_fwd(const char *host_to_connect, u_short port_to_connect,
-    int in, int out)
+channel_connect_stdio_fwd(struct ssh *ssh,
+    const char *host_to_connect, u_short port_to_connect, int in, int out)
 {
 	Channel *c;
 
-	debug("channel_connect_stdio_fwd %s:%d", host_to_connect,
-	    port_to_connect);
+	debug("%s %s:%d", __func__, host_to_connect, port_to_connect);
 
-	c = channel_new("stdio-forward", SSH_CHANNEL_OPENING, in, out,
+	c = channel_new(ssh, "stdio-forward", SSH_CHANNEL_OPENING, in, out,
 	    -1, CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
 	    0, "stdio-forward", /*nonblock*/0);
 
@@ -1360,23 +1470,24 @@
 	c->listening_port = 0;
 	c->force_drain = 1;
 
-	channel_register_fds(c, in, out, -1, 0, 1, 0);
-	port_open_helper(c, "direct-tcpip");
+	channel_register_fds(ssh, c, in, out, -1, 0, 1, 0);
+	port_open_helper(ssh, c, "direct-tcpip");
 
 	return c;
 }
 
 /* dynamic port forwarding */
 static void
-channel_pre_dynamic(Channel *c, fd_set *readset, fd_set *writeset)
+channel_pre_dynamic(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
-	u_char *p;
+	const u_char *p;
 	u_int have;
 	int ret;
 
-	have = buffer_len(&c->input);
+	have = sshbuf_len(c->input);
 	debug2("channel %d: pre_dynamic: have %d", c->self, have);
-	/* buffer_dump(&c->input); */
+	/* sshbuf_dump(c->input, stderr); */
 	/* check if the fixed size part of the packet is in buffer. */
 	if (have < 3) {
 		/* need more */
@@ -1384,105 +1495,169 @@
 		return;
 	}
 	/* try to guess the protocol */
-	p = buffer_ptr(&c->input);
+	p = sshbuf_ptr(c->input);
+	/* XXX sshbuf_peek_u8? */
 	switch (p[0]) {
 	case 0x04:
-		ret = channel_decode_socks4(c, readset, writeset);
+		ret = channel_decode_socks4(c, c->input, c->output);
 		break;
 	case 0x05:
-		ret = channel_decode_socks5(c, readset, writeset);
+		ret = channel_decode_socks5(c, c->input, c->output);
 		break;
 	default:
 		ret = -1;
 		break;
 	}
 	if (ret < 0) {
-		chan_mark_dead(c);
+		chan_mark_dead(ssh, c);
 	} else if (ret == 0) {
 		debug2("channel %d: pre_dynamic: need more", c->self);
 		/* need more */
 		FD_SET(c->sock, readset);
+		if (sshbuf_len(c->output))
+			FD_SET(c->sock, writeset);
 	} else {
 		/* switch to the next state */
 		c->type = SSH_CHANNEL_OPENING;
-		port_open_helper(c, "direct-tcpip");
+		port_open_helper(ssh, c, "direct-tcpip");
+	}
+}
+
+/* simulate read-error */
+static void
+rdynamic_close(struct ssh *ssh, Channel *c)
+{
+	c->type = SSH_CHANNEL_OPEN;
+	chan_read_failed(ssh, c);
+	sshbuf_reset(c->input);
+	chan_ibuf_empty(ssh, c);
+	sshbuf_reset(c->output);
+	chan_write_failed(ssh, c);
+}
+
+/* reverse dynamic port forwarding */
+static void
+channel_before_prepare_select_rdynamic(struct ssh *ssh, Channel *c)
+{
+	const u_char *p;
+	u_int have, len;
+	int r, ret;
+
+	have = sshbuf_len(c->output);
+	debug2("channel %d: pre_rdynamic: have %d", c->self, have);
+	/* sshbuf_dump(c->output, stderr); */
+	/* EOF received */
+	if (c->flags & CHAN_EOF_RCVD) {
+		if ((r = sshbuf_consume(c->output, have)) != 0) {
+			fatal("%s: channel %d: consume: %s",
+			    __func__, c->self, ssh_err(r));
+		}
+		rdynamic_close(ssh, c);
+		return;
+	}
+	/* check if the fixed size part of the packet is in buffer. */
+	if (have < 3)
+		return;
+	/* try to guess the protocol */
+	p = sshbuf_ptr(c->output);
+	switch (p[0]) {
+	case 0x04:
+		/* switch input/output for reverse forwarding */
+		ret = channel_decode_socks4(c, c->output, c->input);
+		break;
+	case 0x05:
+		ret = channel_decode_socks5(c, c->output, c->input);
+		break;
+	default:
+		ret = -1;
+		break;
+	}
+	if (ret < 0) {
+		rdynamic_close(ssh, c);
+	} else if (ret == 0) {
+		debug2("channel %d: pre_rdynamic: need more", c->self);
+		/* send socks request to peer */
+		len = sshbuf_len(c->input);
+		if (len > 0 && len < c->remote_window) {
+			if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_DATA)) != 0 ||
+			    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+			    (r = sshpkt_put_stringb(ssh, c->input)) != 0 ||
+			    (r = sshpkt_send(ssh)) != 0) {
+				fatal("%s: channel %i: rdynamic: %s", __func__,
+				    c->self, ssh_err(r));
+			}
+			if ((r = sshbuf_consume(c->input, len)) != 0) {
+				fatal("%s: channel %d: consume: %s",
+				    __func__, c->self, ssh_err(r));
+			}
+			c->remote_window -= len;
+		}
+	} else if (rdynamic_connect_finish(ssh, c) < 0) {
+		/* the connect failed */
+		rdynamic_close(ssh, c);
 	}
 }
 
 /* This is our fake X11 server socket. */
-/* ARGSUSED */
 static void
-channel_post_x11_listener(Channel *c, fd_set *readset, fd_set *writeset)
+channel_post_x11_listener(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	Channel *nc;
 	struct sockaddr_storage addr;
-	int newsock, oerrno;
+	int r, newsock, oerrno, remote_port;
 	socklen_t addrlen;
 	char buf[16384], *remote_ipaddr;
-	int remote_port;
 
-	if (FD_ISSET(c->sock, readset)) {
-		debug("X11 connection requested.");
-		addrlen = sizeof(addr);
-		newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
-		if (c->single_connection) {
-			oerrno = errno;
-			debug2("single_connection: closing X11 listener.");
-			channel_close_fd(&c->sock);
-			chan_mark_dead(c);
-			errno = oerrno;
-		}
-		if (newsock < 0) {
-			if (errno != EINTR && errno != EWOULDBLOCK &&
-			    errno != ECONNABORTED)
-				error("accept: %.100s", strerror(errno));
-			if (errno == EMFILE || errno == ENFILE)
-				c->notbefore = monotime() + 1;
-			return;
-		}
-		set_nodelay(newsock);
-		remote_ipaddr = get_peer_ipaddr(newsock);
-		remote_port = get_peer_port(newsock);
-		snprintf(buf, sizeof buf, "X11 connection from %.200s port %d",
-		    remote_ipaddr, remote_port);
+	if (!FD_ISSET(c->sock, readset))
+		return;
 
-		nc = channel_new("accepted x11 socket",
-		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
-		    c->local_window_max, c->local_maxpacket, 0, buf, 1);
-		if (compat20) {
-			packet_start(SSH2_MSG_CHANNEL_OPEN);
-			packet_put_cstring("x11");
-			packet_put_int(nc->self);
-			packet_put_int(nc->local_window_max);
-			packet_put_int(nc->local_maxpacket);
-			/* originator ipaddr and port */
-			packet_put_cstring(remote_ipaddr);
-			if (datafellows & SSH_BUG_X11FWD) {
-				debug2("ssh2 x11 bug compat mode");
-			} else {
-				packet_put_int(remote_port);
-			}
-			packet_send();
-		} else {
-			packet_start(SSH_SMSG_X11_OPEN);
-			packet_put_int(nc->self);
-			if (packet_get_protocol_flags() &
-			    SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
-				packet_put_cstring(buf);
-			packet_send();
-		}
-		free(remote_ipaddr);
+	debug("X11 connection requested.");
+	addrlen = sizeof(addr);
+	newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
+	if (c->single_connection) {
+		oerrno = errno;
+		debug2("single_connection: closing X11 listener.");
+		channel_close_fd(ssh, &c->sock);
+		chan_mark_dead(ssh, c);
+		errno = oerrno;
 	}
+	if (newsock < 0) {
+		if (errno != EINTR && errno != EWOULDBLOCK &&
+		    errno != ECONNABORTED)
+			error("accept: %.100s", strerror(errno));
+		if (errno == EMFILE || errno == ENFILE)
+			c->notbefore = monotime() + 1;
+		return;
+	}
+	set_nodelay(newsock);
+	remote_ipaddr = get_peer_ipaddr(newsock);
+	remote_port = get_peer_port(newsock);
+	snprintf(buf, sizeof buf, "X11 connection from %.200s port %d",
+	    remote_ipaddr, remote_port);
+
+	nc = channel_new(ssh, "accepted x11 socket",
+	    SSH_CHANNEL_OPENING, newsock, newsock, -1,
+	    c->local_window_max, c->local_maxpacket, 0, buf, 1);
+	open_preamble(ssh, __func__, nc, "x11");
+	if ((r = sshpkt_put_cstring(ssh, remote_ipaddr)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, remote_port)) != 0) {
+		fatal("%s: channel %i: reply %s", __func__,
+		    c->self, ssh_err(r));
+	}
+	if ((r = sshpkt_send(ssh)) != 0)
+		fatal("%s: channel %i: send %s", __func__, c->self, ssh_err(r));
+	free(remote_ipaddr);
 }
 
 static void
-port_open_helper(Channel *c, char *rtype)
+port_open_helper(struct ssh *ssh, Channel *c, char *rtype)
 {
-	char buf[1024];
 	char *local_ipaddr = get_local_ipaddr(c->sock);
 	int local_port = c->sock == -1 ? 65536 : get_local_port(c->sock);
 	char *remote_ipaddr = get_peer_ipaddr(c->sock);
 	int remote_port = get_peer_port(c->sock);
+	int r;
 
 	if (remote_port == -1) {
 		/* Fake addr/port to appease peers that validate it (Tectia) */
@@ -1491,84 +1666,73 @@
 		remote_port = 65535;
 	}
 
-	snprintf(buf, sizeof buf,
+	free(c->remote_name);
+	xasprintf(&c->remote_name,
 	    "%s: listening port %d for %.100s port %d, "
 	    "connect from %.200s port %d to %.100s port %d",
 	    rtype, c->listening_port, c->path, c->host_port,
 	    remote_ipaddr, remote_port, local_ipaddr, local_port);
 
-	free(c->remote_name);
-	c->remote_name = xstrdup(buf);
-
-	if (compat20) {
-		packet_start(SSH2_MSG_CHANNEL_OPEN);
-		packet_put_cstring(rtype);
-		packet_put_int(c->self);
-		packet_put_int(c->local_window_max);
-		packet_put_int(c->local_maxpacket);
-		if (strcmp(rtype, "direct-tcpip") == 0) {
-			/* target host, port */
-			packet_put_cstring(c->path);
-			packet_put_int(c->host_port);
-		} else if (strcmp(rtype, "direct-streamlocal@openssh.com") == 0) {
-			/* target path */
-			packet_put_cstring(c->path);
-		} else if (strcmp(rtype, "forwarded-streamlocal@openssh.com") == 0) {
-			/* listen path */
-			packet_put_cstring(c->path);
-		} else {
-			/* listen address, port */
-			packet_put_cstring(c->path);
-			packet_put_int(local_port);
+	open_preamble(ssh, __func__, c, rtype);
+	if (strcmp(rtype, "direct-tcpip") == 0) {
+		/* target host, port */
+		if ((r = sshpkt_put_cstring(ssh, c->path)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, c->host_port)) != 0) {
+			fatal("%s: channel %i: reply %s", __func__,
+			    c->self, ssh_err(r));
 		}
-		if (strcmp(rtype, "forwarded-streamlocal@openssh.com") == 0) {
-			/* reserved for future owner/mode info */
-			packet_put_cstring("");
-		} else {
-			/* originator host and port */
-			packet_put_cstring(remote_ipaddr);
-			packet_put_int((u_int)remote_port);
+	} else if (strcmp(rtype, "direct-streamlocal@openssh.com") == 0) {
+		/* target path */
+		if ((r = sshpkt_put_cstring(ssh, c->path)) != 0) {
+			fatal("%s: channel %i: reply %s", __func__,
+			    c->self, ssh_err(r));
 		}
-		packet_send();
+	} else if (strcmp(rtype, "forwarded-streamlocal@openssh.com") == 0) {
+		/* listen path */
+		if ((r = sshpkt_put_cstring(ssh, c->path)) != 0) {
+			fatal("%s: channel %i: reply %s", __func__,
+			    c->self, ssh_err(r));
+		}
 	} else {
-		packet_start(SSH_MSG_PORT_OPEN);
-		packet_put_int(c->self);
-		packet_put_cstring(c->path);
-		packet_put_int(c->host_port);
-		if (packet_get_protocol_flags() &
-		    SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
-			packet_put_cstring(c->remote_name);
-		packet_send();
+		/* listen address, port */
+		if ((r = sshpkt_put_cstring(ssh, c->path)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, local_port)) != 0) {
+			fatal("%s: channel %i: reply %s", __func__,
+			    c->self, ssh_err(r));
+		}
 	}
+	if (strcmp(rtype, "forwarded-streamlocal@openssh.com") == 0) {
+		/* reserved for future owner/mode info */
+		if ((r = sshpkt_put_cstring(ssh, "")) != 0) {
+			fatal("%s: channel %i: reply %s", __func__,
+			    c->self, ssh_err(r));
+		}
+	} else {
+		/* originator host and port */
+		if ((r = sshpkt_put_cstring(ssh, remote_ipaddr)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, (u_int)remote_port)) != 0) {
+			fatal("%s: channel %i: reply %s", __func__,
+			    c->self, ssh_err(r));
+		}
+	}
+	if ((r = sshpkt_send(ssh)) != 0)
+		fatal("%s: channel %i: send %s", __func__, c->self, ssh_err(r));
 	free(remote_ipaddr);
 	free(local_ipaddr);
 }
 
-static void
-channel_set_reuseaddr(int fd)
-{
-	int on = 1;
-
-	/*
-	 * Set socket options.
-	 * Allow local port reuse in TIME_WAIT.
-	 */
-	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
-		error("setsockopt SO_REUSEADDR fd %d: %s", fd, strerror(errno));
-}
-
 void
-channel_set_x11_refuse_time(u_int refuse_time)
+channel_set_x11_refuse_time(struct ssh *ssh, u_int refuse_time)
 {
-	x11_refuse_time = refuse_time;
+	ssh->chanctxt->x11_refuse_time = refuse_time;
 }
 
 /*
  * This socket is listening for connections to a forwarded TCP/IP port.
  */
-/* ARGSUSED */
 static void
-channel_post_port_listener(Channel *c, fd_set *readset, fd_set *writeset)
+channel_post_port_listener(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	Channel *nc;
 	struct sockaddr_storage addr;
@@ -1576,360 +1740,404 @@
 	socklen_t addrlen;
 	char *rtype;
 
-	if (FD_ISSET(c->sock, readset)) {
-		debug("Connection to port %d forwarding "
-		    "to %.100s port %d requested.",
-		    c->listening_port, c->path, c->host_port);
+	if (!FD_ISSET(c->sock, readset))
+		return;
 
-		if (c->type == SSH_CHANNEL_RPORT_LISTENER) {
-			nextstate = SSH_CHANNEL_OPENING;
-			rtype = "forwarded-tcpip";
-		} else if (c->type == SSH_CHANNEL_RUNIX_LISTENER) {
-			nextstate = SSH_CHANNEL_OPENING;
-			rtype = "forwarded-streamlocal@openssh.com";
-		} else if (c->host_port == PORT_STREAMLOCAL) {
-			nextstate = SSH_CHANNEL_OPENING;
-			rtype = "direct-streamlocal@openssh.com";
-		} else if (c->host_port == 0) {
-			nextstate = SSH_CHANNEL_DYNAMIC;
-			rtype = "dynamic-tcpip";
-		} else {
-			nextstate = SSH_CHANNEL_OPENING;
-			rtype = "direct-tcpip";
-		}
+	debug("Connection to port %d forwarding to %.100s port %d requested.",
+	    c->listening_port, c->path, c->host_port);
 
-		addrlen = sizeof(addr);
-		newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
-		if (newsock < 0) {
-			if (errno != EINTR && errno != EWOULDBLOCK &&
-			    errno != ECONNABORTED)
-				error("accept: %.100s", strerror(errno));
-			if (errno == EMFILE || errno == ENFILE)
-				c->notbefore = monotime() + 1;
-			return;
-		}
-		if (c->host_port != PORT_STREAMLOCAL)
-			set_nodelay(newsock);
-		nc = channel_new(rtype, nextstate, newsock, newsock, -1,
-		    c->local_window_max, c->local_maxpacket, 0, rtype, 1);
-		nc->listening_port = c->listening_port;
-		nc->host_port = c->host_port;
-		if (c->path != NULL)
-			nc->path = xstrdup(c->path);
-
-		if (nextstate != SSH_CHANNEL_DYNAMIC)
-			port_open_helper(nc, rtype);
+	if (c->type == SSH_CHANNEL_RPORT_LISTENER) {
+		nextstate = SSH_CHANNEL_OPENING;
+		rtype = "forwarded-tcpip";
+	} else if (c->type == SSH_CHANNEL_RUNIX_LISTENER) {
+		nextstate = SSH_CHANNEL_OPENING;
+		rtype = "forwarded-streamlocal@openssh.com";
+	} else if (c->host_port == PORT_STREAMLOCAL) {
+		nextstate = SSH_CHANNEL_OPENING;
+		rtype = "direct-streamlocal@openssh.com";
+	} else if (c->host_port == 0) {
+		nextstate = SSH_CHANNEL_DYNAMIC;
+		rtype = "dynamic-tcpip";
+	} else {
+		nextstate = SSH_CHANNEL_OPENING;
+		rtype = "direct-tcpip";
 	}
+
+	addrlen = sizeof(addr);
+	newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
+	if (newsock < 0) {
+		if (errno != EINTR && errno != EWOULDBLOCK &&
+		    errno != ECONNABORTED)
+			error("accept: %.100s", strerror(errno));
+		if (errno == EMFILE || errno == ENFILE)
+			c->notbefore = monotime() + 1;
+		return;
+	}
+	if (c->host_port != PORT_STREAMLOCAL)
+		set_nodelay(newsock);
+	nc = channel_new(ssh, rtype, nextstate, newsock, newsock, -1,
+	    c->local_window_max, c->local_maxpacket, 0, rtype, 1);
+	nc->listening_port = c->listening_port;
+	nc->host_port = c->host_port;
+	if (c->path != NULL)
+		nc->path = xstrdup(c->path);
+
+	if (nextstate != SSH_CHANNEL_DYNAMIC)
+		port_open_helper(ssh, nc, rtype);
 }
 
 /*
  * This is the authentication agent socket listening for connections from
  * clients.
  */
-/* ARGSUSED */
 static void
-channel_post_auth_listener(Channel *c, fd_set *readset, fd_set *writeset)
+channel_post_auth_listener(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	Channel *nc;
-	int newsock;
+	int r, newsock;
 	struct sockaddr_storage addr;
 	socklen_t addrlen;
 
-	if (FD_ISSET(c->sock, readset)) {
-		addrlen = sizeof(addr);
-		newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
-		if (newsock < 0) {
-			error("accept from auth socket: %.100s",
-			    strerror(errno));
-			if (errno == EMFILE || errno == ENFILE)
-				c->notbefore = monotime() + 1;
-			return;
-		}
-		nc = channel_new("accepted auth socket",
-		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
-		    c->local_window_max, c->local_maxpacket,
-		    0, "accepted auth socket", 1);
-		if (compat20) {
-			packet_start(SSH2_MSG_CHANNEL_OPEN);
-			packet_put_cstring("auth-agent@openssh.com");
-			packet_put_int(nc->self);
-			packet_put_int(c->local_window_max);
-			packet_put_int(c->local_maxpacket);
-		} else {
-			packet_start(SSH_SMSG_AGENT_OPEN);
-			packet_put_int(nc->self);
-		}
-		packet_send();
+	if (!FD_ISSET(c->sock, readset))
+		return;
+
+	addrlen = sizeof(addr);
+	newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
+	if (newsock < 0) {
+		error("accept from auth socket: %.100s", strerror(errno));
+		if (errno == EMFILE || errno == ENFILE)
+			c->notbefore = monotime() + 1;
+		return;
 	}
+	nc = channel_new(ssh, "accepted auth socket",
+	    SSH_CHANNEL_OPENING, newsock, newsock, -1,
+	    c->local_window_max, c->local_maxpacket,
+	    0, "accepted auth socket", 1);
+	open_preamble(ssh, __func__, nc, "auth-agent@openssh.com");
+	if ((r = sshpkt_send(ssh)) != 0)
+		fatal("%s: channel %i: %s", __func__, c->self, ssh_err(r));
 }
 
-/* ARGSUSED */
 static void
-channel_post_connecting(Channel *c, fd_set *readset, fd_set *writeset)
+channel_post_connecting(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
-	int err = 0, sock;
+	int err = 0, sock, isopen, r;
 	socklen_t sz = sizeof(err);
 
-	if (FD_ISSET(c->sock, writeset)) {
-		if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, &err, &sz) < 0) {
-			err = errno;
-			error("getsockopt SO_ERROR failed");
-		}
-		if (err == 0) {
-			debug("channel %d: connected to %s port %d",
-			    c->self, c->connect_ctx.host, c->connect_ctx.port);
-			channel_connect_ctx_free(&c->connect_ctx);
-			c->type = SSH_CHANNEL_OPEN;
-			if (compat20) {
-				packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
-				packet_put_int(c->remote_id);
-				packet_put_int(c->self);
-				packet_put_int(c->local_window);
-				packet_put_int(c->local_maxpacket);
-			} else {
-				packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
-				packet_put_int(c->remote_id);
-				packet_put_int(c->self);
-			}
+	if (!FD_ISSET(c->sock, writeset))
+		return;
+	if (!c->have_remote_id)
+		fatal(":%s: channel %d: no remote id", __func__, c->self);
+	/* for rdynamic the OPEN_CONFIRMATION has been sent already */
+	isopen = (c->type == SSH_CHANNEL_RDYNAMIC_FINISH);
+	if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, &err, &sz) < 0) {
+		err = errno;
+		error("getsockopt SO_ERROR failed");
+	}
+	if (err == 0) {
+		debug("channel %d: connected to %s port %d",
+		    c->self, c->connect_ctx.host, c->connect_ctx.port);
+		channel_connect_ctx_free(&c->connect_ctx);
+		c->type = SSH_CHANNEL_OPEN;
+		if (isopen) {
+			/* no message necessary */
 		} else {
-			debug("channel %d: connection failed: %s",
-			    c->self, strerror(err));
-			/* Try next address, if any */
-			if ((sock = connect_next(&c->connect_ctx)) > 0) {
-				close(c->sock);
-				c->sock = c->rfd = c->wfd = sock;
-				channel_max_fd = channel_find_maxfd();
-				return;
-			}
-			/* Exhausted all addresses */
-			error("connect_to %.100s port %d: failed.",
-			    c->connect_ctx.host, c->connect_ctx.port);
-			channel_connect_ctx_free(&c->connect_ctx);
-			if (compat20) {
-				packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
-				packet_put_int(c->remote_id);
-				packet_put_int(SSH2_OPEN_CONNECT_FAILED);
-				if (!(datafellows & SSH_BUG_OPENFAILURE)) {
-					packet_put_cstring(strerror(err));
-					packet_put_cstring("");
-				}
-			} else {
-				packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
-				packet_put_int(c->remote_id);
-			}
-			chan_mark_dead(c);
+			if ((r = sshpkt_start(ssh,
+			    SSH2_MSG_CHANNEL_OPEN_CONFIRMATION)) != 0 ||
+			    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+			    (r = sshpkt_put_u32(ssh, c->self)) != 0 ||
+			    (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
+			    (r = sshpkt_put_u32(ssh, c->local_maxpacket))
+			    != 0)
+				fatal("%s: channel %i: confirm: %s", __func__,
+				    c->self, ssh_err(r));
+			if ((r = sshpkt_send(ssh)) != 0)
+				fatal("%s: channel %i: %s", __func__, c->self,
+				    ssh_err(r));
 		}
-		packet_send();
+	} else {
+		debug("channel %d: connection failed: %s",
+		    c->self, strerror(err));
+		/* Try next address, if any */
+		if ((sock = connect_next(&c->connect_ctx)) > 0) {
+			close(c->sock);
+			c->sock = c->rfd = c->wfd = sock;
+			channel_find_maxfd(ssh->chanctxt);
+			return;
+		}
+		/* Exhausted all addresses */
+		error("connect_to %.100s port %d: failed.",
+		    c->connect_ctx.host, c->connect_ctx.port);
+		channel_connect_ctx_free(&c->connect_ctx);
+		if (isopen) {
+			rdynamic_close(ssh, c);
+		} else {
+			if ((r = sshpkt_start(ssh,
+			    SSH2_MSG_CHANNEL_OPEN_FAILURE)) != 0 ||
+			    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+			    (r = sshpkt_put_u32(ssh,
+			    SSH2_OPEN_CONNECT_FAILED)) != 0 ||
+			    (r = sshpkt_put_cstring(ssh, strerror(err))) != 0 ||
+			    (r = sshpkt_put_cstring(ssh, "")) != 0) {
+				fatal("%s: channel %i: failure: %s", __func__,
+				    c->self, ssh_err(r));
+			}
+			if ((r = sshpkt_send(ssh)) != 0)
+				fatal("%s: channel %i: %s", __func__, c->self,
+				    ssh_err(r));
+			chan_mark_dead(ssh, c);
+		}
 	}
 }
 
-/* ARGSUSED */
 static int
-channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset)
+channel_handle_rfd(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	char buf[CHAN_RBUF];
-	int len, force;
+	ssize_t len;
+	int r, force;
 
 	force = c->isatty && c->detach_close && c->istate != CHAN_INPUT_CLOSED;
-	if (c->rfd != -1 && (force || FD_ISSET(c->rfd, readset))) {
-		errno = 0;
-		len = read(c->rfd, buf, sizeof(buf));
-		if (len < 0 && (errno == EINTR ||
-		    ((errno == EAGAIN || errno == EWOULDBLOCK) && !force)))
-			return 1;
+
+	if (c->rfd == -1 || (!force && !FD_ISSET(c->rfd, readset)))
+		return 1;
+
+	errno = 0;
+	len = read(c->rfd, buf, sizeof(buf));
+	if (len < 0 && (errno == EINTR ||
+	    ((errno == EAGAIN || errno == EWOULDBLOCK) && !force)))
+		return 1;
 #ifndef PTY_ZEROREAD
-		if (len <= 0) {
+ 	if (len <= 0) {
 #else
-		if ((!c->isatty && len <= 0) ||
-		    (c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
+	if ((!c->isatty && len <= 0) ||
+	    (c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
 #endif
-			debug2("channel %d: read<=0 rfd %d len %d",
-			    c->self, c->rfd, len);
-			if (c->type != SSH_CHANNEL_OPEN) {
-				debug2("channel %d: not open", c->self);
-				chan_mark_dead(c);
-				return -1;
-			} else if (compat13) {
-				buffer_clear(&c->output);
-				c->type = SSH_CHANNEL_INPUT_DRAINING;
-				debug2("channel %d: input draining.", c->self);
-			} else {
-				chan_read_failed(c);
-			}
+		debug2("channel %d: read<=0 rfd %d len %zd",
+		    c->self, c->rfd, len);
+		if (c->type != SSH_CHANNEL_OPEN) {
+			debug2("channel %d: not open", c->self);
+			chan_mark_dead(ssh, c);
 			return -1;
-		}
-		if (c->input_filter != NULL) {
-			if (c->input_filter(c, buf, len) == -1) {
-				debug2("channel %d: filter stops", c->self);
-				chan_read_failed(c);
-			}
-		} else if (c->datagram) {
-			buffer_put_string(&c->input, buf, len);
 		} else {
-			buffer_append(&c->input, buf, len);
+			chan_read_failed(ssh, c);
 		}
+		return -1;
+	}
+	if (c->input_filter != NULL) {
+		if (c->input_filter(ssh, c, buf, len) == -1) {
+			debug2("channel %d: filter stops", c->self);
+			chan_read_failed(ssh, c);
+		}
+	} else if (c->datagram) {
+		if ((r = sshbuf_put_string(c->input, buf, len)) != 0)
+			fatal("%s: channel %d: put datagram: %s", __func__,
+			    c->self, ssh_err(r));
+	} else if ((r = sshbuf_put(c->input, buf, len)) != 0) {
+		fatal("%s: channel %d: put data: %s", __func__,
+		    c->self, ssh_err(r));
 	}
 	return 1;
 }
 
-/* ARGSUSED */
 static int
-channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)
+channel_handle_wfd(struct ssh *ssh, Channel *c,
+   fd_set *readset, fd_set *writeset)
 {
 	struct termios tio;
-	u_char *data = NULL, *buf;
-	u_int dlen, olen = 0;
-	int len;
+	u_char *data = NULL, *buf; /* XXX const; need filter API change */
+	size_t dlen, olen = 0;
+	int r, len;
+
+	if (c->wfd == -1 || !FD_ISSET(c->wfd, writeset) ||
+	    sshbuf_len(c->output) == 0)
+		return 1;
 
 	/* Send buffered output data to the socket. */
-	if (c->wfd != -1 &&
-	    FD_ISSET(c->wfd, writeset) &&
-	    buffer_len(&c->output) > 0) {
-		olen = buffer_len(&c->output);
-		if (c->output_filter != NULL) {
-			if ((buf = c->output_filter(c, &data, &dlen)) == NULL) {
-				debug2("channel %d: filter stops", c->self);
-				if (c->type != SSH_CHANNEL_OPEN)
-					chan_mark_dead(c);
-				else
-					chan_write_failed(c);
-				return -1;
-			}
-		} else if (c->datagram) {
-			buf = data = buffer_get_string(&c->output, &dlen);
-		} else {
-			buf = data = buffer_ptr(&c->output);
-			dlen = buffer_len(&c->output);
-		}
-
-		if (c->datagram) {
-			/* ignore truncated writes, datagrams might get lost */
-			len = write(c->wfd, buf, dlen);
-			free(data);
-			if (len < 0 && (errno == EINTR || errno == EAGAIN ||
-			    errno == EWOULDBLOCK))
-				return 1;
-			if (len <= 0) {
-				if (c->type != SSH_CHANNEL_OPEN)
-					chan_mark_dead(c);
-				else
-					chan_write_failed(c);
-				return -1;
-			}
-			goto out;
-		}
-#ifdef _AIX
-		/* XXX: Later AIX versions can't push as much data to tty */
-		if (compat20 && c->wfd_isatty)
-			dlen = MIN(dlen, 8*1024);
-#endif
-
-		len = write(c->wfd, buf, dlen);
-		if (len < 0 &&
-		    (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
-			return 1;
-		if (len <= 0) {
-			if (c->type != SSH_CHANNEL_OPEN) {
-				debug2("channel %d: not open", c->self);
-				chan_mark_dead(c);
-				return -1;
-			} else if (compat13) {
-				buffer_clear(&c->output);
-				debug2("channel %d: input draining.", c->self);
-				c->type = SSH_CHANNEL_INPUT_DRAINING;
-			} else {
-				chan_write_failed(c);
-			}
+	olen = sshbuf_len(c->output);
+	if (c->output_filter != NULL) {
+		if ((buf = c->output_filter(ssh, c, &data, &dlen)) == NULL) {
+			debug2("channel %d: filter stops", c->self);
+			if (c->type != SSH_CHANNEL_OPEN)
+				chan_mark_dead(ssh, c);
+			else
+				chan_write_failed(ssh, c);
 			return -1;
 		}
-#ifndef BROKEN_TCGETATTR_ICANON
-		if (compat20 && c->isatty && dlen >= 1 && buf[0] != '\r') {
-			if (tcgetattr(c->wfd, &tio) == 0 &&
-			    !(tio.c_lflag & ECHO) && (tio.c_lflag & ICANON)) {
-				/*
-				 * Simulate echo to reduce the impact of
-				 * traffic analysis. We need to match the
-				 * size of a SSH2_MSG_CHANNEL_DATA message
-				 * (4 byte channel id + buf)
-				 */
-				packet_send_ignore(4 + len);
-				packet_send();
-			}
-		}
+	} else if (c->datagram) {
+		if ((r = sshbuf_get_string(c->output, &data, &dlen)) != 0)
+			fatal("%s: channel %d: get datagram: %s", __func__,
+			    c->self, ssh_err(r));
+		buf = data;
+	} else {
+		buf = data = sshbuf_mutable_ptr(c->output);
+		dlen = sshbuf_len(c->output);
+	}
+
+	if (c->datagram) {
+		/* ignore truncated writes, datagrams might get lost */
+		len = write(c->wfd, buf, dlen);
+		free(data);
+		if (len < 0 && (errno == EINTR || errno == EAGAIN ||
+		    errno == EWOULDBLOCK))
+			return 1;
+		if (len <= 0)
+			goto write_fail;
+		goto out;
+	}
+
+#ifdef _AIX
+	/* XXX: Later AIX versions can't push as much data to tty */
+	if (c->wfd_isatty)
+		dlen = MIN(dlen, 8*1024);
 #endif
-		buffer_consume(&c->output, len);
+
+	len = write(c->wfd, buf, dlen);
+	if (len < 0 &&
+	    (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
+		return 1;
+	if (len <= 0) {
+ write_fail:
+		if (c->type != SSH_CHANNEL_OPEN) {
+			debug2("channel %d: not open", c->self);
+			chan_mark_dead(ssh, c);
+			return -1;
+		} else {
+			chan_write_failed(ssh, c);
+		}
+		return -1;
+	}
+#ifndef BROKEN_TCGETATTR_ICANON
+	if (c->isatty && dlen >= 1 && buf[0] != '\r') {
+		if (tcgetattr(c->wfd, &tio) == 0 &&
+		    !(tio.c_lflag & ECHO) && (tio.c_lflag & ICANON)) {
+			/*
+			 * Simulate echo to reduce the impact of
+			 * traffic analysis. We need to match the
+			 * size of a SSH2_MSG_CHANNEL_DATA message
+			 * (4 byte channel id + buf)
+			 */
+			if ((r = sshpkt_msg_ignore(ssh, 4+len)) != 0 ||
+			    (r = sshpkt_send(ssh)) != 0)
+				fatal("%s: channel %d: ignore: %s",
+				    __func__, c->self, ssh_err(r));
+		}
+	}
+#endif /* BROKEN_TCGETATTR_ICANON */
+	if ((r = sshbuf_consume(c->output, len)) != 0) {
+		fatal("%s: channel %d: consume: %s",
+		    __func__, c->self, ssh_err(r));
 	}
  out:
-	if (compat20 && olen > 0)
-		c->local_consumed += olen - buffer_len(&c->output);
+	c->local_consumed += olen - sshbuf_len(c->output);
+
 	return 1;
 }
 
 static int
-channel_handle_efd(Channel *c, fd_set *readset, fd_set *writeset)
+channel_handle_efd_write(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
+{
+	int r;
+	ssize_t len;
+
+	if (!FD_ISSET(c->efd, writeset) || sshbuf_len(c->extended) == 0)
+		return 1;
+
+	len = write(c->efd, sshbuf_ptr(c->extended),
+	    sshbuf_len(c->extended));
+	debug2("channel %d: written %zd to efd %d", c->self, len, c->efd);
+	if (len < 0 && (errno == EINTR || errno == EAGAIN ||
+	    errno == EWOULDBLOCK))
+		return 1;
+	if (len <= 0) {
+		debug2("channel %d: closing write-efd %d", c->self, c->efd);
+		channel_close_fd(ssh, &c->efd);
+	} else {
+		if ((r = sshbuf_consume(c->extended, len)) != 0) {
+			fatal("%s: channel %d: consume: %s",
+			    __func__, c->self, ssh_err(r));
+		}
+		c->local_consumed += len;
+	}
+	return 1;
+}
+
+static int
+channel_handle_efd_read(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	char buf[CHAN_RBUF];
-	int len;
+	int r;
+	ssize_t len;
 
-/** XXX handle drain efd, too */
-	if (c->efd != -1) {
-		if (c->extended_usage == CHAN_EXTENDED_WRITE &&
-		    FD_ISSET(c->efd, writeset) &&
-		    buffer_len(&c->extended) > 0) {
-			len = write(c->efd, buffer_ptr(&c->extended),
-			    buffer_len(&c->extended));
-			debug2("channel %d: written %d to efd %d",
-			    c->self, len, c->efd);
-			if (len < 0 && (errno == EINTR || errno == EAGAIN ||
-			    errno == EWOULDBLOCK))
-				return 1;
-			if (len <= 0) {
-				debug2("channel %d: closing write-efd %d",
-				    c->self, c->efd);
-				channel_close_fd(&c->efd);
-			} else {
-				buffer_consume(&c->extended, len);
-				c->local_consumed += len;
-			}
-		} else if (c->efd != -1 &&
-		    (c->extended_usage == CHAN_EXTENDED_READ ||
-		    c->extended_usage == CHAN_EXTENDED_IGNORE) &&
-		    (c->detach_close || FD_ISSET(c->efd, readset))) {
-			len = read(c->efd, buf, sizeof(buf));
-			debug2("channel %d: read %d from efd %d",
-			    c->self, len, c->efd);
-			if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
-			    errno == EWOULDBLOCK) && !c->detach_close)))
-				return 1;
-			if (len <= 0) {
-				debug2("channel %d: closing read-efd %d",
-				    c->self, c->efd);
-				channel_close_fd(&c->efd);
-			} else {
-				if (c->extended_usage == CHAN_EXTENDED_IGNORE) {
-					debug3("channel %d: discard efd",
-					    c->self);
-				} else
-					buffer_append(&c->extended, buf, len);
-			}
+	if (!c->detach_close && !FD_ISSET(c->efd, readset))
+		return 1;
+
+	len = read(c->efd, buf, sizeof(buf));
+	debug2("channel %d: read %zd from efd %d", c->self, len, c->efd);
+	if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
+	    errno == EWOULDBLOCK) && !c->detach_close)))
+		return 1;
+	if (len <= 0) {
+		debug2("channel %d: closing read-efd %d",
+		    c->self, c->efd);
+		channel_close_fd(ssh, &c->efd);
+	} else {
+		if (c->extended_usage == CHAN_EXTENDED_IGNORE) {
+			debug3("channel %d: discard efd",
+			    c->self);
+		} else if ((r = sshbuf_put(c->extended, buf, len)) != 0) {
+			fatal("%s: channel %d: append: %s",
+			    __func__, c->self, ssh_err(r));
 		}
 	}
 	return 1;
 }
 
 static int
-channel_check_window(Channel *c)
+channel_handle_efd(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
+	if (c->efd == -1)
+		return 1;
+
+	/** XXX handle drain efd, too */
+
+	if (c->extended_usage == CHAN_EXTENDED_WRITE)
+		return channel_handle_efd_write(ssh, c, readset, writeset);
+	else if (c->extended_usage == CHAN_EXTENDED_READ ||
+	    c->extended_usage == CHAN_EXTENDED_IGNORE)
+		return channel_handle_efd_read(ssh, c, readset, writeset);
+
+	return 1;
+}
+
+static int
+channel_check_window(struct ssh *ssh, Channel *c)
+{
+	int r;
+
 	if (c->type == SSH_CHANNEL_OPEN &&
 	    !(c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD)) &&
 	    ((c->local_window_max - c->local_window >
 	    c->local_maxpacket*3) ||
 	    c->local_window < c->local_window_max/2) &&
 	    c->local_consumed > 0) {
-		packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
-		packet_put_int(c->remote_id);
-		packet_put_int(c->local_consumed);
-		packet_send();
+		if (!c->have_remote_id)
+			fatal(":%s: channel %d: no remote id",
+			    __func__, c->self);
+		if ((r = sshpkt_start(ssh,
+		    SSH2_MSG_CHANNEL_WINDOW_ADJUST)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, c->local_consumed)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0) {
+			fatal("%s: channel %i: %s", __func__,
+			    c->self, ssh_err(r));
+		}
 		debug2("channel %d: window %d sent adjust %d",
 		    c->self, c->local_window,
 		    c->local_consumed);
@@ -1940,90 +2148,112 @@
 }
 
 static void
-channel_post_open(Channel *c, fd_set *readset, fd_set *writeset)
+channel_post_open(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
-	channel_handle_rfd(c, readset, writeset);
-	channel_handle_wfd(c, readset, writeset);
-	if (!compat20)
-		return;
-	channel_handle_efd(c, readset, writeset);
-	channel_check_window(c);
+	channel_handle_rfd(ssh, c, readset, writeset);
+	channel_handle_wfd(ssh, c, readset, writeset);
+	channel_handle_efd(ssh, c, readset, writeset);
+	channel_check_window(ssh, c);
 }
 
 static u_int
-read_mux(Channel *c, u_int need)
+read_mux(struct ssh *ssh, Channel *c, u_int need)
 {
 	char buf[CHAN_RBUF];
-	int len;
+	ssize_t len;
 	u_int rlen;
+	int r;
 
-	if (buffer_len(&c->input) < need) {
-		rlen = need - buffer_len(&c->input);
+	if (sshbuf_len(c->input) < need) {
+		rlen = need - sshbuf_len(c->input);
 		len = read(c->rfd, buf, MINIMUM(rlen, CHAN_RBUF));
 		if (len < 0 && (errno == EINTR || errno == EAGAIN))
-			return buffer_len(&c->input);
+			return sshbuf_len(c->input);
 		if (len <= 0) {
-			debug2("channel %d: ctl read<=0 rfd %d len %d",
+			debug2("channel %d: ctl read<=0 rfd %d len %zd",
 			    c->self, c->rfd, len);
-			chan_read_failed(c);
+			chan_read_failed(ssh, c);
 			return 0;
-		} else
-			buffer_append(&c->input, buf, len);
+		} else if ((r = sshbuf_put(c->input, buf, len)) != 0) {
+			fatal("%s: channel %d: append: %s",
+			    __func__, c->self, ssh_err(r));
+		}
 	}
-	return buffer_len(&c->input);
+	return sshbuf_len(c->input);
 }
 
 static void
-channel_post_mux_client(Channel *c, fd_set *readset, fd_set *writeset)
+channel_post_mux_client_read(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	u_int need;
-	ssize_t len;
 
-	if (!compat20)
-		fatal("%s: entered with !compat20", __func__);
+	if (c->rfd == -1 || !FD_ISSET(c->rfd, readset))
+		return;
+	if (c->istate != CHAN_INPUT_OPEN && c->istate != CHAN_INPUT_WAIT_DRAIN)
+		return;
+	if (c->mux_pause)
+		return;
 
-	if (c->rfd != -1 && !c->mux_pause && FD_ISSET(c->rfd, readset) &&
-	    (c->istate == CHAN_INPUT_OPEN ||
-	    c->istate == CHAN_INPUT_WAIT_DRAIN)) {
-		/*
-		 * Don't not read past the precise end of packets to
-		 * avoid disrupting fd passing.
-		 */
-		if (read_mux(c, 4) < 4) /* read header */
-			return;
-		need = get_u32(buffer_ptr(&c->input));
+	/*
+	 * Don't not read past the precise end of packets to
+	 * avoid disrupting fd passing.
+	 */
+	if (read_mux(ssh, c, 4) < 4) /* read header */
+		return;
+	/* XXX sshbuf_peek_u32 */
+	need = PEEK_U32(sshbuf_ptr(c->input));
 #define CHANNEL_MUX_MAX_PACKET	(256 * 1024)
-		if (need > CHANNEL_MUX_MAX_PACKET) {
-			debug2("channel %d: packet too big %u > %u",
-			    c->self, CHANNEL_MUX_MAX_PACKET, need);
-			chan_rcvd_oclose(c);
-			return;
-		}
-		if (read_mux(c, need + 4) < need + 4) /* read body */
-			return;
-		if (c->mux_rcb(c) != 0) {
-			debug("channel %d: mux_rcb failed", c->self);
-			chan_mark_dead(c);
-			return;
-		}
+	if (need > CHANNEL_MUX_MAX_PACKET) {
+		debug2("channel %d: packet too big %u > %u",
+		    c->self, CHANNEL_MUX_MAX_PACKET, need);
+		chan_rcvd_oclose(ssh, c);
+		return;
 	}
-
-	if (c->wfd != -1 && FD_ISSET(c->wfd, writeset) &&
-	    buffer_len(&c->output) > 0) {
-		len = write(c->wfd, buffer_ptr(&c->output),
-		    buffer_len(&c->output));
-		if (len < 0 && (errno == EINTR || errno == EAGAIN))
-			return;
-		if (len <= 0) {
-			chan_mark_dead(c);
-			return;
-		}
-		buffer_consume(&c->output, len);
+	if (read_mux(ssh, c, need + 4) < need + 4) /* read body */
+		return;
+	if (c->mux_rcb(ssh, c) != 0) {
+		debug("channel %d: mux_rcb failed", c->self);
+		chan_mark_dead(ssh, c);
+		return;
 	}
 }
 
 static void
-channel_post_mux_listener(Channel *c, fd_set *readset, fd_set *writeset)
+channel_post_mux_client_write(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
+{
+	ssize_t len;
+	int r;
+
+	if (c->wfd == -1 || !FD_ISSET(c->wfd, writeset) ||
+	    sshbuf_len(c->output) == 0)
+		return;
+
+	len = write(c->wfd, sshbuf_ptr(c->output), sshbuf_len(c->output));
+	if (len < 0 && (errno == EINTR || errno == EAGAIN))
+		return;
+	if (len <= 0) {
+		chan_mark_dead(ssh, c);
+		return;
+	}
+	if ((r = sshbuf_consume(c->output, len)) != 0)
+		fatal("%s: channel %d: consume: %s", __func__,
+		    c->self, ssh_err(r));
+}
+
+static void
+channel_post_mux_client(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
+{
+	channel_post_mux_client_read(ssh, c, readset, writeset);
+	channel_post_mux_client_write(ssh, c, readset, writeset);
+}
+
+static void
+channel_post_mux_listener(struct ssh *ssh, Channel *c,
+    fd_set *readset, fd_set *writeset)
 {
 	Channel *nc;
 	struct sockaddr_storage addr;
@@ -2062,166 +2292,100 @@
 		close(newsock);
 		return;
 	}
-	nc = channel_new("multiplex client", SSH_CHANNEL_MUX_CLIENT,
+	nc = channel_new(ssh, "multiplex client", SSH_CHANNEL_MUX_CLIENT,
 	    newsock, newsock, -1, c->local_window_max,
 	    c->local_maxpacket, 0, "mux-control", 1);
 	nc->mux_rcb = c->mux_rcb;
-	debug3("%s: new mux channel %d fd %d", __func__,
-	    nc->self, nc->sock);
+	debug3("%s: new mux channel %d fd %d", __func__, nc->self, nc->sock);
 	/* establish state */
-	nc->mux_rcb(nc);
+	nc->mux_rcb(ssh, nc);
 	/* mux state transitions must not elicit protocol messages */
 	nc->flags |= CHAN_LOCAL;
 }
 
-/* ARGSUSED */
 static void
-channel_post_output_drain_13(Channel *c, fd_set *readset, fd_set *writeset)
+channel_handler_init(struct ssh_channels *sc)
 {
-	int len;
+	chan_fn **pre, **post;
 
-	/* Send buffered output data to the socket. */
-	if (FD_ISSET(c->sock, writeset) && buffer_len(&c->output) > 0) {
-		len = write(c->sock, buffer_ptr(&c->output),
-			    buffer_len(&c->output));
-		if (len <= 0)
-			buffer_clear(&c->output);
-		else
-			buffer_consume(&c->output, len);
-	}
-}
+	if ((pre = calloc(SSH_CHANNEL_MAX_TYPE, sizeof(*pre))) == NULL ||
+	   (post = calloc(SSH_CHANNEL_MAX_TYPE, sizeof(*post))) == NULL)
+		fatal("%s: allocation failed", __func__);
 
-static void
-channel_handler_init_20(void)
-{
-	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open;
-	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open;
-	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_RPORT_LISTENER] =	&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_UNIX_LISTENER] =	&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_RUNIX_LISTENER] =	&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
-	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
-	channel_pre[SSH_CHANNEL_MUX_LISTENER] =		&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_MUX_CLIENT] =		&channel_pre_mux_client;
+	pre[SSH_CHANNEL_OPEN] =			&channel_pre_open;
+	pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open;
+	pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
+	pre[SSH_CHANNEL_RPORT_LISTENER] =	&channel_pre_listener;
+	pre[SSH_CHANNEL_UNIX_LISTENER] =	&channel_pre_listener;
+	pre[SSH_CHANNEL_RUNIX_LISTENER] =	&channel_pre_listener;
+	pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
+	pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
+	pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
+	pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
+	pre[SSH_CHANNEL_RDYNAMIC_FINISH] =	&channel_pre_connecting;
+	pre[SSH_CHANNEL_MUX_LISTENER] =		&channel_pre_listener;
+	pre[SSH_CHANNEL_MUX_CLIENT] =		&channel_pre_mux_client;
 
-	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open;
-	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
-	channel_post[SSH_CHANNEL_RPORT_LISTENER] =	&channel_post_port_listener;
-	channel_post[SSH_CHANNEL_UNIX_LISTENER] =	&channel_post_port_listener;
-	channel_post[SSH_CHANNEL_RUNIX_LISTENER] =	&channel_post_port_listener;
-	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
-	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
-	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
-	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open;
-	channel_post[SSH_CHANNEL_MUX_LISTENER] =	&channel_post_mux_listener;
-	channel_post[SSH_CHANNEL_MUX_CLIENT] =		&channel_post_mux_client;
-}
+	post[SSH_CHANNEL_OPEN] =		&channel_post_open;
+	post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
+	post[SSH_CHANNEL_RPORT_LISTENER] =	&channel_post_port_listener;
+	post[SSH_CHANNEL_UNIX_LISTENER] =	&channel_post_port_listener;
+	post[SSH_CHANNEL_RUNIX_LISTENER] =	&channel_post_port_listener;
+	post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
+	post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
+	post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
+	post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open;
+	post[SSH_CHANNEL_RDYNAMIC_FINISH] =	&channel_post_connecting;
+	post[SSH_CHANNEL_MUX_LISTENER] =	&channel_post_mux_listener;
+	post[SSH_CHANNEL_MUX_CLIENT] =		&channel_post_mux_client;
 
-static void
-channel_handler_init_13(void)
-{
-	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open_13;
-	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open_13;
-	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_INPUT_DRAINING] =	&channel_pre_input_draining;
-	channel_pre[SSH_CHANNEL_OUTPUT_DRAINING] =	&channel_pre_output_draining;
-	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
-	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
-
-	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open;
-	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
-	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
-	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
-	channel_post[SSH_CHANNEL_OUTPUT_DRAINING] =	&channel_post_output_drain_13;
-	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
-	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open;
-}
-
-static void
-channel_handler_init_15(void)
-{
-	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open;
-	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open;
-	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
-	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
-	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
-
-	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
-	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
-	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
-	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open;
-	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
-	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open;
-}
-
-static void
-channel_handler_init(void)
-{
-	int i;
-
-	for (i = 0; i < SSH_CHANNEL_MAX_TYPE; i++) {
-		channel_pre[i] = NULL;
-		channel_post[i] = NULL;
-	}
-	if (compat20)
-		channel_handler_init_20();
-	else if (compat13)
-		channel_handler_init_13();
-	else
-		channel_handler_init_15();
+	sc->channel_pre = pre;
+	sc->channel_post = post;
 }
 
 /* gc dead channels */
 static void
-channel_garbage_collect(Channel *c)
+channel_garbage_collect(struct ssh *ssh, Channel *c)
 {
 	if (c == NULL)
 		return;
 	if (c->detach_user != NULL) {
-		if (!chan_is_dead(c, c->detach_close))
+		if (!chan_is_dead(ssh, c, c->detach_close))
 			return;
 		debug2("channel %d: gc: notify user", c->self);
-		c->detach_user(c->self, NULL);
+		c->detach_user(ssh, c->self, NULL);
 		/* if we still have a callback */
 		if (c->detach_user != NULL)
 			return;
 		debug2("channel %d: gc: user detached", c->self);
 	}
-	if (!chan_is_dead(c, 1))
+	if (!chan_is_dead(ssh, c, 1))
 		return;
 	debug2("channel %d: garbage collecting", c->self);
-	channel_free(c);
+	channel_free(ssh, c);
 }
 
+enum channel_table { CHAN_PRE, CHAN_POST };
+
 static void
-channel_handler(chan_fn *ftab[], fd_set *readset, fd_set *writeset,
-    time_t *unpause_secs)
+channel_handler(struct ssh *ssh, int table,
+    fd_set *readset, fd_set *writeset, time_t *unpause_secs)
 {
-	static int did_init = 0;
+	struct ssh_channels *sc = ssh->chanctxt;
+	chan_fn **ftab = table == CHAN_PRE ? sc->channel_pre : sc->channel_post;
 	u_int i, oalloc;
 	Channel *c;
 	time_t now;
 
-	if (!did_init) {
-		channel_handler_init();
-		did_init = 1;
-	}
 	now = monotime();
 	if (unpause_secs != NULL)
 		*unpause_secs = 0;
-	for (i = 0, oalloc = channels_alloc; i < oalloc; i++) {
-		c = channels[i];
+	for (i = 0, oalloc = sc->channels_alloc; i < oalloc; i++) {
+		c = sc->channels[i];
 		if (c == NULL)
 			continue;
 		if (c->delayed) {
-			if (ftab == channel_pre)
+			if (table == CHAN_PRE)
 				c->delayed = 0;
 			else
 				continue;
@@ -2231,7 +2395,7 @@
 			 * Run handlers that are not paused.
 			 */
 			if (c->notbefore <= now)
-				(*ftab[c->type])(c, readset, writeset);
+				(*ftab[c->type])(ssh, c, readset, writeset);
 			else if (unpause_secs != NULL) {
 				/*
 				 * Collect the time that the earliest
@@ -2245,7 +2409,7 @@
 					*unpause_secs = c->notbefore - now;
 			}
 		}
-		channel_garbage_collect(c);
+		channel_garbage_collect(ssh, c);
 	}
 	if (unpause_secs != NULL && *unpause_secs != 0)
 		debug3("%s: first channel unpauses in %d seconds",
@@ -2253,16 +2417,39 @@
 }
 
 /*
+ * Create sockets before allocating the select bitmasks.
+ * This is necessary for things that need to happen after reading
+ * the network-input but before channel_prepare_select().
+ */
+static void
+channel_before_prepare_select(struct ssh *ssh)
+{
+	struct ssh_channels *sc = ssh->chanctxt;
+	Channel *c;
+	u_int i, oalloc;
+
+	for (i = 0, oalloc = sc->channels_alloc; i < oalloc; i++) {
+		c = sc->channels[i];
+		if (c == NULL)
+			continue;
+		if (c->type == SSH_CHANNEL_RDYNAMIC_OPEN)
+			channel_before_prepare_select_rdynamic(ssh, c);
+	}
+}
+
+/*
  * Allocate/update select bitmasks and add any bits relevant to channels in
  * select bitmasks.
  */
 void
-channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
-    u_int *nallocp, time_t *minwait_secs, int rekeying)
+channel_prepare_select(struct ssh *ssh, fd_set **readsetp, fd_set **writesetp,
+    int *maxfdp, u_int *nallocp, time_t *minwait_secs)
 {
 	u_int n, sz, nfdset;
 
-	n = MAXIMUM(*maxfdp, channel_max_fd);
+	channel_before_prepare_select(ssh); /* might update channel_max_fd */
+
+	n = MAXIMUM(*maxfdp, ssh->chanctxt->channel_max_fd);
 
 	nfdset = howmany(n+1, NFDBITS);
 	/* Explicitly test here, because xrealloc isn't always called */
@@ -2280,8 +2467,8 @@
 	memset(*readsetp, 0, sz);
 	memset(*writesetp, 0, sz);
 
-	if (!rekeying)
-		channel_handler(channel_pre, *readsetp, *writesetp,
+	if (!ssh_packet_is_rekeying(ssh))
+		channel_handler(ssh, CHAN_PRE, *readsetp, *writesetp,
 		    minwait_secs);
 }
 
@@ -2290,21 +2477,136 @@
  * events pending.
  */
 void
-channel_after_select(fd_set *readset, fd_set *writeset)
+channel_after_select(struct ssh *ssh, fd_set *readset, fd_set *writeset)
 {
-	channel_handler(channel_post, readset, writeset, NULL);
+	channel_handler(ssh, CHAN_POST, readset, writeset, NULL);
 }
 
+/*
+ * Enqueue data for channels with open or draining c->input.
+ */
+static void
+channel_output_poll_input_open(struct ssh *ssh, Channel *c)
+{
+	size_t len, plen;
+	const u_char *pkt;
+	int r;
+
+	if ((len = sshbuf_len(c->input)) == 0) {
+		if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
+			/*
+			 * input-buffer is empty and read-socket shutdown:
+			 * tell peer, that we will not send more data:
+			 * send IEOF.
+			 * hack for extended data: delay EOF if EFD still
+			 * in use.
+			 */
+			if (CHANNEL_EFD_INPUT_ACTIVE(c))
+				debug2("channel %d: "
+				    "ibuf_empty delayed efd %d/(%zu)",
+				    c->self, c->efd, sshbuf_len(c->extended));
+			else
+				chan_ibuf_empty(ssh, c);
+		}
+		return;
+	}
+
+	if (!c->have_remote_id)
+		fatal(":%s: channel %d: no remote id", __func__, c->self);
+
+	if (c->datagram) {
+		/* Check datagram will fit; drop if not */
+		if ((r = sshbuf_get_string_direct(c->input, &pkt, &plen)) != 0)
+			fatal("%s: channel %d: get datagram: %s", __func__,
+			    c->self, ssh_err(r));
+		/*
+		 * XXX this does tail-drop on the datagram queue which is
+		 * usually suboptimal compared to head-drop. Better to have
+		 * backpressure at read time? (i.e. read + discard)
+		 */
+		if (plen > c->remote_window || plen > c->remote_maxpacket) {
+			debug("channel %d: datagram too big", c->self);
+			return;
+		}
+		/* Enqueue it */
+		if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_DATA)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+		    (r = sshpkt_put_string(ssh, pkt, plen)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0) {
+			fatal("%s: channel %i: datagram: %s", __func__,
+			    c->self, ssh_err(r));
+		}
+		c->remote_window -= plen;
+		return;
+	}
+
+	/* Enqueue packet for buffered data. */
+	if (len > c->remote_window)
+		len = c->remote_window;
+	if (len > c->remote_maxpacket)
+		len = c->remote_maxpacket;
+	if (len == 0)
+		return;
+	if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_DATA)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+	    (r = sshpkt_put_string(ssh, sshbuf_ptr(c->input), len)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0) {
+		fatal("%s: channel %i: data: %s", __func__,
+		    c->self, ssh_err(r));
+	}
+	if ((r = sshbuf_consume(c->input, len)) != 0)
+		fatal("%s: channel %i: consume: %s", __func__,
+		    c->self, ssh_err(r));
+	c->remote_window -= len;
+}
+
+/*
+ * Enqueue data for channels with open c->extended in read mode.
+ */
+static void
+channel_output_poll_extended_read(struct ssh *ssh, Channel *c)
+{
+	size_t len;
+	int r;
+
+	if ((len = sshbuf_len(c->extended)) == 0)
+		return;
+
+	debug2("channel %d: rwin %u elen %zu euse %d", c->self,
+	    c->remote_window, sshbuf_len(c->extended), c->extended_usage);
+	if (len > c->remote_window)
+		len = c->remote_window;
+	if (len > c->remote_maxpacket)
+		len = c->remote_maxpacket;
+	if (len == 0)
+		return;
+	if (!c->have_remote_id)
+		fatal(":%s: channel %d: no remote id", __func__, c->self);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_EXTENDED_DATA)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, SSH2_EXTENDED_DATA_STDERR)) != 0 ||
+	    (r = sshpkt_put_string(ssh, sshbuf_ptr(c->extended), len)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0) {
+		fatal("%s: channel %i: data: %s", __func__,
+		    c->self, ssh_err(r));
+	}
+	if ((r = sshbuf_consume(c->extended, len)) != 0)
+		fatal("%s: channel %i: consume: %s", __func__,
+		    c->self, ssh_err(r));
+	c->remote_window -= len;
+	debug2("channel %d: sent ext data %zu", c->self, len);
+}
 
 /* If there is data to send to the connection, enqueue some of it now. */
 void
-channel_output_poll(void)
+channel_output_poll(struct ssh *ssh)
 {
+	struct ssh_channels *sc = ssh->chanctxt;
 	Channel *c;
-	u_int i, len;
+	u_int i;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
+	for (i = 0; i < sc->channels_alloc; i++) {
+		c = sc->channels[i];
 		if (c == NULL)
 			continue;
 
@@ -2312,113 +2614,23 @@
 		 * We are only interested in channels that can have buffered
 		 * incoming data.
 		 */
-		if (compat13) {
-			if (c->type != SSH_CHANNEL_OPEN &&
-			    c->type != SSH_CHANNEL_INPUT_DRAINING)
-				continue;
-		} else {
-			if (c->type != SSH_CHANNEL_OPEN)
-				continue;
-		}
-		if (compat20 &&
-		    (c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD))) {
+		if (c->type != SSH_CHANNEL_OPEN)
+			continue;
+		if ((c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD))) {
 			/* XXX is this true? */
-			debug3("channel %d: will not send data after close", c->self);
+			debug3("channel %d: will not send data after close",
+			    c->self);
 			continue;
 		}
 
 		/* Get the amount of buffered data for this channel. */
-		if ((c->istate == CHAN_INPUT_OPEN ||
-		    c->istate == CHAN_INPUT_WAIT_DRAIN) &&
-		    (len = buffer_len(&c->input)) > 0) {
-			if (c->datagram) {
-				if (len > 0) {
-					u_char *data;
-					u_int dlen;
-
-					data = buffer_get_string(&c->input,
-					    &dlen);
-					if (dlen > c->remote_window ||
-					    dlen > c->remote_maxpacket) {
-						debug("channel %d: datagram "
-						    "too big for channel",
-						    c->self);
-						free(data);
-						continue;
-					}
-					packet_start(SSH2_MSG_CHANNEL_DATA);
-					packet_put_int(c->remote_id);
-					packet_put_string(data, dlen);
-					packet_send();
-					c->remote_window -= dlen;
-					free(data);
-				}
-				continue;
-			}
-			/*
-			 * Send some data for the other side over the secure
-			 * connection.
-			 */
-			if (compat20) {
-				if (len > c->remote_window)
-					len = c->remote_window;
-				if (len > c->remote_maxpacket)
-					len = c->remote_maxpacket;
-			} else {
-				if (packet_is_interactive()) {
-					if (len > 1024)
-						len = 512;
-				} else {
-					/* Keep the packets at reasonable size. */
-					if (len > packet_get_maxsize()/2)
-						len = packet_get_maxsize()/2;
-				}
-			}
-			if (len > 0) {
-				packet_start(compat20 ?
-				    SSH2_MSG_CHANNEL_DATA : SSH_MSG_CHANNEL_DATA);
-				packet_put_int(c->remote_id);
-				packet_put_string(buffer_ptr(&c->input), len);
-				packet_send();
-				buffer_consume(&c->input, len);
-				c->remote_window -= len;
-			}
-		} else if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
-			if (compat13)
-				fatal("cannot happen: istate == INPUT_WAIT_DRAIN for proto 1.3");
-			/*
-			 * input-buffer is empty and read-socket shutdown:
-			 * tell peer, that we will not send more data: send IEOF.
-			 * hack for extended data: delay EOF if EFD still in use.
-			 */
-			if (CHANNEL_EFD_INPUT_ACTIVE(c))
-				debug2("channel %d: ibuf_empty delayed efd %d/(%d)",
-				    c->self, c->efd, buffer_len(&c->extended));
-			else
-				chan_ibuf_empty(c);
-		}
+		if (c->istate == CHAN_INPUT_OPEN ||
+		    c->istate == CHAN_INPUT_WAIT_DRAIN)
+			channel_output_poll_input_open(ssh, c);
 		/* Send extended data, i.e. stderr */
-		if (compat20 &&
-		    !(c->flags & CHAN_EOF_SENT) &&
-		    c->remote_window > 0 &&
-		    (len = buffer_len(&c->extended)) > 0 &&
-		    c->extended_usage == CHAN_EXTENDED_READ) {
-			debug2("channel %d: rwin %u elen %u euse %d",
-			    c->self, c->remote_window, buffer_len(&c->extended),
-			    c->extended_usage);
-			if (len > c->remote_window)
-				len = c->remote_window;
-			if (len > c->remote_maxpacket)
-				len = c->remote_maxpacket;
-			packet_start(SSH2_MSG_CHANNEL_EXTENDED_DATA);
-			packet_put_int(c->remote_id);
-			packet_put_int(SSH2_EXTENDED_DATA_STDERR);
-			packet_put_string(buffer_ptr(&c->extended), len);
-			packet_send();
-			buffer_consume(&c->extended, len);
-			c->remote_window -= len;
-			debug2("channel %d: sent ext data %d", c->self, len);
-		}
+		if (!(c->flags & CHAN_EOF_SENT) &&
+		    c->extended_usage == CHAN_EXTENDED_READ)
+			channel_output_poll_extended_read(ssh, c);
 	}
 }
 
@@ -2440,7 +2652,7 @@
  *      SSH_CHANNEL_MUX_PROXY channel and replace the mux clients ID
  *      with the newly allocated channel ID.
  * 2) Upstream messages are received by matching SSH_CHANNEL_MUX_PROXY
- *    channels and procesed by channel_proxy_upstream(). The local channel ID
+ *    channels and processed by channel_proxy_upstream(). The local channel ID
  *    is then translated back to the original mux client ID.
  * 3) In both cases we need to keep track of matching SSH2_MSG_CHANNEL_CLOSE
  *    messages so we can clean up SSH_CHANNEL_MUX_PROXY channels.
@@ -2451,7 +2663,7 @@
  *    channel. E.g. client_request_forwarded_tcpip() needs to figure
  *    out whether the request is addressed to the local client or a
  *    specific downstream client based on the listen-address/port.
- * 6) Agent and X11-Forwarding have a similar problem and are currenly
+ * 6) Agent and X11-Forwarding have a similar problem and are currently
  *    not supported as the matching session/channel cannot be identified
  *    easily.
  */
@@ -2463,20 +2675,19 @@
  * on channel creation.
  */
 int
-channel_proxy_downstream(Channel *downstream)
+channel_proxy_downstream(struct ssh *ssh, Channel *downstream)
 {
 	Channel *c = NULL;
-	struct ssh *ssh = active_state;
 	struct sshbuf *original = NULL, *modified = NULL;
 	const u_char *cp;
 	char *ctype = NULL, *listen_host = NULL;
 	u_char type;
 	size_t have;
-	int ret = -1, r, idx;
+	int ret = -1, r;
 	u_int id, remote_id, listen_port;
 
-	/* sshbuf_dump(&downstream->input, stderr); */
-	if ((r = sshbuf_get_string_direct(&downstream->input, &cp, &have))
+	/* sshbuf_dump(downstream->input, stderr); */
+	if ((r = sshbuf_get_string_direct(downstream->input, &cp, &have))
 	    != 0) {
 		error("%s: malformed message: %s", __func__, ssh_err(r));
 		return -1;
@@ -2505,7 +2716,7 @@
 			error("%s: parse error %s", __func__, ssh_err(r));
 			goto out;
 		}
-		c = channel_new("mux proxy", SSH_CHANNEL_MUX_PROXY,
+		c = channel_new(ssh, "mux proxy", SSH_CHANNEL_MUX_PROXY,
 		   -1, -1, -1, 0, 0, 0, ctype, 1);
 		c->mux_ctx = downstream;	/* point to mux client */
 		c->mux_downstream_id = id;	/* original downstream id */
@@ -2513,7 +2724,7 @@
 		    (r = sshbuf_put_u32(modified, c->self)) != 0 ||
 		    (r = sshbuf_putb(modified, original)) != 0) {
 			error("%s: compose error %s", __func__, ssh_err(r));
-			channel_free(c);
+			channel_free(ssh, c);
 			goto out;
 		}
 		break;
@@ -2532,16 +2743,17 @@
 			error("%s: parse error %s", __func__, ssh_err(r));
 			goto out;
 		}
-		c = channel_new("mux proxy", SSH_CHANNEL_MUX_PROXY,
+		c = channel_new(ssh, "mux proxy", SSH_CHANNEL_MUX_PROXY,
 		   -1, -1, -1, 0, 0, 0, "mux-down-connect", 1);
 		c->mux_ctx = downstream;	/* point to mux client */
 		c->mux_downstream_id = id;
 		c->remote_id = remote_id;
+		c->have_remote_id = 1;
 		if ((r = sshbuf_put_u32(modified, remote_id)) != 0 ||
 		    (r = sshbuf_put_u32(modified, c->self)) != 0 ||
 		    (r = sshbuf_putb(modified, original)) != 0) {
 			error("%s: compose error %s", __func__, ssh_err(r));
-			channel_free(c);
+			channel_free(ssh, c);
 			goto out;
 		}
 		break;
@@ -2570,23 +2782,17 @@
 			goto out;
 		}
 		/* Record that connection to this host/port is permitted. */
-		permitted_opens = xreallocarray(permitted_opens,
-		    num_permitted_opens + 1, sizeof(*permitted_opens));
-		idx = num_permitted_opens++;
-		permitted_opens[idx].host_to_connect = xstrdup("<mux>");
-		permitted_opens[idx].port_to_connect = -1;
-		permitted_opens[idx].listen_host = listen_host;
-		permitted_opens[idx].listen_port = (int)listen_port;
-		permitted_opens[idx].downstream = downstream;
+		permission_set_add(ssh, FORWARD_USER, FORWARD_LOCAL, "<mux>", -1,
+		    listen_host, NULL, (int)listen_port, downstream);
 		listen_host = NULL;
 		break;
 	case SSH2_MSG_CHANNEL_CLOSE:
 		if (have < 4)
 			break;
 		remote_id = PEEK_U32(cp);
-		if ((c = channel_by_remote_id(remote_id)) != NULL) {
+		if ((c = channel_by_remote_id(ssh, remote_id)) != NULL) {
 			if (c->flags & CHAN_CLOSE_RCVD)
-				channel_free(c);
+				channel_free(ssh, c);
 			else
 				c->flags |= CHAN_CLOSE_SENT;
 		}
@@ -2623,9 +2829,8 @@
  * replaces local (proxy) channel ID with downstream channel ID.
  */
 int
-channel_proxy_upstream(Channel *c, int type, u_int32_t seq, void *ctxt)
+channel_proxy_upstream(Channel *c, int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = active_state;
 	struct sshbuf *b = NULL;
 	Channel *downstream;
 	const u_char *cp = NULL;
@@ -2635,7 +2840,7 @@
 	/*
 	 * When receiving packets from the peer we need to check whether we
 	 * need to forward the packets to the mux client. In this case we
-	 * restore the orignal channel id and keep track of CLOSE messages,
+	 * restore the original channel id and keep track of CLOSE messages,
 	 * so we can cleanup the channel.
 	 */
 	if (c == NULL || c->type != SSH_CHANNEL_MUX_PROXY)
@@ -2674,7 +2879,7 @@
 	    (r = sshbuf_put_u8(b, type)) != 0 ||
 	    (r = sshbuf_put_u32(b, c->mux_downstream_id)) != 0 ||
 	    (r = sshbuf_put(b, cp, len)) != 0 ||
-	    (r = sshbuf_put_stringb(&downstream->output, b)) != 0) {
+	    (r = sshbuf_put_stringb(downstream->output, b)) != 0) {
 		error("%s: compose for muxclient %s", __func__, ssh_err(r));
 		goto out;
 	}
@@ -2687,12 +2892,14 @@
 	switch (type) {
 	case SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:
 		/* record remote_id for SSH2_MSG_CHANNEL_CLOSE */
-		if (cp && len > 4)
+		if (cp && len > 4) {
 			c->remote_id = PEEK_U32(cp);
+			c->have_remote_id = 1;
+		}
 		break;
 	case SSH2_MSG_CHANNEL_CLOSE:
 		if (c->flags & CHAN_CLOSE_SENT)
-			channel_free(c);
+			channel_free(ssh, c);
 		else
 			c->flags |= CHAN_CLOSE_RCVD;
 		break;
@@ -2703,257 +2910,221 @@
 
 /* -- protocol input */
 
-/* ARGSUSED */
-int
-channel_input_data(int type, u_int32_t seq, void *ctxt)
+/* Parse a channel ID from the current packet */
+static int
+channel_parse_id(struct ssh *ssh, const char *where, const char *what)
 {
-	int id;
-	const u_char *data;
-	u_int data_len, win_len;
+	u_int32_t id;
+	int r;
+
+	if ((r = sshpkt_get_u32(ssh, &id)) != 0) {
+		error("%s: parse id: %s", where, ssh_err(r));
+		ssh_packet_disconnect(ssh, "Invalid %s message", what);
+	}
+	if (id > INT_MAX) {
+		error("%s: bad channel id %u: %s", where, id, ssh_err(r));
+		ssh_packet_disconnect(ssh, "Invalid %s channel id", what);
+	}
+	return (int)id;
+}
+
+/* Lookup a channel from an ID in the current packet */
+static Channel *
+channel_from_packet_id(struct ssh *ssh, const char *where, const char *what)
+{
+	int id = channel_parse_id(ssh, where, what);
 	Channel *c;
 
-	/* Get the channel number and verify it. */
-	id = packet_get_int();
-	c = channel_lookup(id);
-	if (c == NULL)
-		packet_disconnect("Received data for nonexistent channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	if ((c = channel_lookup(ssh, id)) == NULL) {
+		ssh_packet_disconnect(ssh,
+		    "%s packet referred to nonexistent channel %d", what, id);
+	}
+	return c;
+}
+
+int
+channel_input_data(int type, u_int32_t seq, struct ssh *ssh)
+{
+	const u_char *data;
+	size_t data_len, win_len;
+	Channel *c = channel_from_packet_id(ssh, __func__, "data");
+	int r;
+
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
 
 	/* Ignore any data for non-open channels (might happen on close) */
 	if (c->type != SSH_CHANNEL_OPEN &&
+	    c->type != SSH_CHANNEL_RDYNAMIC_OPEN &&
+	    c->type != SSH_CHANNEL_RDYNAMIC_FINISH &&
 	    c->type != SSH_CHANNEL_X11_OPEN)
 		return 0;
 
 	/* Get the data. */
-	data = packet_get_string_ptr(&data_len);
+	if ((r = sshpkt_get_string_direct(ssh, &data, &data_len)) != 0)
+		fatal("%s: channel %d: get data: %s", __func__,
+		    c->self, ssh_err(r));
+	ssh_packet_check_eom(ssh);
+
 	win_len = data_len;
 	if (c->datagram)
 		win_len += 4;  /* string length header */
 
 	/*
-	 * Ignore data for protocol > 1.3 if output end is no longer open.
-	 * For protocol 2 the sending side is reducing its window as it sends
-	 * data, so we must 'fake' consumption of the data in order to ensure
-	 * that window updates are sent back.  Otherwise the connection might
-	 * deadlock.
+	 * The sending side reduces its window as it sends data, so we
+	 * must 'fake' consumption of the data in order to ensure that window
+	 * updates are sent back. Otherwise the connection might deadlock.
 	 */
-	if (!compat13 && c->ostate != CHAN_OUTPUT_OPEN) {
-		if (compat20) {
-			c->local_window -= win_len;
-			c->local_consumed += win_len;
-		}
+	if (c->ostate != CHAN_OUTPUT_OPEN) {
+		c->local_window -= win_len;
+		c->local_consumed += win_len;
 		return 0;
 	}
 
-	if (compat20) {
-		if (win_len > c->local_maxpacket) {
-			logit("channel %d: rcvd big packet %d, maxpack %d",
-			    c->self, win_len, c->local_maxpacket);
-		}
-		if (win_len > c->local_window) {
-			logit("channel %d: rcvd too much data %d, win %d",
-			    c->self, win_len, c->local_window);
-			return 0;
-		}
-		c->local_window -= win_len;
+	if (win_len > c->local_maxpacket) {
+		logit("channel %d: rcvd big packet %zu, maxpack %u",
+		    c->self, win_len, c->local_maxpacket);
+		return 0;
 	}
-	if (c->datagram)
-		buffer_put_string(&c->output, data, data_len);
-	else
-		buffer_append(&c->output, data, data_len);
-	packet_check_eom();
+	if (win_len > c->local_window) {
+		logit("channel %d: rcvd too much data %zu, win %u",
+		    c->self, win_len, c->local_window);
+		return 0;
+	}
+	c->local_window -= win_len;
+
+	if (c->datagram) {
+		if ((r = sshbuf_put_string(c->output, data, data_len)) != 0)
+			fatal("%s: channel %d: append datagram: %s",
+			    __func__, c->self, ssh_err(r));
+	} else if ((r = sshbuf_put(c->output, data, data_len)) != 0)
+		fatal("%s: channel %d: append data: %s",
+		    __func__, c->self, ssh_err(r));
+
 	return 0;
 }
 
-/* ARGSUSED */
 int
-channel_input_extended_data(int type, u_int32_t seq, void *ctxt)
+channel_input_extended_data(int type, u_int32_t seq, struct ssh *ssh)
 {
-	int id;
-	char *data;
-	u_int data_len, tcode;
-	Channel *c;
+	const u_char *data;
+	size_t data_len;
+	u_int32_t tcode;
+	Channel *c = channel_from_packet_id(ssh, __func__, "extended data");
+	int r;
 
-	/* Get the channel number and verify it. */
-	id = packet_get_int();
-	c = channel_lookup(id);
-
-	if (c == NULL)
-		packet_disconnect("Received extended_data for bad channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
 	if (c->type != SSH_CHANNEL_OPEN) {
-		logit("channel %d: ext data for non open", id);
+		logit("channel %d: ext data for non open", c->self);
 		return 0;
 	}
 	if (c->flags & CHAN_EOF_RCVD) {
 		if (datafellows & SSH_BUG_EXTEOF)
-			debug("channel %d: accepting ext data after eof", id);
+			debug("channel %d: accepting ext data after eof",
+			    c->self);
 		else
-			packet_disconnect("Received extended_data after EOF "
-			    "on channel %d.", id);
+			ssh_packet_disconnect(ssh, "Received extended_data "
+			    "after EOF on channel %d.", c->self);
 	}
-	tcode = packet_get_int();
+
+	if ((r = sshpkt_get_u32(ssh, &tcode)) != 0) {
+		error("%s: parse tcode: %s", __func__, ssh_err(r));
+		ssh_packet_disconnect(ssh, "Invalid extended_data message");
+	}
 	if (c->efd == -1 ||
 	    c->extended_usage != CHAN_EXTENDED_WRITE ||
 	    tcode != SSH2_EXTENDED_DATA_STDERR) {
 		logit("channel %d: bad ext data", c->self);
 		return 0;
 	}
-	data = packet_get_string(&data_len);
-	packet_check_eom();
+	if ((r = sshpkt_get_string_direct(ssh, &data, &data_len)) != 0) {
+		error("%s: parse data: %s", __func__, ssh_err(r));
+		ssh_packet_disconnect(ssh, "Invalid extended_data message");
+	}
+	ssh_packet_check_eom(ssh);
+
 	if (data_len > c->local_window) {
-		logit("channel %d: rcvd too much extended_data %d, win %d",
+		logit("channel %d: rcvd too much extended_data %zu, win %u",
 		    c->self, data_len, c->local_window);
-		free(data);
 		return 0;
 	}
-	debug2("channel %d: rcvd ext data %d", c->self, data_len);
+	debug2("channel %d: rcvd ext data %zu", c->self, data_len);
+	/* XXX sshpkt_getb? */
+	if ((r = sshbuf_put(c->extended, data, data_len)) != 0)
+		error("%s: append: %s", __func__, ssh_err(r));
 	c->local_window -= data_len;
-	buffer_append(&c->extended, data, data_len);
-	free(data);
 	return 0;
 }
 
-/* ARGSUSED */
 int
-channel_input_ieof(int type, u_int32_t seq, void *ctxt)
+channel_input_ieof(int type, u_int32_t seq, struct ssh *ssh)
 {
-	int id;
-	Channel *c;
+	Channel *c = channel_from_packet_id(ssh, __func__, "ieof");
 
-	id = packet_get_int();
-	packet_check_eom();
-	c = channel_lookup(id);
-	if (c == NULL)
-		packet_disconnect("Received ieof for nonexistent channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	ssh_packet_check_eom(ssh);
+
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
-	chan_rcvd_ieof(c);
+	chan_rcvd_ieof(ssh, c);
 
 	/* XXX force input close */
 	if (c->force_drain && c->istate == CHAN_INPUT_OPEN) {
 		debug("channel %d: FORCE input drain", c->self);
 		c->istate = CHAN_INPUT_WAIT_DRAIN;
-		if (buffer_len(&c->input) == 0)
-			chan_ibuf_empty(c);
+		if (sshbuf_len(c->input) == 0)
+			chan_ibuf_empty(ssh, c);
 	}
 	return 0;
 }
 
-/* ARGSUSED */
 int
-channel_input_close(int type, u_int32_t seq, void *ctxt)
+channel_input_oclose(int type, u_int32_t seq, struct ssh *ssh)
 {
-	int id;
-	Channel *c;
+	Channel *c = channel_from_packet_id(ssh, __func__, "oclose");
 
-	id = packet_get_int();
-	packet_check_eom();
-	c = channel_lookup(id);
-	if (c == NULL)
-		packet_disconnect("Received close for nonexistent channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
-	/*
-	 * Send a confirmation that we have closed the channel and no more
-	 * data is coming for it.
-	 */
-	packet_start(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION);
-	packet_put_int(c->remote_id);
-	packet_send();
-
-	/*
-	 * If the channel is in closed state, we have sent a close request,
-	 * and the other side will eventually respond with a confirmation.
-	 * Thus, we cannot free the channel here, because then there would be
-	 * no-one to receive the confirmation.  The channel gets freed when
-	 * the confirmation arrives.
-	 */
-	if (c->type != SSH_CHANNEL_CLOSED) {
-		/*
-		 * Not a closed channel - mark it as draining, which will
-		 * cause it to be freed later.
-		 */
-		buffer_clear(&c->input);
-		c->type = SSH_CHANNEL_OUTPUT_DRAINING;
-	}
+	ssh_packet_check_eom(ssh);
+	chan_rcvd_oclose(ssh, c);
 	return 0;
 }
 
-/* proto version 1.5 overloads CLOSE_CONFIRMATION with OCLOSE */
-/* ARGSUSED */
 int
-channel_input_oclose(int type, u_int32_t seq, void *ctxt)
+channel_input_open_confirmation(int type, u_int32_t seq, struct ssh *ssh)
 {
-	int id = packet_get_int();
-	Channel *c = channel_lookup(id);
+	Channel *c = channel_from_packet_id(ssh, __func__, "open confirmation");
+	u_int32_t remote_window, remote_maxpacket;
+	int r;
 
-	if (c == NULL)
-		packet_disconnect("Received oclose for nonexistent channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
-		return 0;
-	packet_check_eom();
-	chan_rcvd_oclose(c);
-	return 0;
-}
-
-/* ARGSUSED */
-int
-channel_input_close_confirmation(int type, u_int32_t seq, void *ctxt)
-{
-	int id = packet_get_int();
-	Channel *c = channel_lookup(id);
-
-	if (c == NULL)
-		packet_disconnect("Received close confirmation for "
-		    "out-of-range channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
-		return 0;
-	packet_check_eom();
-	if (c->type != SSH_CHANNEL_CLOSED && c->type != SSH_CHANNEL_ABANDONED)
-		packet_disconnect("Received close confirmation for "
-		    "non-closed channel %d (type %d).", id, c->type);
-	channel_free(c);
-	return 0;
-}
-
-/* ARGSUSED */
-int
-channel_input_open_confirmation(int type, u_int32_t seq, void *ctxt)
-{
-	int id, remote_id;
-	Channel *c;
-
-	id = packet_get_int();
-	c = channel_lookup(id);
-
-	if (c==NULL)
-		packet_disconnect("Received open confirmation for "
-		    "unknown channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
 	if (c->type != SSH_CHANNEL_OPENING)
 		packet_disconnect("Received open confirmation for "
-		    "non-opening channel %d.", id);
-	remote_id = packet_get_int();
-	/* Record the remote channel number and mark that the channel is now open. */
-	c->remote_id = remote_id;
-	c->type = SSH_CHANNEL_OPEN;
-
-	if (compat20) {
-		c->remote_window = packet_get_int();
-		c->remote_maxpacket = packet_get_int();
-		if (c->open_confirm) {
-			debug2("callback start");
-			c->open_confirm(c->self, 1, c->open_confirm_ctx);
-			debug2("callback done");
-		}
-		debug2("channel %d: open confirm rwindow %u rmax %u", c->self,
-		    c->remote_window, c->remote_maxpacket);
+		    "non-opening channel %d.", c->self);
+	/*
+	 * Record the remote channel number and mark that the channel
+	 * is now open.
+	 */
+	if ((r = sshpkt_get_u32(ssh, &c->remote_id)) != 0 ||
+	    (r = sshpkt_get_u32(ssh, &remote_window)) != 0 ||
+	    (r = sshpkt_get_u32(ssh, &remote_maxpacket)) != 0) {
+		error("%s: window/maxpacket: %s", __func__, ssh_err(r));
+		packet_disconnect("Invalid open confirmation message");
 	}
-	packet_check_eom();
+	ssh_packet_check_eom(ssh);
+
+	c->have_remote_id = 1;
+	c->remote_window = remote_window;
+	c->remote_maxpacket = remote_maxpacket;
+	c->type = SSH_CHANNEL_OPEN;
+	if (c->open_confirm) {
+		debug2("%s: channel %d: callback start", __func__, c->self);
+		c->open_confirm(ssh, c->self, 1, c->open_confirm_ctx);
+		debug2("%s: channel %d: callback done", __func__, c->self);
+	}
+	debug2("channel %d: open confirm rwindow %u rmax %u", c->self,
+	    c->remote_window, c->remote_maxpacket);
 	return 0;
 }
 
@@ -2973,134 +3144,95 @@
 	return "unknown reason";
 }
 
-/* ARGSUSED */
 int
-channel_input_open_failure(int type, u_int32_t seq, void *ctxt)
+channel_input_open_failure(int type, u_int32_t seq, struct ssh *ssh)
 {
-	int id, reason;
-	char *msg = NULL, *lang = NULL;
-	Channel *c;
+	Channel *c = channel_from_packet_id(ssh, __func__, "open failure");
+	u_int32_t reason;
+	char *msg = NULL;
+	int r;
 
-	id = packet_get_int();
-	c = channel_lookup(id);
-
-	if (c==NULL)
-		packet_disconnect("Received open failure for "
-		    "unknown channel %d.", id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
 	if (c->type != SSH_CHANNEL_OPENING)
 		packet_disconnect("Received open failure for "
-		    "non-opening channel %d.", id);
-	if (compat20) {
-		reason = packet_get_int();
-		if (!(datafellows & SSH_BUG_OPENFAILURE)) {
-			msg  = packet_get_string(NULL);
-			lang = packet_get_string(NULL);
-		}
-		logit("channel %d: open failed: %s%s%s", id,
-		    reason2txt(reason), msg ? ": ": "", msg ? msg : "");
-		free(msg);
-		free(lang);
-		if (c->open_confirm) {
-			debug2("callback start");
-			c->open_confirm(c->self, 0, c->open_confirm_ctx);
-			debug2("callback done");
-		}
+		    "non-opening channel %d.", c->self);
+	if ((r = sshpkt_get_u32(ssh, &reason)) != 0) {
+		error("%s: reason: %s", __func__, ssh_err(r));
+		packet_disconnect("Invalid open failure message");
 	}
-	packet_check_eom();
+	/* skip language */
+	if ((r = sshpkt_get_cstring(ssh, &msg, NULL)) != 0 ||
+	    (r = sshpkt_get_string_direct(ssh, NULL, NULL)) != 0) {
+		error("%s: message/lang: %s", __func__, ssh_err(r));
+		packet_disconnect("Invalid open failure message");
+	}
+	ssh_packet_check_eom(ssh);
+	logit("channel %d: open failed: %s%s%s", c->self,
+	    reason2txt(reason), msg ? ": ": "", msg ? msg : "");
+	free(msg);
+	if (c->open_confirm) {
+		debug2("%s: channel %d: callback start", __func__, c->self);
+		c->open_confirm(ssh, c->self, 0, c->open_confirm_ctx);
+		debug2("%s: channel %d: callback done", __func__, c->self);
+	}
 	/* Schedule the channel for cleanup/deletion. */
-	chan_mark_dead(c);
+	chan_mark_dead(ssh, c);
 	return 0;
 }
 
-/* ARGSUSED */
 int
-channel_input_window_adjust(int type, u_int32_t seq, void *ctxt)
+channel_input_window_adjust(int type, u_int32_t seq, struct ssh *ssh)
 {
+	int id = channel_parse_id(ssh, __func__, "window adjust");
 	Channel *c;
-	int id;
-	u_int adjust, tmp;
+	u_int32_t adjust;
+	u_int new_rwin;
+	int r;
 
-	if (!compat20)
-		return 0;
-
-	/* Get the channel number and verify it. */
-	id = packet_get_int();
-	c = channel_lookup(id);
-
-	if (c == NULL) {
+	if ((c = channel_lookup(ssh, id)) == NULL) {
 		logit("Received window adjust for non-open channel %d.", id);
 		return 0;
 	}
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
-	adjust = packet_get_int();
-	packet_check_eom();
-	debug2("channel %d: rcvd adjust %u", id, adjust);
-	if ((tmp = c->remote_window + adjust) < c->remote_window)
-		fatal("channel %d: adjust %u overflows remote window %u",
-		    id, adjust, c->remote_window);
-	c->remote_window = tmp;
-	return 0;
-}
-
-/* ARGSUSED */
-int
-channel_input_port_open(int type, u_int32_t seq, void *ctxt)
-{
-	Channel *c = NULL;
-	u_short host_port;
-	char *host, *originator_string;
-	int remote_id;
-
-	remote_id = packet_get_int();
-	host = packet_get_string(NULL);
-	host_port = packet_get_int();
-
-	if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
-		originator_string = packet_get_string(NULL);
-	} else {
-		originator_string = xstrdup("unknown (remote did not supply name)");
+	if ((r = sshpkt_get_u32(ssh, &adjust)) != 0) {
+		error("%s: adjust: %s", __func__, ssh_err(r));
+		packet_disconnect("Invalid window adjust message");
 	}
-	packet_check_eom();
-	c = channel_connect_to_port(host, host_port,
-	    "connected socket", originator_string, NULL, NULL);
-	free(originator_string);
-	free(host);
-	if (c == NULL) {
-		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
-		packet_put_int(remote_id);
-		packet_send();
-	} else
-		c->remote_id = remote_id;
+	ssh_packet_check_eom(ssh);
+	debug2("channel %d: rcvd adjust %u", c->self, adjust);
+	if ((new_rwin = c->remote_window + adjust) < c->remote_window) {
+		fatal("channel %d: adjust %u overflows remote window %u",
+		    c->self, adjust, c->remote_window);
+	}
+	c->remote_window = new_rwin;
 	return 0;
 }
 
-/* ARGSUSED */
 int
-channel_input_status_confirm(int type, u_int32_t seq, void *ctxt)
+channel_input_status_confirm(int type, u_int32_t seq, struct ssh *ssh)
 {
+	int id = channel_parse_id(ssh, __func__, "status confirm");
 	Channel *c;
 	struct channel_confirm *cc;
-	int id;
 
 	/* Reset keepalive timeout */
 	packet_set_alive_timeouts(0);
 
-	id = packet_get_int();
-	debug2("channel_input_status_confirm: type %d id %d", type, id);
+	debug2("%s: type %d id %d", __func__, type, id);
 
-	if ((c = channel_lookup(id)) == NULL) {
-		logit("channel_input_status_confirm: %d: unknown", id);
+	if ((c = channel_lookup(ssh, id)) == NULL) {
+		logit("%s: %d: unknown", __func__, id);
 		return 0;
-	}	
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	}
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
-	packet_check_eom();
+	ssh_packet_check_eom(ssh);
 	if ((cc = TAILQ_FIRST(&c->status_confirms)) == NULL)
 		return 0;
-	cc->cb(type, c, cc->ctx);
+	cc->cb(ssh, type, c, cc->ctx);
 	TAILQ_REMOVE(&c->status_confirms, cc, entry);
 	explicit_bzero(cc, sizeof(*cc));
 	free(cc);
@@ -3110,9 +3242,9 @@
 /* -- tcp forwarding */
 
 void
-channel_set_af(int af)
+channel_set_af(struct ssh *ssh, int af)
 {
-	IPv4or6 = af;
+	ssh->chanctxt->IPv4or6 = af;
 }
 
 
@@ -3180,8 +3312,9 @@
 }
 
 static int
-channel_setup_fwd_listener_tcpip(int type, struct Forward *fwd,
-    int *allocated_listen_port, struct ForwardOptions *fwd_opts)
+channel_setup_fwd_listener_tcpip(struct ssh *ssh, int type,
+    struct Forward *fwd, int *allocated_listen_port,
+    struct ForwardOptions *fwd_opts)
 {
 	Channel *c;
 	int sock, r, success = 0, wildcard = 0, is_client;
@@ -3218,7 +3351,7 @@
 	 * set to NULL and hints.ai_flags is not AI_PASSIVE
 	 */
 	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = IPv4or6;
+	hints.ai_family = ssh->chanctxt->IPv4or6;
 	hints.ai_flags = wildcard ? AI_PASSIVE : 0;
 	hints.ai_socktype = SOCK_STREAM;
 	snprintf(strport, sizeof strport, "%d", fwd->listen_port);
@@ -3252,12 +3385,14 @@
 		 * If allocating a port for -R forwards, then use the
 		 * same port for all address families.
 		 */
-		if (type == SSH_CHANNEL_RPORT_LISTENER && fwd->listen_port == 0 &&
-		    allocated_listen_port != NULL && *allocated_listen_port > 0)
+		if (type == SSH_CHANNEL_RPORT_LISTENER &&
+		    fwd->listen_port == 0 && allocated_listen_port != NULL &&
+		    *allocated_listen_port > 0)
 			*lport_p = htons(*allocated_listen_port);
 
 		if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop),
-		    strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
+		    strport, sizeof(strport),
+		    NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
 			error("%s: getnameinfo failed", __func__);
 			continue;
 		}
@@ -3265,11 +3400,12 @@
 		sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
 		if (sock < 0) {
 			/* this is no error since kernel may not support ipv6 */
-			verbose("socket: %.100s", strerror(errno));
+			verbose("socket [%s]:%s: %.100s", ntop, strport,
+			    strerror(errno));
 			continue;
 		}
 
-		channel_set_reuseaddr(sock);
+		set_reuseaddr(sock);
 		if (ai->ai_family == AF_INET6)
 			sock_set_v6only(sock);
 
@@ -3278,11 +3414,16 @@
 
 		/* Bind the socket to the address. */
 		if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
-			/* address can be in use ipv6 address is already bound */
+			/*
+			 * address can be in if use ipv6 address is
+			 * already bound
+			 */
 			if (!ai->ai_next)
-				error("bind: %.100s", strerror(errno));
+				error("bind [%s]:%s: %.100s",
+				    ntop, strport, strerror(errno));
 			else
-				verbose("bind: %.100s", strerror(errno));
+				verbose("bind [%s]:%s: %.100s",
+				    ntop, strport, strerror(errno));
 
 			close(sock);
 			continue;
@@ -3290,6 +3431,8 @@
 		/* Start listening for connections on the socket. */
 		if (listen(sock, SSH_LISTEN_BACKLOG) < 0) {
 			error("listen: %.100s", strerror(errno));
+			error("listen [%s]:%s: %.100s", ntop, strport,
+			    strerror(errno));
 			close(sock);
 			continue;
 		}
@@ -3298,7 +3441,8 @@
 		 * fwd->listen_port == 0 requests a dynamically allocated port -
 		 * record what we got.
 		 */
-		if (type == SSH_CHANNEL_RPORT_LISTENER && fwd->listen_port == 0 &&
+		if (type == SSH_CHANNEL_RPORT_LISTENER &&
+		    fwd->listen_port == 0 &&
 		    allocated_listen_port != NULL &&
 		    *allocated_listen_port == 0) {
 			*allocated_listen_port = get_local_port(sock);
@@ -3307,7 +3451,7 @@
 		}
 
 		/* Allocate a channel number for the socket. */
-		c = channel_new("port listener", type, sock, sock, -1,
+		c = channel_new(ssh, "port listener", type, sock, sock, -1,
 		    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
 		    0, "port listener", 1);
 		c->path = xstrdup(host);
@@ -3328,8 +3472,8 @@
 }
 
 static int
-channel_setup_fwd_listener_streamlocal(int type, struct Forward *fwd,
-    struct ForwardOptions *fwd_opts)
+channel_setup_fwd_listener_streamlocal(struct ssh *ssh, int type,
+    struct Forward *fwd, struct ForwardOptions *fwd_opts)
 {
 	struct sockaddr_un sunaddr;
 	const char *path;
@@ -3391,7 +3535,7 @@
 	debug("Local forwarding listening on path %s.", fwd->listen_path);
 
 	/* Allocate a channel number for the socket. */
-	c = channel_new("unix listener", type, sock, sock, -1,
+	c = channel_new(ssh, "unix listener", type, sock, sock, -1,
 	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
 	    0, "unix listener", 1);
 	c->path = xstrdup(path);
@@ -3402,66 +3546,71 @@
 }
 
 static int
-channel_cancel_rport_listener_tcpip(const char *host, u_short port)
+channel_cancel_rport_listener_tcpip(struct ssh *ssh,
+    const char *host, u_short port)
 {
 	u_int i;
 	int found = 0;
 
-	for (i = 0; i < channels_alloc; i++) {
-		Channel *c = channels[i];
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		Channel *c = ssh->chanctxt->channels[i];
 		if (c == NULL || c->type != SSH_CHANNEL_RPORT_LISTENER)
 			continue;
 		if (strcmp(c->path, host) == 0 && c->listening_port == port) {
 			debug2("%s: close channel %d", __func__, i);
-			channel_free(c);
+			channel_free(ssh, c);
 			found = 1;
 		}
 	}
 
-	return (found);
+	return found;
 }
 
 static int
-channel_cancel_rport_listener_streamlocal(const char *path)
+channel_cancel_rport_listener_streamlocal(struct ssh *ssh, const char *path)
 {
 	u_int i;
 	int found = 0;
 
-	for (i = 0; i < channels_alloc; i++) {
-		Channel *c = channels[i];
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		Channel *c = ssh->chanctxt->channels[i];
 		if (c == NULL || c->type != SSH_CHANNEL_RUNIX_LISTENER)
 			continue;
 		if (c->path == NULL)
 			continue;
 		if (strcmp(c->path, path) == 0) {
 			debug2("%s: close channel %d", __func__, i);
-			channel_free(c);
+			channel_free(ssh, c);
 			found = 1;
 		}
 	}
 
-	return (found);
+	return found;
 }
 
 int
-channel_cancel_rport_listener(struct Forward *fwd)
+channel_cancel_rport_listener(struct ssh *ssh, struct Forward *fwd)
 {
-	if (fwd->listen_path != NULL)
-		return channel_cancel_rport_listener_streamlocal(fwd->listen_path);
-	else
-		return channel_cancel_rport_listener_tcpip(fwd->listen_host, fwd->listen_port);
+	if (fwd->listen_path != NULL) {
+		return channel_cancel_rport_listener_streamlocal(ssh,
+		    fwd->listen_path);
+	} else {
+		return channel_cancel_rport_listener_tcpip(ssh,
+		    fwd->listen_host, fwd->listen_port);
+	}
 }
 
 static int
-channel_cancel_lport_listener_tcpip(const char *lhost, u_short lport,
-    int cport, struct ForwardOptions *fwd_opts)
+channel_cancel_lport_listener_tcpip(struct ssh *ssh,
+    const char *lhost, u_short lport, int cport,
+    struct ForwardOptions *fwd_opts)
 {
 	u_int i;
 	int found = 0;
 	const char *addr = channel_fwd_bind_addr(lhost, NULL, 1, fwd_opts);
 
-	for (i = 0; i < channels_alloc; i++) {
-		Channel *c = channels[i];
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		Channel *c = ssh->chanctxt->channels[i];
 		if (c == NULL || c->type != SSH_CHANNEL_PORT_LISTENER)
 			continue;
 		if (c->listening_port != lport)
@@ -3479,16 +3628,16 @@
 			continue;
 		if (addr == NULL || strcmp(c->listening_addr, addr) == 0) {
 			debug2("%s: close channel %d", __func__, i);
-			channel_free(c);
+			channel_free(ssh, c);
 			found = 1;
 		}
 	}
 
-	return (found);
+	return found;
 }
 
 static int
-channel_cancel_lport_listener_streamlocal(const char *path)
+channel_cancel_lport_listener_streamlocal(struct ssh *ssh, const char *path)
 {
 	u_int i;
 	int found = 0;
@@ -3498,54 +3647,126 @@
 		return 0;
 	}
 
-	for (i = 0; i < channels_alloc; i++) {
-		Channel *c = channels[i];
+	for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
+		Channel *c = ssh->chanctxt->channels[i];
 		if (c == NULL || c->type != SSH_CHANNEL_UNIX_LISTENER)
 			continue;
 		if (c->listening_addr == NULL)
 			continue;
 		if (strcmp(c->listening_addr, path) == 0) {
 			debug2("%s: close channel %d", __func__, i);
-			channel_free(c);
+			channel_free(ssh, c);
 			found = 1;
 		}
 	}
 
-	return (found);
+	return found;
 }
 
 int
-channel_cancel_lport_listener(struct Forward *fwd, int cport, struct ForwardOptions *fwd_opts)
-{
-	if (fwd->listen_path != NULL)
-		return channel_cancel_lport_listener_streamlocal(fwd->listen_path);
-	else
-		return channel_cancel_lport_listener_tcpip(fwd->listen_host, fwd->listen_port, cport, fwd_opts);
-}
-
-/* protocol local port fwd, used by ssh (and sshd in v1) */
-int
-channel_setup_local_fwd_listener(struct Forward *fwd, struct ForwardOptions *fwd_opts)
+channel_cancel_lport_listener(struct ssh *ssh,
+    struct Forward *fwd, int cport, struct ForwardOptions *fwd_opts)
 {
 	if (fwd->listen_path != NULL) {
-		return channel_setup_fwd_listener_streamlocal(
+		return channel_cancel_lport_listener_streamlocal(ssh,
+		    fwd->listen_path);
+	} else {
+		return channel_cancel_lport_listener_tcpip(ssh,
+		    fwd->listen_host, fwd->listen_port, cport, fwd_opts);
+	}
+}
+
+/* protocol local port fwd, used by ssh */
+int
+channel_setup_local_fwd_listener(struct ssh *ssh,
+    struct Forward *fwd, struct ForwardOptions *fwd_opts)
+{
+	if (fwd->listen_path != NULL) {
+		return channel_setup_fwd_listener_streamlocal(ssh,
 		    SSH_CHANNEL_UNIX_LISTENER, fwd, fwd_opts);
 	} else {
-		return channel_setup_fwd_listener_tcpip(SSH_CHANNEL_PORT_LISTENER,
-		    fwd, NULL, fwd_opts);
+		return channel_setup_fwd_listener_tcpip(ssh,
+		    SSH_CHANNEL_PORT_LISTENER, fwd, NULL, fwd_opts);
 	}
 }
 
+/* Matches a remote forwarding permission against a requested forwarding */
+static int
+remote_open_match(struct permission *allowed_open, struct Forward *fwd)
+{
+	int ret;
+	char *lhost;
+
+	/* XXX add ACLs for streamlocal */
+	if (fwd->listen_path != NULL)
+		return 1;
+
+	if (fwd->listen_host == NULL || allowed_open->listen_host == NULL)
+		return 0;
+
+	if (allowed_open->listen_port != FWD_PERMIT_ANY_PORT &&
+	    allowed_open->listen_port != fwd->listen_port)
+		return 0;
+
+	/* Match hostnames case-insensitively */
+	lhost = xstrdup(fwd->listen_host);
+	lowercase(lhost);
+	ret = match_pattern(lhost, allowed_open->listen_host);
+	free(lhost);
+
+	return ret;
+}
+
+/* Checks whether a requested remote forwarding is permitted */
+static int
+check_rfwd_permission(struct ssh *ssh, struct Forward *fwd)
+{
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->remote_perms;
+	u_int i, permit, permit_adm = 1;
+	struct permission *perm;
+
+	/* XXX apply GatewayPorts override before checking? */
+
+	permit = pset->all_permitted;
+	if (!permit) {
+		for (i = 0; i < pset->num_permitted_user; i++) {
+			perm = &pset->permitted_user[i];
+			if (remote_open_match(perm, fwd)) {
+				permit = 1;
+				break;
+			}
+		}
+	}
+
+	if (pset->num_permitted_admin > 0) {
+		permit_adm = 0;
+		for (i = 0; i < pset->num_permitted_admin; i++) {
+			perm = &pset->permitted_admin[i];
+			if (remote_open_match(perm, fwd)) {
+				permit_adm = 1;
+				break;
+			}
+		}
+	}
+
+	return permit && permit_adm;
+}
+
 /* protocol v2 remote port fwd, used by sshd */
 int
-channel_setup_remote_fwd_listener(struct Forward *fwd,
+channel_setup_remote_fwd_listener(struct ssh *ssh, struct Forward *fwd,
     int *allocated_listen_port, struct ForwardOptions *fwd_opts)
 {
+	if (!check_rfwd_permission(ssh, fwd)) {
+		packet_send_debug("port forwarding refused");
+		return 0;
+	}
 	if (fwd->listen_path != NULL) {
-		return channel_setup_fwd_listener_streamlocal(
+		return channel_setup_fwd_listener_streamlocal(ssh,
 		    SSH_CHANNEL_RUNIX_LISTENER, fwd, fwd_opts);
 	} else {
-		return channel_setup_fwd_listener_tcpip(
+		return channel_setup_fwd_listener_tcpip(ssh,
 		    SSH_CHANNEL_RPORT_LISTENER, fwd, allocated_listen_port,
 		    fwd_opts);
 	}
@@ -3559,15 +3780,9 @@
 channel_rfwd_bind_host(const char *listen_host)
 {
 	if (listen_host == NULL) {
-		if (datafellows & SSH_BUG_RFWD_ADDR)
-			return "127.0.0.1";
-		else
-			return "localhost";
+		return "localhost";
 	} else if (*listen_host == '\0' || strcmp(listen_host, "*") == 0) {
-		if (datafellows & SSH_BUG_RFWD_ADDR)
-			return "0.0.0.0";
-		else
-			return "";
+		return "";
 	} else
 		return listen_host;
 }
@@ -3576,88 +3791,68 @@
  * Initiate forwarding of connections to port "port" on remote host through
  * the secure channel to host:port from local side.
  * Returns handle (index) for updating the dynamic listen port with
- * channel_update_permitted_opens().
+ * channel_update_permission().
  */
 int
-channel_request_remote_forwarding(struct Forward *fwd)
+channel_request_remote_forwarding(struct ssh *ssh, struct Forward *fwd)
 {
-	int type, success = 0, idx = -1;
+	int r, success = 0, idx = -1;
+	char *host_to_connect, *listen_host, *listen_path;
+	int port_to_connect, listen_port;
 
 	/* Send the forward request to the remote side. */
-	if (compat20) {
-		packet_start(SSH2_MSG_GLOBAL_REQUEST);
-		if (fwd->listen_path != NULL) {
-		    packet_put_cstring("streamlocal-forward@openssh.com");
-		    packet_put_char(1);		/* boolean: want reply */
-		    packet_put_cstring(fwd->listen_path);
-		} else {
-		    packet_put_cstring("tcpip-forward");
-		    packet_put_char(1);		/* boolean: want reply */
-		    packet_put_cstring(channel_rfwd_bind_host(fwd->listen_host));
-		    packet_put_int(fwd->listen_port);
-		}
-		packet_send();
-		packet_write_wait();
-		/* Assume that server accepts the request */
-		success = 1;
-	} else if (fwd->listen_path == NULL) {
-		packet_start(SSH_CMSG_PORT_FORWARD_REQUEST);
-		packet_put_int(fwd->listen_port);
-		packet_put_cstring(fwd->connect_host);
-		packet_put_int(fwd->connect_port);
-		packet_send();
-		packet_write_wait();
-
-		/* Wait for response from the remote side. */
-		type = packet_read();
-		switch (type) {
-		case SSH_SMSG_SUCCESS:
-			success = 1;
-			break;
-		case SSH_SMSG_FAILURE:
-			break;
-		default:
-			/* Unknown packet */
-			packet_disconnect("Protocol error for port forward request:"
-			    "received packet type %d.", type);
-		}
+	if (fwd->listen_path != NULL) {
+		if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
+		    (r = sshpkt_put_cstring(ssh,
+		    "streamlocal-forward@openssh.com")) != 0 ||
+		    (r = sshpkt_put_u8(ssh, 1)) != 0 || /* want reply */
+		    (r = sshpkt_put_cstring(ssh, fwd->listen_path)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0 ||
+		    (r = ssh_packet_write_wait(ssh)) != 0)
+			fatal("%s: request streamlocal: %s",
+			    __func__, ssh_err(r));
 	} else {
-		logit("Warning: Server does not support remote stream local forwarding.");
+		if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
+		    (r = sshpkt_put_cstring(ssh, "tcpip-forward")) != 0 ||
+		    (r = sshpkt_put_u8(ssh, 1)) != 0 || /* want reply */
+		    (r = sshpkt_put_cstring(ssh,
+		    channel_rfwd_bind_host(fwd->listen_host))) != 0 ||
+		    (r = sshpkt_put_u32(ssh, fwd->listen_port)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0 ||
+		    (r = ssh_packet_write_wait(ssh)) != 0)
+			fatal("%s: request tcpip-forward: %s",
+			    __func__, ssh_err(r));
 	}
+	/* Assume that server accepts the request */
+	success = 1;
 	if (success) {
 		/* Record that connection to this host/port is permitted. */
-		permitted_opens = xreallocarray(permitted_opens,
-		    num_permitted_opens + 1, sizeof(*permitted_opens));
-		idx = num_permitted_opens++;
+		host_to_connect = listen_host = listen_path = NULL;
+		port_to_connect = listen_port = 0;
 		if (fwd->connect_path != NULL) {
-			permitted_opens[idx].host_to_connect =
-			    xstrdup(fwd->connect_path);
-			permitted_opens[idx].port_to_connect =
-			    PORT_STREAMLOCAL;
+			host_to_connect = xstrdup(fwd->connect_path);
+			port_to_connect = PORT_STREAMLOCAL;
 		} else {
-			permitted_opens[idx].host_to_connect =
-			    xstrdup(fwd->connect_host);
-			permitted_opens[idx].port_to_connect =
-			    fwd->connect_port;
+			host_to_connect = xstrdup(fwd->connect_host);
+			port_to_connect = fwd->connect_port;
 		}
 		if (fwd->listen_path != NULL) {
-			permitted_opens[idx].listen_host = NULL;
-			permitted_opens[idx].listen_path =
-			    xstrdup(fwd->listen_path);
-			permitted_opens[idx].listen_port = PORT_STREAMLOCAL;
+			listen_path = xstrdup(fwd->listen_path);
+			listen_port = PORT_STREAMLOCAL;
 		} else {
-			permitted_opens[idx].listen_host =
-			    fwd->listen_host ? xstrdup(fwd->listen_host) : NULL;
-			permitted_opens[idx].listen_path = NULL;
-			permitted_opens[idx].listen_port = fwd->listen_port;
+			if (fwd->listen_host != NULL)
+				listen_host = xstrdup(fwd->listen_host);
+			listen_port = fwd->listen_port;
 		}
-		permitted_opens[idx].downstream = NULL;
+		idx = permission_set_add(ssh, FORWARD_USER, FORWARD_LOCAL,
+		    host_to_connect, port_to_connect,
+		    listen_host, listen_path, listen_port, NULL);
 	}
-	return (idx);
+	return idx;
 }
 
 static int
-open_match(ForwardPermission *allowed_open, const char *requestedhost,
+open_match(struct permission *allowed_open, const char *requestedhost,
     int requestedport)
 {
 	if (allowed_open->host_to_connect == NULL)
@@ -3678,7 +3873,7 @@
  * and what we've sent to the remote server (channel_rfwd_bind_host)
  */
 static int
-open_listen_match_tcpip(ForwardPermission *allowed_open,
+open_listen_match_tcpip(struct permission *allowed_open,
     const char *requestedhost, u_short requestedport, int translate)
 {
 	const char *allowed_host;
@@ -3693,14 +3888,14 @@
 	allowed_host = translate ?
 	    channel_rfwd_bind_host(allowed_open->listen_host) :
 	    allowed_open->listen_host;
-	if (allowed_host == NULL ||
+	if (allowed_host == NULL || requestedhost == NULL ||
 	    strcmp(allowed_host, requestedhost) != 0)
 		return 0;
 	return 1;
 }
 
 static int
-open_listen_match_streamlocal(ForwardPermission *allowed_open,
+open_listen_match_streamlocal(struct permission *allowed_open,
     const char *requestedpath)
 {
 	if (allowed_open->host_to_connect == NULL)
@@ -3718,36 +3913,34 @@
  * local side.
  */
 static int
-channel_request_rforward_cancel_tcpip(const char *host, u_short port)
+channel_request_rforward_cancel_tcpip(struct ssh *ssh,
+    const char *host, u_short port)
 {
-	int i;
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->local_perms;
+	int r;
+	u_int i;
+	struct permission *perm;
 
-	if (!compat20)
-		return -1;
-
-	for (i = 0; i < num_permitted_opens; i++) {
-		if (open_listen_match_tcpip(&permitted_opens[i], host, port, 0))
+	for (i = 0; i < pset->num_permitted_user; i++) {
+		perm = &pset->permitted_user[i];
+		if (open_listen_match_tcpip(perm, host, port, 0))
 			break;
+		perm = NULL;
 	}
-	if (i >= num_permitted_opens) {
+	if (perm == NULL) {
 		debug("%s: requested forward not found", __func__);
 		return -1;
 	}
-	packet_start(SSH2_MSG_GLOBAL_REQUEST);
-	packet_put_cstring("cancel-tcpip-forward");
-	packet_put_char(0);
-	packet_put_cstring(channel_rfwd_bind_host(host));
-	packet_put_int(port);
-	packet_send();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, "cancel-tcpip-forward")) != 0 ||
+	    (r = sshpkt_put_u8(ssh, 0)) != 0 || /* want reply */
+	    (r = sshpkt_put_cstring(ssh, channel_rfwd_bind_host(host))) != 0 ||
+	    (r = sshpkt_put_u32(ssh, port)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: send cancel: %s", __func__, ssh_err(r));
 
-	permitted_opens[i].listen_port = 0;
-	permitted_opens[i].port_to_connect = 0;
-	free(permitted_opens[i].host_to_connect);
-	permitted_opens[i].host_to_connect = NULL;
-	free(permitted_opens[i].listen_host);
-	permitted_opens[i].listen_host = NULL;
-	permitted_opens[i].listen_path = NULL;
-	permitted_opens[i].downstream = NULL;
+	fwd_perm_clear(perm); /* unregister */
 
 	return 0;
 }
@@ -3757,35 +3950,33 @@
  * path from local side.
  */
 static int
-channel_request_rforward_cancel_streamlocal(const char *path)
+channel_request_rforward_cancel_streamlocal(struct ssh *ssh, const char *path)
 {
-	int i;
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->local_perms;
+	int r;
+	u_int i;
+	struct permission *perm;
 
-	if (!compat20)
-		return -1;
-
-	for (i = 0; i < num_permitted_opens; i++) {
-		if (open_listen_match_streamlocal(&permitted_opens[i], path))
+	for (i = 0; i < pset->num_permitted_user; i++) {
+		perm = &pset->permitted_user[i];
+		if (open_listen_match_streamlocal(perm, path))
 			break;
+		perm = NULL;
 	}
-	if (i >= num_permitted_opens) {
+	if (perm == NULL) {
 		debug("%s: requested forward not found", __func__);
 		return -1;
 	}
-	packet_start(SSH2_MSG_GLOBAL_REQUEST);
-	packet_put_cstring("cancel-streamlocal-forward@openssh.com");
-	packet_put_char(0);
-	packet_put_cstring(path);
-	packet_send();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh,
+	    "cancel-streamlocal-forward@openssh.com")) != 0 ||
+	    (r = sshpkt_put_u8(ssh, 0)) != 0 || /* want reply */
+	    (r = sshpkt_put_cstring(ssh, path)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: send cancel: %s", __func__, ssh_err(r));
 
-	permitted_opens[i].listen_port = 0;
-	permitted_opens[i].port_to_connect = 0;
-	free(permitted_opens[i].host_to_connect);
-	permitted_opens[i].host_to_connect = NULL;
-	permitted_opens[i].listen_host = NULL;
-	free(permitted_opens[i].listen_path);
-	permitted_opens[i].listen_path = NULL;
-	permitted_opens[i].downstream = NULL;
+	fwd_perm_clear(perm); /* unregister */
 
 	return 0;
 }
@@ -3794,45 +3985,77 @@
  * Request cancellation of remote forwarding of a connection from local side.
  */
 int
-channel_request_rforward_cancel(struct Forward *fwd)
+channel_request_rforward_cancel(struct ssh *ssh, struct Forward *fwd)
 {
 	if (fwd->listen_path != NULL) {
-		return (channel_request_rforward_cancel_streamlocal(
-		    fwd->listen_path));
+		return channel_request_rforward_cancel_streamlocal(ssh,
+		    fwd->listen_path);
 	} else {
-		return (channel_request_rforward_cancel_tcpip(fwd->listen_host,
-		    fwd->listen_port ? fwd->listen_port : fwd->allocated_port));
+		return channel_request_rforward_cancel_tcpip(ssh,
+		    fwd->listen_host,
+		    fwd->listen_port ? fwd->listen_port : fwd->allocated_port);
 	}
 }
 
 /*
- * Permits opening to any host/port if permitted_opens[] is empty.  This is
+ * Permits opening to any host/port if permitted_user[] is empty.  This is
  * usually called by the server, because the user could connect to any port
  * anyway, and the server has no way to know but to trust the client anyway.
  */
 void
-channel_permit_all_opens(void)
+channel_permit_all(struct ssh *ssh, int where)
 {
-	if (num_permitted_opens == 0)
-		all_opens_permitted = 1;
+	struct permission_set *pset = permission_set_get(ssh, where);
+
+	if (pset->num_permitted_user == 0)
+		pset->all_permitted = 1;
 }
 
+/*
+ * Permit the specified host/port for forwarding.
+ */
 void
-channel_add_permitted_opens(char *host, int port)
+channel_add_permission(struct ssh *ssh, int who, int where,
+    char *host, int port)
 {
-	debug("allow port forwarding to host %s port %d", host, port);
+	int local = where == FORWARD_LOCAL;
+	struct permission_set *pset = permission_set_get(ssh, where);
 
-	permitted_opens = xreallocarray(permitted_opens,
-	    num_permitted_opens + 1, sizeof(*permitted_opens));
-	permitted_opens[num_permitted_opens].host_to_connect = xstrdup(host);
-	permitted_opens[num_permitted_opens].port_to_connect = port;
-	permitted_opens[num_permitted_opens].listen_host = NULL;
-	permitted_opens[num_permitted_opens].listen_path = NULL;
-	permitted_opens[num_permitted_opens].listen_port = 0;
-	permitted_opens[num_permitted_opens].downstream = NULL;
-	num_permitted_opens++;
+	debug("allow %s forwarding to host %s port %d",
+	    fwd_ident(who, where), host, port);
+	/*
+	 * Remote forwards set listen_host/port, local forwards set
+	 * host/port_to_connect.
+	 */
+	permission_set_add(ssh, who, where,
+	    local ? host : 0, local ? port : 0,
+	    local ? NULL : host, NULL, local ? 0 : port, NULL);
+	pset->all_permitted = 0;
+}
 
-	all_opens_permitted = 0;
+/*
+ * Administratively disable forwarding.
+ */
+void
+channel_disable_admin(struct ssh *ssh, int where)
+{
+	channel_clear_permission(ssh, FORWARD_ADM, where);
+	permission_set_add(ssh, FORWARD_ADM, where,
+	    NULL, 0, NULL, NULL, 0, NULL);
+}
+
+/*
+ * Clear a list of permitted opens.
+ */
+void
+channel_clear_permission(struct ssh *ssh, int who, int where)
+{
+	struct permission **permp;
+	u_int *npermp;
+
+	permission_set_get_array(ssh, who, where, &permp, &npermp);
+	*permp = xrecallocarray(*permp, *npermp, 0, sizeof(**permp));
+	*npermp = 0;
 }
 
 /*
@@ -3841,107 +4064,28 @@
  * passed then they entry will be invalidated.
  */
 void
-channel_update_permitted_opens(int idx, int newport)
+channel_update_permission(struct ssh *ssh, int idx, int newport)
 {
-	if (idx < 0 || idx >= num_permitted_opens) {
-		debug("channel_update_permitted_opens: index out of range:"
-		    " %d num_permitted_opens %d", idx, num_permitted_opens);
+	struct permission_set *pset = &ssh->chanctxt->local_perms;
+
+	if (idx < 0 || (u_int)idx >= pset->num_permitted_user) {
+		debug("%s: index out of range: %d num_permitted_user %d",
+		    __func__, idx, pset->num_permitted_user);
 		return;
 	}
 	debug("%s allowed port %d for forwarding to host %s port %d",
 	    newport > 0 ? "Updating" : "Removing",
 	    newport,
-	    permitted_opens[idx].host_to_connect,
-	    permitted_opens[idx].port_to_connect);
-	if (newport >= 0)  {
-		permitted_opens[idx].listen_port = 
+	    pset->permitted_user[idx].host_to_connect,
+	    pset->permitted_user[idx].port_to_connect);
+	if (newport <= 0)
+		fwd_perm_clear(&pset->permitted_user[idx]);
+	else {
+		pset->permitted_user[idx].listen_port =
 		    (datafellows & SSH_BUG_DYNAMIC_RPORT) ? 0 : newport;
-	} else {
-		permitted_opens[idx].listen_port = 0;
-		permitted_opens[idx].port_to_connect = 0;
-		free(permitted_opens[idx].host_to_connect);
-		permitted_opens[idx].host_to_connect = NULL;
-		free(permitted_opens[idx].listen_host);
-		permitted_opens[idx].listen_host = NULL;
-		free(permitted_opens[idx].listen_path);
-		permitted_opens[idx].listen_path = NULL;
 	}
 }
 
-int
-channel_add_adm_permitted_opens(char *host, int port)
-{
-	debug("config allows port forwarding to host %s port %d", host, port);
-
-	permitted_adm_opens = xreallocarray(permitted_adm_opens,
-	    num_adm_permitted_opens + 1, sizeof(*permitted_adm_opens));
-	permitted_adm_opens[num_adm_permitted_opens].host_to_connect
-	     = xstrdup(host);
-	permitted_adm_opens[num_adm_permitted_opens].port_to_connect = port;
-	permitted_adm_opens[num_adm_permitted_opens].listen_host = NULL;
-	permitted_adm_opens[num_adm_permitted_opens].listen_path = NULL;
-	permitted_adm_opens[num_adm_permitted_opens].listen_port = 0;
-	return ++num_adm_permitted_opens;
-}
-
-void
-channel_disable_adm_local_opens(void)
-{
-	channel_clear_adm_permitted_opens();
-	permitted_adm_opens = xcalloc(sizeof(*permitted_adm_opens), 1);
-	permitted_adm_opens[num_adm_permitted_opens].host_to_connect = NULL;
-	num_adm_permitted_opens = 1;
-}
-
-void
-channel_clear_permitted_opens(void)
-{
-	int i;
-
-	for (i = 0; i < num_permitted_opens; i++) {
-		free(permitted_opens[i].host_to_connect);
-		free(permitted_opens[i].listen_host);
-		free(permitted_opens[i].listen_path);
-	}
-	free(permitted_opens);
-	permitted_opens = NULL;
-	num_permitted_opens = 0;
-}
-
-void
-channel_clear_adm_permitted_opens(void)
-{
-	int i;
-
-	for (i = 0; i < num_adm_permitted_opens; i++) {
-		free(permitted_adm_opens[i].host_to_connect);
-		free(permitted_adm_opens[i].listen_host);
-		free(permitted_adm_opens[i].listen_path);
-	}
-	free(permitted_adm_opens);
-	permitted_adm_opens = NULL;
-	num_adm_permitted_opens = 0;
-}
-
-void
-channel_print_adm_permitted_opens(void)
-{
-	int i;
-
-	printf("permitopen");
-	if (num_adm_permitted_opens == 0) {
-		printf(" any\n");
-		return;
-	}
-	for (i = 0; i < num_adm_permitted_opens; i++)
-		if (permitted_adm_opens[i].host_to_connect == NULL)
-			printf(" none");
-		else
-			printf(" %s:%d", permitted_adm_opens[i].host_to_connect,
-			    permitted_adm_opens[i].port_to_connect);
-	printf("\n");
-}
-
 /* returns port number, FWD_PERMIT_ANY_PORT or -1 on error */
 int
 permitopen_port(const char *p)
@@ -3961,7 +4105,8 @@
 {
 	int sock, saved_errno;
 	struct sockaddr_un *sunaddr;
-	char ntop[NI_MAXHOST], strport[MAXIMUM(NI_MAXSERV,sizeof(sunaddr->sun_path))];
+	char ntop[NI_MAXHOST];
+	char strport[MAXIMUM(NI_MAXSERV, sizeof(sunaddr->sun_path))];
 
 	for (; cctx->ai; cctx->ai = cctx->ai->ai_next) {
 		switch (cctx->ai->ai_family) {
@@ -4027,21 +4172,18 @@
 }
 
 /*
- * Return CONNECTING channel to remote host:port or local socket path,
+ * Return connecting socket to remote host:port or local socket path,
  * passing back the failure reason if appropriate.
  */
-static Channel *
-connect_to_reason(const char *name, int port, char *ctype, char *rname,
-     int *reason, const char **errmsg)
+static int
+connect_to_helper(struct ssh *ssh, const char *name, int port, int socktype,
+    char *ctype, char *rname, struct channel_connect *cctx,
+    int *reason, const char **errmsg)
 {
 	struct addrinfo hints;
 	int gaierr;
 	int sock = -1;
 	char strport[NI_MAXSERV];
-	struct channel_connect cctx;
-	Channel *c;
-
-	memset(&cctx, 0, sizeof(cctx));
 
 	if (port == PORT_STREAMLOCAL) {
 		struct sockaddr_un *sunaddr;
@@ -4049,7 +4191,7 @@
 
 		if (strlen(name) > sizeof(sunaddr->sun_path)) {
 			error("%.100s: %.100s", name, strerror(ENAMETOOLONG));
-			return (NULL);
+			return -1;
 		}
 
 		/*
@@ -4062,18 +4204,18 @@
 		ai->ai_addr = (struct sockaddr *)(ai + 1);
 		ai->ai_addrlen = sizeof(*sunaddr);
 		ai->ai_family = AF_UNIX;
-		ai->ai_socktype = SOCK_STREAM;
+		ai->ai_socktype = socktype;
 		ai->ai_protocol = PF_UNSPEC;
 		sunaddr = (struct sockaddr_un *)ai->ai_addr;
 		sunaddr->sun_family = AF_UNIX;
 		strlcpy(sunaddr->sun_path, name, sizeof(sunaddr->sun_path));
-		cctx.aitop = ai;
+		cctx->aitop = ai;
 	} else {
 		memset(&hints, 0, sizeof(hints));
-		hints.ai_family = IPv4or6;
-		hints.ai_socktype = SOCK_STREAM;
+		hints.ai_family = ssh->chanctxt->IPv4or6;
+		hints.ai_socktype = socktype;
 		snprintf(strport, sizeof strport, "%d", port);
-		if ((gaierr = getaddrinfo(name, strport, &hints, &cctx.aitop))
+		if ((gaierr = getaddrinfo(name, strport, &hints, &cctx->aitop))
 		    != 0) {
 			if (errmsg != NULL)
 				*errmsg = ssh_gai_strerror(gaierr);
@@ -4081,31 +4223,46 @@
 				*reason = SSH2_OPEN_CONNECT_FAILED;
 			error("connect_to %.100s: unknown host (%s)", name,
 			    ssh_gai_strerror(gaierr));
-			return NULL;
+			return -1;
 		}
 	}
 
-	cctx.host = xstrdup(name);
-	cctx.port = port;
-	cctx.ai = cctx.aitop;
+	cctx->host = xstrdup(name);
+	cctx->port = port;
+	cctx->ai = cctx->aitop;
 
-	if ((sock = connect_next(&cctx)) == -1) {
+	if ((sock = connect_next(cctx)) == -1) {
 		error("connect to %.100s port %d failed: %s",
 		    name, port, strerror(errno));
-		channel_connect_ctx_free(&cctx);
-		return NULL;
+		return -1;
 	}
-	c = channel_new(ctype, SSH_CHANNEL_CONNECTING, sock, sock, -1,
-	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
-	c->connect_ctx = cctx;
-	return c;
+
+	return sock;
 }
 
 /* Return CONNECTING channel to remote host:port or local socket path */
 static Channel *
-connect_to(const char *name, int port, char *ctype, char *rname)
+connect_to(struct ssh *ssh, const char *host, int port,
+    char *ctype, char *rname)
 {
-	return connect_to_reason(name, port, ctype, rname, NULL, NULL);
+	struct channel_connect cctx;
+	Channel *c;
+	int sock;
+
+	memset(&cctx, 0, sizeof(cctx));
+	sock = connect_to_helper(ssh, host, port, SOCK_STREAM, ctype, rname,
+	    &cctx, NULL, NULL);
+	if (sock == -1) {
+		channel_connect_ctx_free(&cctx);
+		return NULL;
+	}
+	c = channel_new(ssh, ctype, SSH_CHANNEL_CONNECTING, sock, sock, -1,
+	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
+	c->host_port = port;
+	c->path = xstrdup(host);
+	c->connect_ctx = cctx;
+
+	return c;
 }
 
 /*
@@ -4113,19 +4270,26 @@
  * that needs to deal with this connection.
  */
 Channel *
-channel_connect_by_listen_address(const char *listen_host,
+channel_connect_by_listen_address(struct ssh *ssh, const char *listen_host,
     u_short listen_port, char *ctype, char *rname)
 {
-	int i;
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->local_perms;
+	u_int i;
+	struct permission *perm;
 
-	for (i = 0; i < num_permitted_opens; i++) {
-		if (open_listen_match_tcpip(&permitted_opens[i], listen_host,
-		    listen_port, 1)) {
-			if (permitted_opens[i].downstream)
-				return permitted_opens[i].downstream;
-			return connect_to(
-			    permitted_opens[i].host_to_connect,
-			    permitted_opens[i].port_to_connect, ctype, rname);
+	for (i = 0; i < pset->num_permitted_user; i++) {
+		perm = &pset->permitted_user[i];
+		if (open_listen_match_tcpip(perm,
+		    listen_host, listen_port, 1)) {
+			if (perm->downstream)
+				return perm->downstream;
+			if (perm->port_to_connect == 0)
+				return rdynamic_connect_prepare(ssh,
+				    ctype, rname);
+			return connect_to(ssh,
+			    perm->host_to_connect, perm->port_to_connect,
+			    ctype, rname);
 		}
 	}
 	error("WARNING: Server requests forwarding for unknown listen_port %d",
@@ -4134,15 +4298,20 @@
 }
 
 Channel *
-channel_connect_by_listen_path(const char *path, char *ctype, char *rname)
+channel_connect_by_listen_path(struct ssh *ssh, const char *path,
+    char *ctype, char *rname)
 {
-	int i;
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->local_perms;
+	u_int i;
+	struct permission *perm;
 
-	for (i = 0; i < num_permitted_opens; i++) {
-		if (open_listen_match_streamlocal(&permitted_opens[i], path)) {
-			return connect_to(
-			    permitted_opens[i].host_to_connect,
-			    permitted_opens[i].port_to_connect, ctype, rname);
+	for (i = 0; i < pset->num_permitted_user; i++) {
+		perm = &pset->permitted_user[i];
+		if (open_listen_match_streamlocal(perm, path)) {
+			return connect_to(ssh,
+			    perm->host_to_connect, perm->port_to_connect,
+			    ctype, rname);
 		}
 	}
 	error("WARNING: Server requests forwarding for unknown path %.100s",
@@ -4152,27 +4321,37 @@
 
 /* Check if connecting to that port is permitted and connect. */
 Channel *
-channel_connect_to_port(const char *host, u_short port, char *ctype,
-    char *rname, int *reason, const char **errmsg)
+channel_connect_to_port(struct ssh *ssh, const char *host, u_short port,
+    char *ctype, char *rname, int *reason, const char **errmsg)
 {
-	int i, permit, permit_adm = 1;
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->local_perms;
+	struct channel_connect cctx;
+	Channel *c;
+	u_int i, permit, permit_adm = 1;
+	int sock;
+	struct permission *perm;
 
-	permit = all_opens_permitted;
+	permit = pset->all_permitted;
 	if (!permit) {
-		for (i = 0; i < num_permitted_opens; i++)
-			if (open_match(&permitted_opens[i], host, port)) {
+		for (i = 0; i < pset->num_permitted_user; i++) {
+			perm = &pset->permitted_user[i];
+			if (open_match(perm, host, port)) {
 				permit = 1;
 				break;
 			}
+		}
 	}
 
-	if (num_adm_permitted_opens > 0) {
+	if (pset->num_permitted_admin > 0) {
 		permit_adm = 0;
-		for (i = 0; i < num_adm_permitted_opens; i++)
-			if (open_match(&permitted_adm_opens[i], host, port)) {
+		for (i = 0; i < pset->num_permitted_admin; i++) {
+			perm = &pset->permitted_admin[i];
+			if (open_match(perm, host, port)) {
 				permit_adm = 1;
 				break;
 			}
+		}
 	}
 
 	if (!permit || !permit_adm) {
@@ -4182,31 +4361,54 @@
 			*reason = SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED;
 		return NULL;
 	}
-	return connect_to_reason(host, port, ctype, rname, reason, errmsg);
+
+	memset(&cctx, 0, sizeof(cctx));
+	sock = connect_to_helper(ssh, host, port, SOCK_STREAM, ctype, rname,
+	    &cctx, reason, errmsg);
+	if (sock == -1) {
+		channel_connect_ctx_free(&cctx);
+		return NULL;
+	}
+
+	c = channel_new(ssh, ctype, SSH_CHANNEL_CONNECTING, sock, sock, -1,
+	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
+	c->host_port = port;
+	c->path = xstrdup(host);
+	c->connect_ctx = cctx;
+
+	return c;
 }
 
 /* Check if connecting to that path is permitted and connect. */
 Channel *
-channel_connect_to_path(const char *path, char *ctype, char *rname)
+channel_connect_to_path(struct ssh *ssh, const char *path,
+    char *ctype, char *rname)
 {
-	int i, permit, permit_adm = 1;
+	struct ssh_channels *sc = ssh->chanctxt;
+	struct permission_set *pset = &sc->local_perms;
+	u_int i, permit, permit_adm = 1;
+	struct permission *perm;
 
-	permit = all_opens_permitted;
+	permit = pset->all_permitted;
 	if (!permit) {
-		for (i = 0; i < num_permitted_opens; i++)
-			if (open_match(&permitted_opens[i], path, PORT_STREAMLOCAL)) {
+		for (i = 0; i < pset->num_permitted_user; i++) {
+			perm = &pset->permitted_user[i];
+			if (open_match(perm, path, PORT_STREAMLOCAL)) {
 				permit = 1;
 				break;
 			}
+		}
 	}
 
-	if (num_adm_permitted_opens > 0) {
+	if (pset->num_permitted_admin > 0) {
 		permit_adm = 0;
-		for (i = 0; i < num_adm_permitted_opens; i++)
-			if (open_match(&permitted_adm_opens[i], path, PORT_STREAMLOCAL)) {
+		for (i = 0; i < pset->num_permitted_admin; i++) {
+			perm = &pset->permitted_admin[i];
+			if (open_match(perm, path, PORT_STREAMLOCAL)) {
 				permit_adm = 1;
 				break;
 			}
+		}
 	}
 
 	if (!permit || !permit_adm) {
@@ -4214,30 +4416,82 @@
 		    "but the request was denied.", path);
 		return NULL;
 	}
-	return connect_to(path, PORT_STREAMLOCAL, ctype, rname);
+	return connect_to(ssh, path, PORT_STREAMLOCAL, ctype, rname);
 }
 
 void
-channel_send_window_changes(void)
+channel_send_window_changes(struct ssh *ssh)
 {
-	u_int i;
+	struct ssh_channels *sc = ssh->chanctxt;
 	struct winsize ws;
+	int r;
+	u_int i;
 
-	for (i = 0; i < channels_alloc; i++) {
-		if (channels[i] == NULL || !channels[i]->client_tty ||
-		    channels[i]->type != SSH_CHANNEL_OPEN)
+	for (i = 0; i < sc->channels_alloc; i++) {
+		if (sc->channels[i] == NULL || !sc->channels[i]->client_tty ||
+		    sc->channels[i]->type != SSH_CHANNEL_OPEN)
 			continue;
-		if (ioctl(channels[i]->rfd, TIOCGWINSZ, &ws) < 0)
+		if (ioctl(sc->channels[i]->rfd, TIOCGWINSZ, &ws) < 0)
 			continue;
-		channel_request_start(i, "window-change", 0);
-		packet_put_int((u_int)ws.ws_col);
-		packet_put_int((u_int)ws.ws_row);
-		packet_put_int((u_int)ws.ws_xpixel);
-		packet_put_int((u_int)ws.ws_ypixel);
-		packet_send();
+		channel_request_start(ssh, i, "window-change", 0);
+		if ((r = sshpkt_put_u32(ssh, (u_int)ws.ws_col)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, (u_int)ws.ws_row)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, (u_int)ws.ws_xpixel)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, (u_int)ws.ws_ypixel)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0)
+			fatal("%s: channel %u: send window-change: %s",
+			    __func__, i, ssh_err(r));
 	}
 }
 
+/* Return RDYNAMIC_OPEN channel: channel allows SOCKS, but is not connected */
+static Channel *
+rdynamic_connect_prepare(struct ssh *ssh, char *ctype, char *rname)
+{
+	Channel *c;
+	int r;
+
+	c = channel_new(ssh, ctype, SSH_CHANNEL_RDYNAMIC_OPEN, -1, -1, -1,
+	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
+	c->host_port = 0;
+	c->path = NULL;
+
+	/*
+	 * We need to open the channel before we have a FD,
+	 * so that we can get SOCKS header from peer.
+	 */
+	if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->self)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->local_maxpacket)) != 0) {
+		fatal("%s: channel %i: confirm: %s", __func__,
+		    c->self, ssh_err(r));
+	}
+	return c;
+}
+
+/* Return CONNECTING socket to remote host:port or local socket path */
+static int
+rdynamic_connect_finish(struct ssh *ssh, Channel *c)
+{
+	struct channel_connect cctx;
+	int sock;
+
+	memset(&cctx, 0, sizeof(cctx));
+	sock = connect_to_helper(ssh, c->path, c->host_port, SOCK_STREAM, NULL,
+	    NULL, &cctx, NULL, NULL);
+	if (sock == -1)
+		channel_connect_ctx_free(&cctx);
+	else {
+		/* similar to SSH_CHANNEL_CONNECTING but we've already sent the open */
+		c->type = SSH_CHANNEL_RDYNAMIC_FINISH;
+		c->connect_ctx = cctx;
+		channel_register_fds(ssh, c, sock, sock, -1, 0, 1, 0);
+	}
+	return sock;
+}
+
 /* -- X11 forwarding */
 
 /*
@@ -4246,8 +4500,9 @@
  * stored in display_numberp , or -1 if an error occurs.
  */
 int
-x11_create_display_inet(int x11_display_offset, int x11_use_localhost,
-    int single_connection, u_int *display_numberp, int **chanids)
+x11_create_display_inet(struct ssh *ssh, int x11_display_offset,
+    int x11_use_localhost, int single_connection,
+    u_int *display_numberp, int **chanids)
 {
 	Channel *nc = NULL;
 	int display_number, sock;
@@ -4264,16 +4519,18 @@
 	    display_number++) {
 		port = 6000 + display_number;
 		memset(&hints, 0, sizeof(hints));
-		hints.ai_family = IPv4or6;
+		hints.ai_family = ssh->chanctxt->IPv4or6;
 		hints.ai_flags = x11_use_localhost ? 0: AI_PASSIVE;
 		hints.ai_socktype = SOCK_STREAM;
 		snprintf(strport, sizeof strport, "%d", port);
-		if ((gaierr = getaddrinfo(NULL, strport, &hints, &aitop)) != 0) {
+		if ((gaierr = getaddrinfo(NULL, strport,
+		    &hints, &aitop)) != 0) {
 			error("getaddrinfo: %.100s", ssh_gai_strerror(gaierr));
 			return -1;
 		}
 		for (ai = aitop; ai; ai = ai->ai_next) {
-			if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
+			if (ai->ai_family != AF_INET &&
+			    ai->ai_family != AF_INET6)
 				continue;
 			sock = socket(ai->ai_family, ai->ai_socktype,
 			    ai->ai_protocol);
@@ -4295,14 +4552,13 @@
 			if (ai->ai_family == AF_INET6)
 				sock_set_v6only(sock);
 			if (x11_use_localhost)
-				channel_set_reuseaddr(sock);
+				set_reuseaddr(sock);
 			if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
-				debug2("bind port %d: %.100s", port, strerror(errno));
+				debug2("%s: bind port %d: %.100s", __func__,
+				    port, strerror(errno));
 				close(sock);
-
-				for (n = 0; n < num_socks; n++) {
+				for (n = 0; n < num_socks; n++)
 					close(socks[n]);
-				}
 				num_socks = 0;
 				break;
 			}
@@ -4332,7 +4588,7 @@
 	*chanids = xcalloc(num_socks + 1, sizeof(**chanids));
 	for (n = 0; n < num_socks; n++) {
 		sock = socks[n];
-		nc = channel_new("x11 listener",
+		nc = channel_new(ssh, "x11 listener",
 		    SSH_CHANNEL_X11_LISTENER, sock, sock, -1,
 		    CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
 		    0, "X11 inet listener", 1);
@@ -4343,7 +4599,7 @@
 
 	/* Return the display number for the DISPLAY environment variable. */
 	*display_numberp = display_number;
-	return (0);
+	return 0;
 }
 
 static int
@@ -4373,8 +4629,35 @@
 	return connect_local_xsocket_path(buf);
 }
 
+#ifdef __APPLE__
+static int
+is_path_to_xsocket(const char *display, char *path, size_t pathlen)
+{
+	struct stat sbuf;
+
+	if (strlcpy(path, display, pathlen) >= pathlen) {
+		error("%s: display path too long", __func__);
+		return 0;
+	}
+	if (display[0] != '/')
+		return 0;
+	if (stat(path, &sbuf) == 0) {
+		return 1;
+	} else {
+		char *dot = strrchr(path, '.');
+		if (dot != NULL) {
+			*dot = '\0';
+			if (stat(path, &sbuf) == 0) {
+				return 1;
+			}
+		}
+	}
+	return 0;
+}
+#endif
+
 int
-x11_connect_display(void)
+x11_connect_display(struct ssh *ssh)
 {
 	u_int display_number;
 	const char *display;
@@ -4394,15 +4677,22 @@
 	 * connection to the real X server.
 	 */
 
-	/* Check if the display is from launchd. */
 #ifdef __APPLE__
-	if (strncmp(display, "/tmp/launch", 11) == 0) {
-		sock = connect_local_xsocket_path(display);
-		if (sock < 0)
-			return -1;
+	/* Check if display is a path to a socket (as set by launchd). */
+	{
+		char path[PATH_MAX];
 
-		/* OK, we now have a connection to the display. */
-		return sock;
+		if (is_path_to_xsocket(display, path, sizeof(path))) {
+			debug("x11_connect_display: $DISPLAY is launchd");
+
+			/* Create a socket. */
+			sock = connect_local_xsocket_path(path);
+			if (sock < 0)
+				return -1;
+
+			/* OK, we now have a connection to the display. */
+			return sock;
+		}
 	}
 #endif
 	/*
@@ -4412,9 +4702,10 @@
 	if (strncmp(display, "unix:", 5) == 0 ||
 	    display[0] == ':') {
 		/* Connect to the unix domain socket. */
-		if (sscanf(strrchr(display, ':') + 1, "%u", &display_number) != 1) {
-			error("Could not parse display number from DISPLAY: %.100s",
-			    display);
+		if (sscanf(strrchr(display, ':') + 1, "%u",
+		    &display_number) != 1) {
+			error("Could not parse display number from DISPLAY: "
+			    "%.100s", display);
 			return -1;
 		}
 		/* Create a socket. */
@@ -4436,7 +4727,10 @@
 		return -1;
 	}
 	*cp = 0;
-	/* buf now contains the host name.  But first we parse the display number. */
+	/*
+	 * buf now contains the host name.  But first we parse the
+	 * display number.
+	 */
 	if (sscanf(cp + 1, "%u", &display_number) != 1) {
 		error("Could not parse display number from DISPLAY: %.100s",
 		    display);
@@ -4445,7 +4739,7 @@
 
 	/* Look up the host address */
 	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = IPv4or6;
+	hints.ai_family = ssh->chanctxt->IPv4or6;
 	hints.ai_socktype = SOCK_STREAM;
 	snprintf(strport, sizeof strport, "%u", 6000 + display_number);
 	if ((gaierr = getaddrinfo(buf, strport, &hints, &aitop)) != 0) {
@@ -4472,8 +4766,8 @@
 	}
 	freeaddrinfo(aitop);
 	if (!ai) {
-		error("connect %.100s port %u: %.100s", buf, 6000 + display_number,
-		    strerror(errno));
+		error("connect %.100s port %u: %.100s", buf,
+		    6000 + display_number, strerror(errno));
 		return -1;
 	}
 	set_nodelay(sock);
@@ -4481,98 +4775,24 @@
 }
 
 /*
- * This is called when SSH_SMSG_X11_OPEN is received.  The packet contains
- * the remote channel number.  We should do whatever we want, and respond
- * with either SSH_MSG_OPEN_CONFIRMATION or SSH_MSG_OPEN_FAILURE.
- */
-
-/* ARGSUSED */
-int
-x11_input_open(int type, u_int32_t seq, void *ctxt)
-{
-	Channel *c = NULL;
-	int remote_id, sock = 0;
-	char *remote_host;
-
-	debug("Received X11 open request.");
-
-	remote_id = packet_get_int();
-
-	if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
-		remote_host = packet_get_string(NULL);
-	} else {
-		remote_host = xstrdup("unknown (remote did not supply name)");
-	}
-	packet_check_eom();
-
-	/* Obtain a connection to the real X display. */
-	sock = x11_connect_display();
-	if (sock != -1) {
-		/* Allocate a channel for this connection. */
-		c = channel_new("connected x11 socket",
-		    SSH_CHANNEL_X11_OPEN, sock, sock, -1, 0, 0, 0,
-		    remote_host, 1);
-		c->remote_id = remote_id;
-		c->force_drain = 1;
-	}
-	free(remote_host);
-	if (c == NULL) {
-		/* Send refusal to the remote host. */
-		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
-		packet_put_int(remote_id);
-	} else {
-		/* Send a confirmation to the remote host. */
-		packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
-		packet_put_int(remote_id);
-		packet_put_int(c->self);
-	}
-	packet_send();
-	return 0;
-}
-
-/* dummy protocol handler that denies SSH-1 requests (agent/x11) */
-/* ARGSUSED */
-int
-deny_input_open(int type, u_int32_t seq, void *ctxt)
-{
-	int rchan = packet_get_int();
-
-	switch (type) {
-	case SSH_SMSG_AGENT_OPEN:
-		error("Warning: ssh server tried agent forwarding.");
-		break;
-	case SSH_SMSG_X11_OPEN:
-		error("Warning: ssh server tried X11 forwarding.");
-		break;
-	default:
-		error("deny_input_open: type %d", type);
-		break;
-	}
-	error("Warning: this is probably a break-in attempt by a malicious server.");
-	packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
-	packet_put_int(rchan);
-	packet_send();
-	return 0;
-}
-
-/*
  * Requests forwarding of X11 connections, generates fake authentication
  * data, and enables authentication spoofing.
  * This should be called in the client only.
  */
 void
-x11_request_forwarding_with_spoofing(int client_session_id, const char *disp,
-    const char *proto, const char *data, int want_reply)
+x11_request_forwarding_with_spoofing(struct ssh *ssh, int client_session_id,
+    const char *disp, const char *proto, const char *data, int want_reply)
 {
+	struct ssh_channels *sc = ssh->chanctxt;
 	u_int data_len = (u_int) strlen(data) / 2;
 	u_int i, value;
-	char *new_data;
-	int screen_number;
 	const char *cp;
+	char *new_data;
+	int r, screen_number;
 
-	if (x11_saved_display == NULL)
-		x11_saved_display = xstrdup(disp);
-	else if (strcmp(disp, x11_saved_display) != 0) {
+	if (sc->x11_saved_display == NULL)
+		sc->x11_saved_display = xstrdup(disp);
+	else if (strcmp(disp, sc->x11_saved_display) != 0) {
 		error("x11_request_forwarding_with_spoofing: different "
 		    "$DISPLAY already forwarded");
 		return;
@@ -4586,53 +4806,37 @@
 	else
 		screen_number = 0;
 
-	if (x11_saved_proto == NULL) {
+	if (sc->x11_saved_proto == NULL) {
 		/* Save protocol name. */
-		x11_saved_proto = xstrdup(proto);
+		sc->x11_saved_proto = xstrdup(proto);
 
 		/* Extract real authentication data. */
-		x11_saved_data = xmalloc(data_len);
+		sc->x11_saved_data = xmalloc(data_len);
 		for (i = 0; i < data_len; i++) {
 			if (sscanf(data + 2 * i, "%2x", &value) != 1)
 				fatal("x11_request_forwarding: bad "
 				    "authentication data: %.100s", data);
-			x11_saved_data[i] = value;
+			sc->x11_saved_data[i] = value;
 		}
-		x11_saved_data_len = data_len;
+		sc->x11_saved_data_len = data_len;
 
 		/* Generate fake data of the same length. */
-		x11_fake_data = xmalloc(data_len);
-		arc4random_buf(x11_fake_data, data_len);
-		x11_fake_data_len = data_len;
+		sc->x11_fake_data = xmalloc(data_len);
+		arc4random_buf(sc->x11_fake_data, data_len);
+		sc->x11_fake_data_len = data_len;
 	}
 
 	/* Convert the fake data into hex. */
-	new_data = tohex(x11_fake_data, data_len);
+	new_data = tohex(sc->x11_fake_data, data_len);
 
 	/* Send the request packet. */
-	if (compat20) {
-		channel_request_start(client_session_id, "x11-req", want_reply);
-		packet_put_char(0);	/* XXX bool single connection */
-	} else {
-		packet_start(SSH_CMSG_X11_REQUEST_FORWARDING);
-	}
-	packet_put_cstring(proto);
-	packet_put_cstring(new_data);
-	packet_put_int(screen_number);
-	packet_send();
-	packet_write_wait();
+	channel_request_start(ssh, client_session_id, "x11-req", want_reply);
+	if ((r = sshpkt_put_u8(ssh, 0)) != 0 || /* bool: single connection */
+	    (r = sshpkt_put_cstring(ssh, proto)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, new_data)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, screen_number)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0 ||
+	    (r = ssh_packet_write_wait(ssh)) != 0)
+		fatal("%s: send x11-req: %s", __func__, ssh_err(r));
 	free(new_data);
 }
-
-
-/* -- agent forwarding */
-
-/* Sends a message to the server to request authentication fd forwarding. */
-
-void
-auth_request_forwarding(void)
-{
-	packet_start(SSH_CMSG_AGENT_REQUEST_FORWARDING);
-	packet_send();
-	packet_write_wait();
-}
diff --git a/channels.h b/channels.h
index ce43236..1aeafe9 100644
--- a/channels.h
+++ b/channels.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.h,v 1.121 2017/02/01 02:59:09 dtucker Exp $ */
+/* $OpenBSD: channels.h,v 1.131 2018/06/06 18:22:41 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -46,8 +46,6 @@
 #define SSH_CHANNEL_CLOSED		5	/* waiting for close confirmation */
 #define SSH_CHANNEL_AUTH_SOCKET		6	/* authentication socket */
 #define SSH_CHANNEL_X11_OPEN		7	/* reading first X11 packet */
-#define SSH_CHANNEL_INPUT_DRAINING	8	/* sending remaining data to conn */
-#define SSH_CHANNEL_OUTPUT_DRAINING	9	/* sending remaining data to app */
 #define SSH_CHANNEL_LARVAL		10	/* larval session */
 #define SSH_CHANNEL_RPORT_LISTENER	11	/* Listening to a R-style port  */
 #define SSH_CHANNEL_CONNECTING		12
@@ -59,22 +57,36 @@
 #define SSH_CHANNEL_UNIX_LISTENER	18	/* Listening on a domain socket. */
 #define SSH_CHANNEL_RUNIX_LISTENER	19	/* Listening to a R-style domain socket. */
 #define SSH_CHANNEL_MUX_PROXY		20	/* proxy channel for mux-slave */
-#define SSH_CHANNEL_MAX_TYPE		21
+#define SSH_CHANNEL_RDYNAMIC_OPEN	21	/* reverse SOCKS, parsing request */
+#define SSH_CHANNEL_RDYNAMIC_FINISH	22	/* reverse SOCKS, finishing connect */
+#define SSH_CHANNEL_MAX_TYPE		23
 
 #define CHANNEL_CANCEL_PORT_STATIC	-1
 
+/* TCP forwarding */
+#define FORWARD_DENY		0
+#define FORWARD_REMOTE		(1)
+#define FORWARD_LOCAL		(1<<1)
+#define FORWARD_ALLOW		(FORWARD_REMOTE|FORWARD_LOCAL)
+
+#define FORWARD_ADM		0x100
+#define FORWARD_USER		0x101
+
+struct ssh;
 struct Channel;
 typedef struct Channel Channel;
+struct fwd_perm_list;
 
-typedef void channel_open_fn(int, int, void *);
-typedef void channel_callback_fn(int, void *);
-typedef int channel_infilter_fn(struct Channel *, char *, int);
-typedef void channel_filter_cleanup_fn(int, void *);
-typedef u_char *channel_outfilter_fn(struct Channel *, u_char **, u_int *);
+typedef void channel_open_fn(struct ssh *, int, int, void *);
+typedef void channel_callback_fn(struct ssh *, int, void *);
+typedef int channel_infilter_fn(struct ssh *, struct Channel *, char *, int);
+typedef void channel_filter_cleanup_fn(struct ssh *, int, void *);
+typedef u_char *channel_outfilter_fn(struct ssh *, struct Channel *,
+    u_char **, size_t *);
 
 /* Channel success/failure callbacks */
-typedef void channel_confirm_cb(int, struct Channel *, void *);
-typedef void channel_confirm_abandon_cb(struct Channel *, void *);
+typedef void channel_confirm_cb(struct ssh *, int, struct Channel *, void *);
+typedef void channel_confirm_abandon_cb(struct ssh *, struct Channel *, void *);
 struct channel_confirm {
 	TAILQ_ENTRY(channel_confirm) entry;
 	channel_confirm_cb *cb;
@@ -91,12 +103,14 @@
 };
 
 /* Callbacks for mux channels back into client-specific code */
-typedef int mux_callback_fn(struct Channel *);
+typedef int mux_callback_fn(struct ssh *, struct Channel *);
 
 struct Channel {
 	int     type;		/* channel type/state */
 	int     self;		/* my own channel identifier */
-	int     remote_id;	/* channel identifier for remote peer */
+	uint32_t remote_id;	/* channel identifier for remote peer */
+	int	have_remote_id;	/* non-zero if remote_id is valid */
+
 	u_int   istate;		/* input from channel (state of receive half) */
 	u_int   ostate;		/* output to channel  (state of transmit half) */
 	int     flags;		/* close sent/rcvd */
@@ -117,11 +131,12 @@
 				 * to a matching pre-select handler.
 				 * this way post-select handlers are not
 				 * accidentally called if a FD gets reused */
-	Buffer  input;		/* data read from socket, to be sent over
+	struct sshbuf *input;	/* data read from socket, to be sent over
 				 * encrypted connection */
-	Buffer  output;		/* data received over encrypted connection for
+	struct sshbuf *output;	/* data received over encrypted connection for
 				 * send on socket */
-	Buffer  extended;
+	struct sshbuf *extended;
+
 	char    *path;
 		/* path for unix domain sockets, or host name for forwards */
 	int     listening_port;	/* port being listened for forwards */
@@ -157,6 +172,7 @@
 	int     		datagram;
 
 	/* non-blocking connect */
+	/* XXX make this a pointer so the structure can be opaque */
 	struct channel_connect	connect_ctx;
 
 	/* multiplexing protocol hook, called for each packet received */
@@ -196,128 +212,132 @@
 #define CHAN_EOF_RCVD			0x08
 #define CHAN_LOCAL			0x10
 
-#define CHAN_RBUF	16*1024
+/* Read buffer size */
+#define CHAN_RBUF	(16*1024)
+
+/* Hard limit on number of channels */
+#define CHANNELS_MAX_CHANNELS	(16*1024)
 
 /* check whether 'efd' is still in use */
 #define CHANNEL_EFD_INPUT_ACTIVE(c) \
-	(compat20 && c->extended_usage == CHAN_EXTENDED_READ && \
+	(c->extended_usage == CHAN_EXTENDED_READ && \
 	(c->efd != -1 || \
-	buffer_len(&c->extended) > 0))
+	sshbuf_len(c->extended) > 0))
 #define CHANNEL_EFD_OUTPUT_ACTIVE(c) \
-	(compat20 && c->extended_usage == CHAN_EXTENDED_WRITE && \
+	(c->extended_usage == CHAN_EXTENDED_WRITE && \
 	c->efd != -1 && (!(c->flags & (CHAN_EOF_RCVD|CHAN_CLOSE_RCVD)) || \
-	buffer_len(&c->extended) > 0))
+	sshbuf_len(c->extended) > 0))
+
+/* Add channel management structures to SSH transport instance */
+void channel_init_channels(struct ssh *ssh);
 
 /* channel management */
 
-Channel	*channel_by_id(int);
-Channel	*channel_by_remote_id(int);
-Channel	*channel_lookup(int);
-Channel *channel_new(char *, int, int, int, int, u_int, u_int, int, char *, int);
-void	 channel_set_fds(int, int, int, int, int, int, int, u_int);
-void	 channel_free(Channel *);
-void	 channel_free_all(void);
-void	 channel_stop_listening(void);
+Channel	*channel_by_id(struct ssh *, int);
+Channel	*channel_by_remote_id(struct ssh *, u_int);
+Channel	*channel_lookup(struct ssh *, int);
+Channel *channel_new(struct ssh *, char *, int, int, int, int,
+	    u_int, u_int, int, char *, int);
+void	 channel_set_fds(struct ssh *, int, int, int, int, int,
+	    int, int, u_int);
+void	 channel_free(struct ssh *, Channel *);
+void	 channel_free_all(struct ssh *);
+void	 channel_stop_listening(struct ssh *);
 
-void	 channel_send_open(int);
-void	 channel_request_start(int, char *, int);
-void	 channel_register_cleanup(int, channel_callback_fn *, int);
-void	 channel_register_open_confirm(int, channel_open_fn *, void *);
-void	 channel_register_filter(int, channel_infilter_fn *,
-    channel_outfilter_fn *, channel_filter_cleanup_fn *, void *);
-void	 channel_register_status_confirm(int, channel_confirm_cb *,
-    channel_confirm_abandon_cb *, void *);
-void	 channel_cancel_cleanup(int);
-int	 channel_close_fd(int *);
-void	 channel_send_window_changes(void);
+void	 channel_send_open(struct ssh *, int);
+void	 channel_request_start(struct ssh *, int, char *, int);
+void	 channel_register_cleanup(struct ssh *, int,
+	    channel_callback_fn *, int);
+void	 channel_register_open_confirm(struct ssh *, int,
+	    channel_open_fn *, void *);
+void	 channel_register_filter(struct ssh *, int, channel_infilter_fn *,
+	    channel_outfilter_fn *, channel_filter_cleanup_fn *, void *);
+void	 channel_register_status_confirm(struct ssh *, int,
+	    channel_confirm_cb *, channel_confirm_abandon_cb *, void *);
+void	 channel_cancel_cleanup(struct ssh *, int);
+int	 channel_close_fd(struct ssh *, int *);
+void	 channel_send_window_changes(struct ssh *);
 
 /* mux proxy support */
 
-int	 channel_proxy_downstream(Channel *mc);
-int	 channel_proxy_upstream(Channel *, int, u_int32_t, void *);
+int	 channel_proxy_downstream(struct ssh *, Channel *mc);
+int	 channel_proxy_upstream(Channel *, int, u_int32_t, struct ssh *);
 
 /* protocol handler */
 
-int	 channel_input_close(int, u_int32_t, void *);
-int	 channel_input_close_confirmation(int, u_int32_t, void *);
-int	 channel_input_data(int, u_int32_t, void *);
-int	 channel_input_extended_data(int, u_int32_t, void *);
-int	 channel_input_ieof(int, u_int32_t, void *);
-int	 channel_input_oclose(int, u_int32_t, void *);
-int	 channel_input_open_confirmation(int, u_int32_t, void *);
-int	 channel_input_open_failure(int, u_int32_t, void *);
-int	 channel_input_port_open(int, u_int32_t, void *);
-int	 channel_input_window_adjust(int, u_int32_t, void *);
-int	 channel_input_status_confirm(int, u_int32_t, void *);
+int	 channel_input_data(int, u_int32_t, struct ssh *);
+int	 channel_input_extended_data(int, u_int32_t, struct ssh *);
+int	 channel_input_ieof(int, u_int32_t, struct ssh *);
+int	 channel_input_oclose(int, u_int32_t, struct ssh *);
+int	 channel_input_open_confirmation(int, u_int32_t, struct ssh *);
+int	 channel_input_open_failure(int, u_int32_t, struct ssh *);
+int	 channel_input_port_open(int, u_int32_t, struct ssh *);
+int	 channel_input_window_adjust(int, u_int32_t, struct ssh *);
+int	 channel_input_status_confirm(int, u_int32_t, struct ssh *);
 
 /* file descriptor handling (read/write) */
 
-void	 channel_prepare_select(fd_set **, fd_set **, int *, u_int*,
-	     time_t*, int);
-void     channel_after_select(fd_set *, fd_set *);
-void     channel_output_poll(void);
+void	 channel_prepare_select(struct ssh *, fd_set **, fd_set **, int *,
+	     u_int*, time_t*);
+void     channel_after_select(struct ssh *, fd_set *, fd_set *);
+void     channel_output_poll(struct ssh *);
 
-int      channel_not_very_much_buffered_data(void);
-void     channel_close_all(void);
-int      channel_still_open(void);
-char	*channel_open_message(void);
-int	 channel_find_open(void);
+int      channel_not_very_much_buffered_data(struct ssh *);
+void     channel_close_all(struct ssh *);
+int      channel_still_open(struct ssh *);
+char	*channel_open_message(struct ssh *);
+int	 channel_find_open(struct ssh *);
 
 /* tcp forwarding */
 struct Forward;
 struct ForwardOptions;
-void	 channel_set_af(int af);
-void     channel_permit_all_opens(void);
-void	 channel_add_permitted_opens(char *, int);
-int	 channel_add_adm_permitted_opens(char *, int);
-void	 channel_disable_adm_local_opens(void);
-void	 channel_update_permitted_opens(int, int);
-void	 channel_clear_permitted_opens(void);
-void	 channel_clear_adm_permitted_opens(void);
-void 	 channel_print_adm_permitted_opens(void);
-Channel	*channel_connect_to_port(const char *, u_short, char *, char *, int *,
-	     const char **);
-Channel *channel_connect_to_path(const char *, char *, char *);
-Channel	*channel_connect_stdio_fwd(const char*, u_short, int, int);
-Channel	*channel_connect_by_listen_address(const char *, u_short,
-	     char *, char *);
-Channel	*channel_connect_by_listen_path(const char *, char *, char *);
-int	 channel_request_remote_forwarding(struct Forward *);
-int	 channel_setup_local_fwd_listener(struct Forward *, struct ForwardOptions *);
-int	 channel_request_rforward_cancel(struct Forward *);
-int	 channel_setup_remote_fwd_listener(struct Forward *, int *, struct ForwardOptions *);
-int	 channel_cancel_rport_listener(struct Forward *);
-int	 channel_cancel_lport_listener(struct Forward *, int, struct ForwardOptions *);
+void	 channel_set_af(struct ssh *, int af);
+void     channel_permit_all(struct ssh *, int);
+void	 channel_add_permission(struct ssh *, int, int, char *, int);
+void	 channel_clear_permission(struct ssh *, int, int);
+void	 channel_disable_admin(struct ssh *, int);
+void	 channel_update_permission(struct ssh *, int, int);
+Channel	*channel_connect_to_port(struct ssh *, const char *, u_short,
+	    char *, char *, int *, const char **);
+Channel *channel_connect_to_path(struct ssh *, const char *, char *, char *);
+Channel	*channel_connect_stdio_fwd(struct ssh *, const char*,
+	    u_short, int, int);
+Channel	*channel_connect_by_listen_address(struct ssh *, const char *,
+	    u_short, char *, char *);
+Channel	*channel_connect_by_listen_path(struct ssh *, const char *,
+	    char *, char *);
+int	 channel_request_remote_forwarding(struct ssh *, struct Forward *);
+int	 channel_setup_local_fwd_listener(struct ssh *, struct Forward *,
+	    struct ForwardOptions *);
+int	 channel_request_rforward_cancel(struct ssh *, struct Forward *);
+int	 channel_setup_remote_fwd_listener(struct ssh *, struct Forward *,
+	    int *, struct ForwardOptions *);
+int	 channel_cancel_rport_listener(struct ssh *, struct Forward *);
+int	 channel_cancel_lport_listener(struct ssh *, struct Forward *,
+	    int, struct ForwardOptions *);
 int	 permitopen_port(const char *);
 
 /* x11 forwarding */
 
-void	 channel_set_x11_refuse_time(u_int);
-int	 x11_connect_display(void);
-int	 x11_create_display_inet(int, int, int, u_int *, int **);
-int      x11_input_open(int, u_int32_t, void *);
-void	 x11_request_forwarding_with_spoofing(int, const char *, const char *,
-	     const char *, int);
-int	 deny_input_open(int, u_int32_t, void *);
-
-/* agent forwarding */
-
-void	 auth_request_forwarding(void);
+void	 channel_set_x11_refuse_time(struct ssh *, u_int);
+int	 x11_connect_display(struct ssh *);
+int	 x11_create_display_inet(struct ssh *, int, int, int, u_int *, int **);
+void	 x11_request_forwarding_with_spoofing(struct ssh *, int,
+	    const char *, const char *, const char *, int);
 
 /* channel close */
 
-int	 chan_is_dead(Channel *, int);
-void	 chan_mark_dead(Channel *);
+int	 chan_is_dead(struct ssh *, Channel *, int);
+void	 chan_mark_dead(struct ssh *, Channel *);
 
 /* channel events */
 
-void	 chan_rcvd_oclose(Channel *);
-void	 chan_rcvd_eow(Channel *);	/* SSH2-only */
-void	 chan_read_failed(Channel *);
-void	 chan_ibuf_empty(Channel *);
-
-void	 chan_rcvd_ieof(Channel *);
-void	 chan_write_failed(Channel *);
-void	 chan_obuf_empty(Channel *);
+void	 chan_rcvd_oclose(struct ssh *, Channel *);
+void	 chan_rcvd_eow(struct ssh *, Channel *);
+void	 chan_read_failed(struct ssh *, Channel *);
+void	 chan_ibuf_empty(struct ssh *, Channel *);
+void	 chan_rcvd_ieof(struct ssh *, Channel *);
+void	 chan_write_failed(struct ssh *, Channel *);
+void	 chan_obuf_empty(struct ssh *, Channel *);
 
 #endif
diff --git a/cipher-3des1.c b/cipher-3des1.c
deleted file mode 100644
index 9fcc278..0000000
--- a/cipher-3des1.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/* $OpenBSD: cipher-3des1.c,v 1.12 2015/01/14 10:24:42 markus Exp $ */
-/*
- * Copyright (c) 2003 Markus Friedl.  All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "includes.h"
-
-#ifdef WITH_SSH1
-
-#include <sys/types.h>
-#include <string.h>
-#include <openssl/evp.h>
-
-#include "ssherr.h"
-
-/*
- * This is used by SSH1:
- *
- * What kind of triple DES are these 2 routines?
- *
- * Why is there a redundant initialization vector?
- *
- * If only iv3 was used, then, this would till effect have been
- * outer-cbc. However, there is also a private iv1 == iv2 which
- * perhaps makes differential analysis easier. On the other hand, the
- * private iv1 probably makes the CRC-32 attack ineffective. This is a
- * result of that there is no longer any known iv1 to use when
- * choosing the X block.
- */
-struct ssh1_3des_ctx
-{
-	EVP_CIPHER_CTX	k1, k2, k3;
-};
-
-const EVP_CIPHER * evp_ssh1_3des(void);
-int ssh1_3des_iv(EVP_CIPHER_CTX *, int, u_char *, int);
-
-static int
-ssh1_3des_init(EVP_CIPHER_CTX *ctx, const u_char *key, const u_char *iv,
-    int enc)
-{
-	struct ssh1_3des_ctx *c;
-	u_char *k1, *k2, *k3;
-
-	if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL) {
-		if ((c = calloc(1, sizeof(*c))) == NULL)
-			return 0;
-		EVP_CIPHER_CTX_set_app_data(ctx, c);
-	}
-	if (key == NULL)
-		return 1;
-	if (enc == -1)
-		enc = ctx->encrypt;
-	k1 = k2 = k3 = (u_char *) key;
-	k2 += 8;
-	if (EVP_CIPHER_CTX_key_length(ctx) >= 16+8) {
-		if (enc)
-			k3 += 16;
-		else
-			k1 += 16;
-	}
-	EVP_CIPHER_CTX_init(&c->k1);
-	EVP_CIPHER_CTX_init(&c->k2);
-	EVP_CIPHER_CTX_init(&c->k3);
-	if (EVP_CipherInit(&c->k1, EVP_des_cbc(), k1, NULL, enc) == 0 ||
-	    EVP_CipherInit(&c->k2, EVP_des_cbc(), k2, NULL, !enc) == 0 ||
-	    EVP_CipherInit(&c->k3, EVP_des_cbc(), k3, NULL, enc) == 0) {
-		explicit_bzero(c, sizeof(*c));
-		free(c);
-		EVP_CIPHER_CTX_set_app_data(ctx, NULL);
-		return 0;
-	}
-	return 1;
-}
-
-static int
-ssh1_3des_cbc(EVP_CIPHER_CTX *ctx, u_char *dest, const u_char *src, size_t len)
-{
-	struct ssh1_3des_ctx *c;
-
-	if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL)
-		return 0;
-	if (EVP_Cipher(&c->k1, dest, (u_char *)src, len) == 0 ||
-	    EVP_Cipher(&c->k2, dest, dest, len) == 0 ||
-	    EVP_Cipher(&c->k3, dest, dest, len) == 0)
-		return 0;
-	return 1;
-}
-
-static int
-ssh1_3des_cleanup(EVP_CIPHER_CTX *ctx)
-{
-	struct ssh1_3des_ctx *c;
-
-	if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) {
-		EVP_CIPHER_CTX_cleanup(&c->k1);
-		EVP_CIPHER_CTX_cleanup(&c->k2);
-		EVP_CIPHER_CTX_cleanup(&c->k3);
-		explicit_bzero(c, sizeof(*c));
-		free(c);
-		EVP_CIPHER_CTX_set_app_data(ctx, NULL);
-	}
-	return 1;
-}
-
-int
-ssh1_3des_iv(EVP_CIPHER_CTX *evp, int doset, u_char *iv, int len)
-{
-	struct ssh1_3des_ctx *c;
-
-	if (len != 24)
-		return SSH_ERR_INVALID_ARGUMENT;
-	if ((c = EVP_CIPHER_CTX_get_app_data(evp)) == NULL)
-		return SSH_ERR_INTERNAL_ERROR;
-	if (doset) {
-		memcpy(c->k1.iv, iv, 8);
-		memcpy(c->k2.iv, iv + 8, 8);
-		memcpy(c->k3.iv, iv + 16, 8);
-	} else {
-		memcpy(iv, c->k1.iv, 8);
-		memcpy(iv + 8, c->k2.iv, 8);
-		memcpy(iv + 16, c->k3.iv, 8);
-	}
-	return 0;
-}
-
-const EVP_CIPHER *
-evp_ssh1_3des(void)
-{
-	static EVP_CIPHER ssh1_3des;
-
-	memset(&ssh1_3des, 0, sizeof(ssh1_3des));
-	ssh1_3des.nid = NID_undef;
-	ssh1_3des.block_size = 8;
-	ssh1_3des.iv_len = 0;
-	ssh1_3des.key_len = 16;
-	ssh1_3des.init = ssh1_3des_init;
-	ssh1_3des.cleanup = ssh1_3des_cleanup;
-	ssh1_3des.do_cipher = ssh1_3des_cbc;
-	ssh1_3des.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH;
-	return &ssh1_3des;
-}
-#endif /* WITH_SSH1 */
diff --git a/cipher-bf1.c b/cipher-bf1.c
deleted file mode 100644
index c205b07..0000000
--- a/cipher-bf1.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* $OpenBSD: cipher-bf1.c,v 1.7 2015/01/14 10:24:42 markus Exp $ */
-/*
- * Copyright (c) 2003 Markus Friedl.  All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "includes.h"
-
-#ifdef WITH_SSH1
-#if defined(WITH_OPENSSL) && !defined(OPENSSL_NO_BF)
-
-#include <sys/types.h>
-
-#include <stdarg.h>
-#include <string.h>
-
-#include <openssl/evp.h>
-
-#include "openbsd-compat/openssl-compat.h"
-
-/*
- * SSH1 uses a variation on Blowfish, all bytes must be swapped before
- * and after encryption/decryption. Thus the swap_bytes stuff (yuk).
- */
-
-const EVP_CIPHER * evp_ssh1_bf(void);
-
-static void
-swap_bytes(const u_char *src, u_char *dst, int n)
-{
-	u_char c[4];
-
-	/* Process 4 bytes every lap. */
-	for (n = n / 4; n > 0; n--) {
-		c[3] = *src++;
-		c[2] = *src++;
-		c[1] = *src++;
-		c[0] = *src++;
-
-		*dst++ = c[0];
-		*dst++ = c[1];
-		*dst++ = c[2];
-		*dst++ = c[3];
-	}
-}
-
-#ifdef SSH_OLD_EVP
-static void bf_ssh1_init (EVP_CIPHER_CTX * ctx, const unsigned char *key,
-			  const unsigned char *iv, int enc)
-{
-	if (iv != NULL)
-		memcpy (&(ctx->oiv[0]), iv, 8);
-	memcpy (&(ctx->iv[0]), &(ctx->oiv[0]), 8);
-	if (key != NULL)
-		BF_set_key (&(ctx->c.bf_ks), EVP_CIPHER_CTX_key_length (ctx),
-			    key);
-}
-#endif
-
-static int (*orig_bf)(EVP_CIPHER_CTX *, u_char *,
-    const u_char *, LIBCRYPTO_EVP_INL_TYPE) = NULL;
-
-static int
-bf_ssh1_cipher(EVP_CIPHER_CTX *ctx, u_char *out, const u_char *in,
-    LIBCRYPTO_EVP_INL_TYPE len)
-{
-	int ret;
-
-	swap_bytes(in, out, len);
-	ret = (*orig_bf)(ctx, out, out, len);
-	swap_bytes(out, out, len);
-	return (ret);
-}
-
-const EVP_CIPHER *
-evp_ssh1_bf(void)
-{
-	static EVP_CIPHER ssh1_bf;
-
-	memcpy(&ssh1_bf, EVP_bf_cbc(), sizeof(EVP_CIPHER));
-	orig_bf = ssh1_bf.do_cipher;
-	ssh1_bf.nid = NID_undef;
-#ifdef SSH_OLD_EVP
-	ssh1_bf.init = bf_ssh1_init;
-#endif
-	ssh1_bf.do_cipher = bf_ssh1_cipher;
-	ssh1_bf.key_len = 32;
-	return (&ssh1_bf);
-}
-#endif /* defined(WITH_OPENSSL) && !defined(OPENSSL_NO_BF) */
-
-#endif /* WITH_SSH1 */
diff --git a/cipher.c b/cipher.c
index 2def333..a72682a 100644
--- a/cipher.c
+++ b/cipher.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cipher.c,v 1.102 2016/08/03 05:41:57 djm Exp $ */
+/* $OpenBSD: cipher.c,v 1.111 2018/02/23 15:58:37 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -51,11 +51,6 @@
 
 #include "openbsd-compat/openssl-compat.h"
 
-#ifdef WITH_SSH1
-extern const EVP_CIPHER *evp_ssh1_bf(void);
-extern const EVP_CIPHER *evp_ssh1_3des(void);
-extern int ssh1_3des_iv(EVP_CIPHER_CTX *, int, u_char *, int);
-#endif
 
 struct sshcipher_ctx {
 	int	plaintext;
@@ -68,17 +63,16 @@
 
 struct sshcipher {
 	char	*name;
-	int	number;		/* for ssh1 only */
 	u_int	block_size;
 	u_int	key_len;
 	u_int	iv_len;		/* defaults to block_size */
 	u_int	auth_len;
-	u_int	discard_len;
 	u_int	flags;
 #define CFLAG_CBC		(1<<0)
 #define CFLAG_CHACHAPOLY	(1<<1)
 #define CFLAG_AESCTR		(1<<2)
 #define CFLAG_NONE		(1<<3)
+#define CFLAG_INTERNAL		CFLAG_NONE /* Don't use "none" for packets */
 #ifdef WITH_OPENSSL
 	const EVP_CIPHER	*(*evptype)(void);
 #else
@@ -87,53 +81,34 @@
 };
 
 static const struct sshcipher ciphers[] = {
-#ifdef WITH_SSH1
-	{ "des",	SSH_CIPHER_DES, 8, 8, 0, 0, 0, 1, EVP_des_cbc },
-	{ "3des",	SSH_CIPHER_3DES, 8, 16, 0, 0, 0, 1, evp_ssh1_3des },
-# ifndef OPENSSL_NO_BF
-	{ "blowfish",	SSH_CIPHER_BLOWFISH, 8, 32, 0, 0, 0, 1, evp_ssh1_bf },
-# endif /* OPENSSL_NO_BF */
-#endif /* WITH_SSH1 */
 #ifdef WITH_OPENSSL
-	{ "none",	SSH_CIPHER_NONE, 8, 0, 0, 0, 0, 0, EVP_enc_null },
-	{ "3des-cbc",	SSH_CIPHER_SSH2, 8, 24, 0, 0, 0, 1, EVP_des_ede3_cbc },
-# ifndef OPENSSL_NO_BF
-	{ "blowfish-cbc",
-			SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 1, EVP_bf_cbc },
-# endif /* OPENSSL_NO_BF */
-# ifndef OPENSSL_NO_CAST
-	{ "cast128-cbc",
-			SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 1, EVP_cast5_cbc },
-# endif /* OPENSSL_NO_CAST */
-# ifndef OPENSSL_NO_RC4
-	{ "arcfour",	SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 0, EVP_rc4 },
-	{ "arcfour128",	SSH_CIPHER_SSH2, 8, 16, 0, 0, 1536, 0, EVP_rc4 },
-	{ "arcfour256",	SSH_CIPHER_SSH2, 8, 32, 0, 0, 1536, 0, EVP_rc4 },
-# endif /* OPENSSL_NO_RC4 */
-	{ "aes128-cbc",	SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, 1, EVP_aes_128_cbc },
-	{ "aes192-cbc",	SSH_CIPHER_SSH2, 16, 24, 0, 0, 0, 1, EVP_aes_192_cbc },
-	{ "aes256-cbc",	SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 1, EVP_aes_256_cbc },
+#ifndef OPENSSL_NO_DES
+	{ "3des-cbc",		8, 24, 0, 0, CFLAG_CBC, EVP_des_ede3_cbc },
+#endif
+	{ "aes128-cbc",		16, 16, 0, 0, CFLAG_CBC, EVP_aes_128_cbc },
+	{ "aes192-cbc",		16, 24, 0, 0, CFLAG_CBC, EVP_aes_192_cbc },
+	{ "aes256-cbc",		16, 32, 0, 0, CFLAG_CBC, EVP_aes_256_cbc },
 	{ "rijndael-cbc@lysator.liu.se",
-			SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 1, EVP_aes_256_cbc },
-	{ "aes128-ctr",	SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, 0, EVP_aes_128_ctr },
-	{ "aes192-ctr",	SSH_CIPHER_SSH2, 16, 24, 0, 0, 0, 0, EVP_aes_192_ctr },
-	{ "aes256-ctr",	SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 0, EVP_aes_256_ctr },
+				16, 32, 0, 0, CFLAG_CBC, EVP_aes_256_cbc },
+	{ "aes128-ctr",		16, 16, 0, 0, 0, EVP_aes_128_ctr },
+	{ "aes192-ctr",		16, 24, 0, 0, 0, EVP_aes_192_ctr },
+	{ "aes256-ctr",		16, 32, 0, 0, 0, EVP_aes_256_ctr },
 # ifdef OPENSSL_HAVE_EVPGCM
 	{ "aes128-gcm@openssh.com",
-			SSH_CIPHER_SSH2, 16, 16, 12, 16, 0, 0, EVP_aes_128_gcm },
+				16, 16, 12, 16, 0, EVP_aes_128_gcm },
 	{ "aes256-gcm@openssh.com",
-			SSH_CIPHER_SSH2, 16, 32, 12, 16, 0, 0, EVP_aes_256_gcm },
+				16, 32, 12, 16, 0, EVP_aes_256_gcm },
 # endif /* OPENSSL_HAVE_EVPGCM */
-#else /* WITH_OPENSSL */
-	{ "aes128-ctr",	SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, CFLAG_AESCTR, NULL },
-	{ "aes192-ctr",	SSH_CIPHER_SSH2, 16, 24, 0, 0, 0, CFLAG_AESCTR, NULL },
-	{ "aes256-ctr",	SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, CFLAG_AESCTR, NULL },
-	{ "none",	SSH_CIPHER_NONE, 8, 0, 0, 0, 0, CFLAG_NONE, NULL },
-#endif /* WITH_OPENSSL */
+#else
+	{ "aes128-ctr",		16, 16, 0, 0, CFLAG_AESCTR, NULL },
+	{ "aes192-ctr",		16, 24, 0, 0, CFLAG_AESCTR, NULL },
+	{ "aes256-ctr",		16, 32, 0, 0, CFLAG_AESCTR, NULL },
+#endif
 	{ "chacha20-poly1305@openssh.com",
-			SSH_CIPHER_SSH2, 8, 64, 0, 16, 0, CFLAG_CHACHAPOLY, NULL },
+				8, 64, 0, 16, CFLAG_CHACHAPOLY, NULL },
+	{ "none",		8, 0, 0, 0, CFLAG_NONE, NULL },
 
-	{ NULL,		SSH_CIPHER_INVALID, 0, 0, 0, 0, 0, 0, NULL }
+	{ NULL,			0, 0, 0, 0, 0, NULL }
 };
 
 /*--*/
@@ -147,7 +122,7 @@
 	const struct sshcipher *c;
 
 	for (c = ciphers; c->name != NULL; c++) {
-		if (c->number != SSH_CIPHER_SSH2)
+		if ((c->flags & CFLAG_INTERNAL) != 0)
 			continue;
 		if (auth_only && c->auth_len == 0)
 			continue;
@@ -203,12 +178,6 @@
 }
 
 u_int
-cipher_get_number(const struct sshcipher *c)
-{
-	return (c->number);
-}
-
-u_int
 cipher_is_cbc(const struct sshcipher *c)
 {
 	return (c->flags & CFLAG_CBC) != 0;
@@ -220,24 +189,6 @@
 	return cc->plaintext;
 }
 
-u_int
-cipher_ctx_get_number(struct sshcipher_ctx *cc)
-{
-	return cc->cipher->number;
-}
-
-u_int
-cipher_mask_ssh1(int client)
-{
-	u_int mask = 0;
-	mask |= 1 << SSH_CIPHER_3DES;		/* Mandatory */
-	mask |= 1 << SSH_CIPHER_BLOWFISH;
-	if (client) {
-		mask |= 1 << SSH_CIPHER_DES;
-	}
-	return mask;
-}
-
 const struct sshcipher *
 cipher_by_name(const char *name)
 {
@@ -248,16 +199,6 @@
 	return NULL;
 }
 
-const struct sshcipher *
-cipher_by_number(int id)
-{
-	const struct sshcipher *c;
-	for (c = ciphers; c->name != NULL; c++)
-		if (c->number == id)
-			return c;
-	return NULL;
-}
-
 #define	CIPHER_SEP	","
 int
 ciphers_valid(const char *names)
@@ -273,7 +214,7 @@
 	for ((p = strsep(&cp, CIPHER_SEP)); p && *p != '\0';
 	    (p = strsep(&cp, CIPHER_SEP))) {
 		c = cipher_by_name(p);
-		if (c == NULL || c->number != SSH_CIPHER_SSH2) {
+		if (c == NULL || (c->flags & CFLAG_INTERNAL) != 0) {
 			free(cipher_list);
 			return 0;
 		}
@@ -282,38 +223,12 @@
 	return 1;
 }
 
-/*
- * Parses the name of the cipher.  Returns the number of the corresponding
- * cipher, or -1 on error.
- */
-
-int
-cipher_number(const char *name)
-{
-	const struct sshcipher *c;
-	if (name == NULL)
-		return -1;
-	for (c = ciphers; c->name != NULL; c++)
-		if (strcasecmp(c->name, name) == 0)
-			return c->number;
-	return -1;
-}
-
-char *
-cipher_name(int id)
-{
-	const struct sshcipher *c = cipher_by_number(id);
-	return (c==NULL) ? "<unknown>" : c->name;
-}
-
 const char *
 cipher_warning_message(const struct sshcipher_ctx *cc)
 {
 	if (cc == NULL || cc->cipher == NULL)
 		return NULL;
-	if (cc->cipher->number == SSH_CIPHER_DES)
-		return "use of DES is strongly discouraged due to "
-		    "cryptographic weaknesses";
+	/* XXX repurpose for CBC warning */
 	return NULL;
 }
 
@@ -327,19 +242,13 @@
 #ifdef WITH_OPENSSL
 	const EVP_CIPHER *type;
 	int klen;
-	u_char *junk, *discard;
 #endif
 
 	*ccp = NULL;
 	if ((cc = calloc(sizeof(*cc), 1)) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
 
-	if (cipher->number == SSH_CIPHER_DES) {
-		if (keylen > 8)
-			keylen = 8;
-	}
-
-	cc->plaintext = (cipher->number == SSH_CIPHER_NONE);
+	cc->plaintext = (cipher->flags & CFLAG_NONE) != 0;
 	cc->encrypt = do_encrypt;
 
 	if (keylen < cipher->key_len ||
@@ -353,6 +262,10 @@
 		ret = chachapoly_init(&cc->cp_ctx, key, keylen);
 		goto out;
 	}
+	if ((cc->cipher->flags & CFLAG_NONE) != 0) {
+		ret = 0;
+		goto out;
+	}
 #ifndef WITH_OPENSSL
 	if ((cc->cipher->flags & CFLAG_AESCTR) != 0) {
 		aesctr_keysetup(&cc->ac_ctx, key, 8 * keylen, 8 * ivlen);
@@ -360,10 +273,6 @@
 		ret = 0;
 		goto out;
 	}
-	if ((cc->cipher->flags & CFLAG_NONE) != 0) {
-		ret = 0;
-		goto out;
-	}
 	ret = SSH_ERR_INVALID_ARGUMENT;
 	goto out;
 #else /* WITH_OPENSSL */
@@ -394,23 +303,6 @@
 		ret = SSH_ERR_LIBCRYPTO_ERROR;
 		goto out;
 	}
-
-	if (cipher->discard_len > 0) {
-		if ((junk = malloc(cipher->discard_len)) == NULL ||
-		    (discard = malloc(cipher->discard_len)) == NULL) {
-			free(junk);
-			ret = SSH_ERR_ALLOC_FAIL;
-			goto out;
-		}
-		ret = EVP_Cipher(cc->evp, discard, junk, cipher->discard_len);
-		explicit_bzero(discard, cipher->discard_len);
-		free(junk);
-		free(discard);
-		if (ret != 1) {
-			ret = SSH_ERR_LIBCRYPTO_ERROR;
-			goto out;
-		}
-	}
 	ret = 0;
 #endif /* WITH_OPENSSL */
  out:
@@ -420,8 +312,7 @@
 	} else {
 		if (cc != NULL) {
 #ifdef WITH_OPENSSL
-			if (cc->evp != NULL)
-				EVP_CIPHER_CTX_free(cc->evp);
+			EVP_CIPHER_CTX_free(cc->evp);
 #endif /* WITH_OPENSSL */
 			explicit_bzero(cc, sizeof(*cc));
 			free(cc);
@@ -448,6 +339,10 @@
 		return chachapoly_crypt(&cc->cp_ctx, seqnr, dest, src,
 		    len, aadlen, authlen, cc->encrypt);
 	}
+	if ((cc->cipher->flags & CFLAG_NONE) != 0) {
+		memcpy(dest, src, aadlen + len);
+		return 0;
+	}
 #ifndef WITH_OPENSSL
 	if ((cc->cipher->flags & CFLAG_AESCTR) != 0) {
 		if (aadlen)
@@ -456,10 +351,6 @@
 		    dest + aadlen, len);
 		return 0;
 	}
-	if ((cc->cipher->flags & CFLAG_NONE) != 0) {
-		memcpy(dest, src, aadlen + len);
-		return 0;
-	}
 	return SSH_ERR_INVALID_ARGUMENT;
 #else
 	if (authlen) {
@@ -512,7 +403,7 @@
 		    cp, len);
 	if (len < 4)
 		return SSH_ERR_MESSAGE_INCOMPLETE;
-	*plenp = get_u32(cp);
+	*plenp = PEEK_U32(cp);
 	return 0;
 }
 
@@ -526,38 +417,14 @@
 	else if ((cc->cipher->flags & CFLAG_AESCTR) != 0)
 		explicit_bzero(&cc->ac_ctx, sizeof(cc->ac_ctx));
 #ifdef WITH_OPENSSL
-	if (cc->evp != NULL) {
-		EVP_CIPHER_CTX_free(cc->evp);
-		cc->evp = NULL;
-	}
+	EVP_CIPHER_CTX_free(cc->evp);
+	cc->evp = NULL;
 #endif
 	explicit_bzero(cc, sizeof(*cc));
 	free(cc);
 }
 
 /*
- * Selects the cipher, and keys if by computing the MD5 checksum of the
- * passphrase and using the resulting 16 bytes as the key.
- */
-int
-cipher_set_key_string(struct sshcipher_ctx **ccp,
-    const struct sshcipher *cipher, const char *passphrase, int do_encrypt)
-{
-	u_char digest[16];
-	int r = SSH_ERR_INTERNAL_ERROR;
-
-	if ((r = ssh_digest_memory(SSH_DIGEST_MD5,
-	    passphrase, strlen(passphrase),
-	    digest, sizeof(digest))) != 0)
-		goto out;
-
-	r = cipher_init(ccp, cipher, digest, 16, NULL, 0, do_encrypt);
- out:
-	explicit_bzero(digest, sizeof(digest));
-	return r;
-}
-
-/*
  * Exports an IV from the sshcipher_ctx required to export the key
  * state back from the unprivileged child to the privileged parent
  * process.
@@ -566,27 +433,24 @@
 cipher_get_keyiv_len(const struct sshcipher_ctx *cc)
 {
 	const struct sshcipher *c = cc->cipher;
-	int ivlen = 0;
 
-	if (c->number == SSH_CIPHER_3DES)
-		ivlen = 24;
-	else if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0)
-		ivlen = 0;
-	else if ((cc->cipher->flags & CFLAG_AESCTR) != 0)
-		ivlen = sizeof(cc->ac_ctx.ctr);
+	if ((c->flags & CFLAG_CHACHAPOLY) != 0)
+		return 0;
+	else if ((c->flags & CFLAG_AESCTR) != 0)
+		return sizeof(cc->ac_ctx.ctr);
 #ifdef WITH_OPENSSL
-	else
-		ivlen = EVP_CIPHER_CTX_iv_length(cc->evp);
-#endif /* WITH_OPENSSL */
-	return (ivlen);
+	return EVP_CIPHER_CTX_iv_length(cc->evp);
+#else
+	return 0;
+#endif
 }
 
 int
 cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, u_int len)
 {
-	const struct sshcipher *c = cc->cipher;
 #ifdef WITH_OPENSSL
- 	int evplen;
+	const struct sshcipher *c = cc->cipher;
+	int evplen;
 #endif
 
 	if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0) {
@@ -603,47 +467,35 @@
 	if ((cc->cipher->flags & CFLAG_NONE) != 0)
 		return 0;
 
-	switch (c->number) {
 #ifdef WITH_OPENSSL
-	case SSH_CIPHER_SSH2:
-	case SSH_CIPHER_DES:
-	case SSH_CIPHER_BLOWFISH:
-		evplen = EVP_CIPHER_CTX_iv_length(cc->evp);
-		if (evplen == 0)
-			return 0;
-		else if (evplen < 0)
-			return SSH_ERR_LIBCRYPTO_ERROR;
-		if ((u_int)evplen != len)
-			return SSH_ERR_INVALID_ARGUMENT;
-#ifndef OPENSSL_HAVE_EVPCTR
-		if (c->evptype == evp_aes_128_ctr)
-			ssh_aes_ctr_iv(cc->evp, 0, iv, len);
-		else
-#endif
-		if (cipher_authlen(c)) {
-			if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN,
-			   len, iv))
-			       return SSH_ERR_LIBCRYPTO_ERROR;
-		} else
-			memcpy(iv, cc->evp->iv, len);
-		break;
-#endif
-#ifdef WITH_SSH1
-	case SSH_CIPHER_3DES:
-		return ssh1_3des_iv(cc->evp, 0, iv, 24);
-#endif
-	default:
+	evplen = EVP_CIPHER_CTX_iv_length(cc->evp);
+	if (evplen == 0)
+		return 0;
+	else if (evplen < 0)
+		return SSH_ERR_LIBCRYPTO_ERROR;
+	if ((u_int)evplen != len)
 		return SSH_ERR_INVALID_ARGUMENT;
-	}
+#ifndef OPENSSL_HAVE_EVPCTR
+	if (c->evptype == evp_aes_128_ctr)
+		ssh_aes_ctr_iv(cc->evp, 0, iv, len);
+	else
+#endif
+	if (cipher_authlen(c)) {
+		if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN,
+		   len, iv))
+		       return SSH_ERR_LIBCRYPTO_ERROR;
+	} else
+		memcpy(iv, cc->evp->iv, len);
+#endif
 	return 0;
 }
 
 int
 cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv)
 {
-	const struct sshcipher *c = cc->cipher;
 #ifdef WITH_OPENSSL
- 	int evplen = 0;
+	const struct sshcipher *c = cc->cipher;
+	int evplen = 0;
 #endif
 
 	if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0)
@@ -651,36 +503,24 @@
 	if ((cc->cipher->flags & CFLAG_NONE) != 0)
 		return 0;
 
-	switch (c->number) {
 #ifdef WITH_OPENSSL
-	case SSH_CIPHER_SSH2:
-	case SSH_CIPHER_DES:
-	case SSH_CIPHER_BLOWFISH:
-		evplen = EVP_CIPHER_CTX_iv_length(cc->evp);
-		if (evplen <= 0)
-			return SSH_ERR_LIBCRYPTO_ERROR;
+	evplen = EVP_CIPHER_CTX_iv_length(cc->evp);
+	if (evplen <= 0)
+		return SSH_ERR_LIBCRYPTO_ERROR;
 #ifndef OPENSSL_HAVE_EVPCTR
-		/* XXX iv arg is const, but ssh_aes_ctr_iv isn't */
-		if (c->evptype == evp_aes_128_ctr)
-			ssh_aes_ctr_iv(cc->evp, 1, (u_char *)iv, evplen);
-		else
+	/* XXX iv arg is const, but ssh_aes_ctr_iv isn't */
+	if (c->evptype == evp_aes_128_ctr)
+		ssh_aes_ctr_iv(cc->evp, 1, (u_char *)iv, evplen);
+	else
 #endif
-		if (cipher_authlen(c)) {
-			/* XXX iv arg is const, but EVP_CIPHER_CTX_ctrl isn't */
-			if (!EVP_CIPHER_CTX_ctrl(cc->evp,
-			    EVP_CTRL_GCM_SET_IV_FIXED, -1, (void *)iv))
-				return SSH_ERR_LIBCRYPTO_ERROR;
-		} else
-			memcpy(cc->evp->iv, iv, evplen);
-		break;
+	if (cipher_authlen(c)) {
+		/* XXX iv arg is const, but EVP_CIPHER_CTX_ctrl isn't */
+		if (!EVP_CIPHER_CTX_ctrl(cc->evp,
+		    EVP_CTRL_GCM_SET_IV_FIXED, -1, (void *)iv))
+			return SSH_ERR_LIBCRYPTO_ERROR;
+	} else
+		memcpy(cc->evp->iv, iv, evplen);
 #endif
-#ifdef WITH_SSH1
-	case SSH_CIPHER_3DES:
-		return ssh1_3des_iv(cc->evp, 1, (u_char *)iv, 24);
-#endif
-	default:
-		return SSH_ERR_INVALID_ARGUMENT;
-	}
 	return 0;
 }
 
diff --git a/cipher.h b/cipher.h
index f4bca62..dc7ecf1 100644
--- a/cipher.h
+++ b/cipher.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cipher.h,v 1.49 2016/08/03 05:41:57 djm Exp $ */
+/* $OpenBSD: cipher.h,v 1.52 2017/05/07 23:12:57 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -42,34 +42,13 @@
 #include "cipher-chachapoly.h"
 #include "cipher-aesctr.h"
 
-/*
- * Cipher types for SSH-1.  New types can be added, but old types should not
- * be removed for compatibility.  The maximum allowed value is 31.
- */
-#define SSH_CIPHER_SSH2		-3
-#define SSH_CIPHER_INVALID	-2	/* No valid cipher selected. */
-#define SSH_CIPHER_NOT_SET	-1	/* None selected (invalid number). */
-#define SSH_CIPHER_NONE		0	/* no encryption */
-#define SSH_CIPHER_IDEA		1	/* IDEA CFB */
-#define SSH_CIPHER_DES		2	/* DES CBC */
-#define SSH_CIPHER_3DES		3	/* 3DES CBC */
-#define SSH_CIPHER_BROKEN_TSS	4	/* TRI's Simple Stream encryption CBC */
-#define SSH_CIPHER_BROKEN_RC4	5	/* Alleged RC4 */
-#define SSH_CIPHER_BLOWFISH	6
-#define SSH_CIPHER_RESERVED	7
-#define SSH_CIPHER_MAX		31
-
 #define CIPHER_ENCRYPT		1
 #define CIPHER_DECRYPT		0
 
 struct sshcipher;
 struct sshcipher_ctx;
 
-u_int	 cipher_mask_ssh1(int);
 const struct sshcipher *cipher_by_name(const char *);
-const struct sshcipher *cipher_by_number(int);
-int	 cipher_number(const char *);
-char	*cipher_name(int);
 const char *cipher_warning_message(const struct sshcipher_ctx *);
 int	 ciphers_valid(const char *);
 char	*cipher_alg_list(char, int);
@@ -80,8 +59,6 @@
 int	 cipher_get_length(struct sshcipher_ctx *, u_int *, u_int,
     const u_char *, u_int);
 void	 cipher_free(struct sshcipher_ctx *);
-int	 cipher_set_key_string(struct sshcipher_ctx **,
-    const struct sshcipher *, const char *, int);
 u_int	 cipher_blocksize(const struct sshcipher *);
 u_int	 cipher_keylen(const struct sshcipher *);
 u_int	 cipher_seclen(const struct sshcipher *);
@@ -90,13 +67,9 @@
 u_int	 cipher_is_cbc(const struct sshcipher *);
 
 u_int	 cipher_ctx_is_plaintext(struct sshcipher_ctx *);
-u_int	 cipher_ctx_get_number(struct sshcipher_ctx *);
 
-u_int	 cipher_get_number(const struct sshcipher *);
 int	 cipher_get_keyiv(struct sshcipher_ctx *, u_char *, u_int);
 int	 cipher_set_keyiv(struct sshcipher_ctx *, const u_char *);
 int	 cipher_get_keyiv_len(const struct sshcipher_ctx *);
-int	 cipher_get_keycontext(const struct sshcipher_ctx *, u_char *);
-void	 cipher_set_keycontext(struct sshcipher_ctx *, const u_char *);
 
 #endif				/* CIPHER_H */
diff --git a/clientloop.c b/clientloop.c
index f9c35f6..b67f490 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.c,v 1.290 2017/01/29 21:35:23 dtucker Exp $ */
+/* $OpenBSD: clientloop.c,v 1.317 2018/07/11 18:53:29 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -89,14 +89,13 @@
 #include "openbsd-compat/sys-queue.h"
 #include "xmalloc.h"
 #include "ssh.h"
-#include "ssh1.h"
 #include "ssh2.h"
 #include "packet.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "compat.h"
 #include "channels.h"
 #include "dispatch.h"
-#include "key.h"
+#include "sshkey.h"
 #include "cipher.h"
 #include "kex.h"
 #include "myproposal.h"
@@ -152,15 +151,9 @@
 
 /* Common data for the client loop code. */
 volatile sig_atomic_t quit_pending; /* Set non-zero to quit the loop. */
-static int escape_char1;	/* Escape character. (proto1 only) */
-static int escape_pending1;	/* Last character was an escape (proto1 only) */
 static int last_was_cr;		/* Last character was a newline. */
 static int exit_status;		/* Used to store the command exit status. */
-static int stdin_eof;		/* EOF has been encountered on stderr. */
-static Buffer stdin_buffer;	/* Buffer for stdin data. */
-static Buffer stdout_buffer;	/* Buffer for stdout data. */
-static Buffer stderr_buffer;	/* Buffer for stderr data. */
-static u_int buffer_high;	/* Soft max buffer size. */
+static struct sshbuf *stderr_buffer;	/* Used for final exit message. */
 static int connection_in;	/* Connection to server (input). */
 static int connection_out;	/* Connection to server (output). */
 static int need_rekeying;	/* Set to non-zero if rekeying is requested. */
@@ -184,6 +177,7 @@
 };
 
 /* Global request success/failure callbacks */
+/* XXX move to struct ssh? */
 struct global_confirm {
 	TAILQ_ENTRY(global_confirm) entry;
 	global_confirm_cb *cb;
@@ -194,7 +188,7 @@
 static struct global_confirms global_confirms =
     TAILQ_HEAD_INITIALIZER(global_confirms);
 
-void ssh_process_session2_setup(int, int, int, Buffer *);
+void ssh_process_session2_setup(int, int, int, struct sshbuf *);
 
 /* Restores stdin to blocking mode. */
 
@@ -207,15 +201,6 @@
 	}
 }
 
-/* Puts stdin terminal in non-blocking mode. */
-
-static void
-enter_non_blocking(void)
-{
-	in_non_blocking_mode = 1;
-	set_nonblock(fileno(stdin));
-}
-
 /*
  * Signal handler for the window change signal (SIGWINCH).  This just sets a
  * flag indicating that the window has changed.
@@ -225,7 +210,6 @@
 window_change_handler(int sig)
 {
 	received_window_change_signal = 1;
-	signal(SIGWINCH, window_change_handler);
 }
 
 /*
@@ -241,32 +225,19 @@
 }
 
 /*
- * Returns current time in seconds from Jan 1, 1970 with the maximum
- * available resolution.
- */
-
-static double
-get_current_time(void)
-{
-	struct timeval tv;
-	gettimeofday(&tv, NULL);
-	return (double) tv.tv_sec + (double) tv.tv_usec / 1000000.0;
-}
-
-/*
  * Sets control_persist_exit_time to the absolute time when the
  * backgrounded control master should exit due to expiry of the
  * ControlPersist timeout.  Sets it to 0 if we are not a backgrounded
  * control master process, or if there is no ControlPersist timeout.
  */
 static void
-set_control_persist_exit_time(void)
+set_control_persist_exit_time(struct ssh *ssh)
 {
 	if (muxserver_sock == -1 || !options.control_persist
 	    || options.control_persist_timeout == 0) {
 		/* not using a ControlPersist timeout */
 		control_persist_exit_time = 0;
-	} else if (channel_still_open()) {
+	} else if (channel_still_open(ssh)) {
 		/* some client connections are still open */
 		if (control_persist_exit_time > 0)
 			debug2("%s: cancel scheduled exit", __func__);
@@ -304,8 +275,9 @@
 #define SSH_X11_PROTO		"MIT-MAGIC-COOKIE-1"
 #define X11_TIMEOUT_SLACK	60
 int
-client_x11_get_proto(const char *display, const char *xauth_path,
-    u_int trusted, u_int timeout, char **_proto, char **_data)
+client_x11_get_proto(struct ssh *ssh, const char *display,
+    const char *xauth_path, u_int trusted, u_int timeout,
+    char **_proto, char **_data)
 {
 	char cmd[1024], line[512], xdisplay[512];
 	char xauthfile[PATH_MAX], xauthdir[PATH_MAX];
@@ -389,7 +361,8 @@
 					x11_refuse_time = UINT_MAX;
 				else
 					x11_refuse_time = now + timeout;
-				channel_set_x11_refuse_time(x11_refuse_time);
+				channel_set_x11_refuse_time(ssh,
+				    x11_refuse_time);
 			}
 			if (system(cmd) == 0)
 				generated = 1;
@@ -455,91 +428,6 @@
 }
 
 /*
- * This is called when the interactive is entered.  This checks if there is
- * an EOF coming on stdin.  We must check this explicitly, as select() does
- * not appear to wake up when redirecting from /dev/null.
- */
-
-static void
-client_check_initial_eof_on_stdin(void)
-{
-	int len;
-	char buf[1];
-
-	/*
-	 * If standard input is to be "redirected from /dev/null", we simply
-	 * mark that we have seen an EOF and send an EOF message to the
-	 * server. Otherwise, we try to read a single character; it appears
-	 * that for some files, such /dev/null, select() never wakes up for
-	 * read for this descriptor, which means that we never get EOF.  This
-	 * way we will get the EOF if stdin comes from /dev/null or similar.
-	 */
-	if (stdin_null_flag) {
-		/* Fake EOF on stdin. */
-		debug("Sending eof.");
-		stdin_eof = 1;
-		packet_start(SSH_CMSG_EOF);
-		packet_send();
-	} else {
-		enter_non_blocking();
-
-		/* Check for immediate EOF on stdin. */
-		len = read(fileno(stdin), buf, 1);
-		if (len == 0) {
-			/*
-			 * EOF.  Record that we have seen it and send
-			 * EOF to server.
-			 */
-			debug("Sending eof.");
-			stdin_eof = 1;
-			packet_start(SSH_CMSG_EOF);
-			packet_send();
-		} else if (len > 0) {
-			/*
-			 * Got data.  We must store the data in the buffer,
-			 * and also process it as an escape character if
-			 * appropriate.
-			 */
-			if ((u_char) buf[0] == escape_char1)
-				escape_pending1 = 1;
-			else
-				buffer_append(&stdin_buffer, buf, 1);
-		}
-		leave_non_blocking();
-	}
-}
-
-
-/*
- * Make packets from buffered stdin data, and buffer them for sending to the
- * connection.
- */
-
-static void
-client_make_packets_from_stdin_data(void)
-{
-	u_int len;
-
-	/* Send buffered stdin data to the server. */
-	while (buffer_len(&stdin_buffer) > 0 &&
-	    packet_not_very_much_data_to_write()) {
-		len = buffer_len(&stdin_buffer);
-		/* Keep the packets at reasonable size. */
-		if (len > packet_get_maxsize())
-			len = packet_get_maxsize();
-		packet_start(SSH_CMSG_STDIN_DATA);
-		packet_put_string(buffer_ptr(&stdin_buffer), len);
-		packet_send();
-		buffer_consume(&stdin_buffer, len);
-		/* If we have a pending EOF, send it now. */
-		if (stdin_eof && buffer_len(&stdin_buffer) == 0) {
-			packet_start(SSH_CMSG_EOF);
-			packet_send();
-		}
-	}
-}
-
-/*
  * Checks if the client window has changed, and sends a packet about it to
  * the server if so.  The actual change is detected elsewhere (by a software
  * interrupt on Unix); this just checks the flag and sends a message if
@@ -547,40 +435,27 @@
  */
 
 static void
-client_check_window_change(void)
+client_check_window_change(struct ssh *ssh)
 {
-	struct winsize ws;
-
-	if (! received_window_change_signal)
+	if (!received_window_change_signal)
 		return;
 	/** XXX race */
 	received_window_change_signal = 0;
 
-	debug2("client_check_window_change: changed");
+	debug2("%s: changed", __func__);
 
-	if (compat20) {
-		channel_send_window_changes();
-	} else {
-		if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) < 0)
-			return;
-		packet_start(SSH_CMSG_WINDOW_SIZE);
-		packet_put_int((u_int)ws.ws_row);
-		packet_put_int((u_int)ws.ws_col);
-		packet_put_int((u_int)ws.ws_xpixel);
-		packet_put_int((u_int)ws.ws_ypixel);
-		packet_send();
-	}
+	channel_send_window_changes(ssh);
 }
 
 static int
-client_global_request_reply(int type, u_int32_t seq, void *ctxt)
+client_global_request_reply(int type, u_int32_t seq, struct ssh *ssh)
 {
 	struct global_confirm *gc;
 
 	if ((gc = TAILQ_FIRST(&global_confirms)) == NULL)
 		return 0;
 	if (gc->cb != NULL)
-		gc->cb(type, seq, gc->ctx);
+		gc->cb(ssh, type, seq, gc->ctx);
 	if (--gc->ref_count <= 0) {
 		TAILQ_REMOVE(&global_confirms, gc, entry);
 		explicit_bzero(gc, sizeof(*gc));
@@ -611,49 +486,30 @@
  * one of the file descriptors).
  */
 static void
-client_wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp,
+client_wait_until_can_do_something(struct ssh *ssh,
+    fd_set **readsetp, fd_set **writesetp,
     int *maxfdp, u_int *nallocp, int rekeying)
 {
 	struct timeval tv, *tvp;
 	int timeout_secs;
 	time_t minwait_secs = 0, server_alive_time = 0, now = monotime();
-	int ret;
+	int r, ret;
 
 	/* Add any selections by the channel mechanism. */
-	channel_prepare_select(readsetp, writesetp, maxfdp, nallocp,
-	    &minwait_secs, rekeying);
+	channel_prepare_select(active_state, readsetp, writesetp, maxfdp,
+	    nallocp, &minwait_secs);
 
-	if (!compat20) {
-		/* Read from the connection, unless our buffers are full. */
-		if (buffer_len(&stdout_buffer) < buffer_high &&
-		    buffer_len(&stderr_buffer) < buffer_high &&
-		    channel_not_very_much_buffered_data())
-			FD_SET(connection_in, *readsetp);
-		/*
-		 * Read from stdin, unless we have seen EOF or have very much
-		 * buffered data to send to the server.
-		 */
-		if (!stdin_eof && packet_not_very_much_data_to_write())
-			FD_SET(fileno(stdin), *readsetp);
-
-		/* Select stdout/stderr if have data in buffer. */
-		if (buffer_len(&stdout_buffer) > 0)
-			FD_SET(fileno(stdout), *writesetp);
-		if (buffer_len(&stderr_buffer) > 0)
-			FD_SET(fileno(stderr), *writesetp);
-	} else {
-		/* channel_prepare_select could have closed the last channel */
-		if (session_closed && !channel_still_open() &&
-		    !packet_have_data_to_write()) {
-			/* clear mask since we did not call select() */
-			memset(*readsetp, 0, *nallocp);
-			memset(*writesetp, 0, *nallocp);
-			return;
-		} else {
-			FD_SET(connection_in, *readsetp);
-		}
+	/* channel_prepare_select could have closed the last channel */
+	if (session_closed && !channel_still_open(ssh) &&
+	    !packet_have_data_to_write()) {
+		/* clear mask since we did not call select() */
+		memset(*readsetp, 0, *nallocp);
+		memset(*writesetp, 0, *nallocp);
+		return;
 	}
 
+	FD_SET(connection_in, *readsetp);
+
 	/* Select server connection if have data to write to the server. */
 	if (packet_have_data_to_write())
 		FD_SET(connection_out, *writesetp);
@@ -665,13 +521,13 @@
 	 */
 
 	timeout_secs = INT_MAX; /* we use INT_MAX to mean no timeout */
-	if (options.server_alive_interval > 0 && compat20) {
+	if (options.server_alive_interval > 0) {
 		timeout_secs = options.server_alive_interval;
 		server_alive_time = now + options.server_alive_interval;
 	}
-	if (options.rekey_interval > 0 && compat20 && !rekeying)
+	if (options.rekey_interval > 0 && !rekeying)
 		timeout_secs = MINIMUM(timeout_secs, packet_get_rekey_timeout());
-	set_control_persist_exit_time();
+	set_control_persist_exit_time(ssh);
 	if (control_persist_exit_time > 0) {
 		timeout_secs = MINIMUM(timeout_secs,
 			control_persist_exit_time - now);
@@ -694,8 +550,6 @@
 	ret = select((*maxfdp)+1, *readsetp, *writesetp, NULL, tvp);
 #endif
 	if (ret < 0) {
-		char buf[100];
-
 		/*
 		 * We have to clear the select masks, because we return.
 		 * We have to return, because the mainloop checks for the flags
@@ -707,8 +561,9 @@
 		if (errno == EINTR)
 			return;
 		/* Note: we might still have data in the buffers. */
-		snprintf(buf, sizeof buf, "select: %s\r\n", strerror(errno));
-		buffer_append(&stderr_buffer, buf, strlen(buf));
+		if ((r = sshbuf_putf(stderr_buffer,
+		    "select: %s\r\n", strerror(errno))) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		quit_pending = 1;
 	} else if (ret == 0) {
 		/*
@@ -722,25 +577,21 @@
 }
 
 static void
-client_suspend_self(Buffer *bin, Buffer *bout, Buffer *berr)
+client_suspend_self(struct sshbuf *bin, struct sshbuf *bout, struct sshbuf *berr)
 {
 	/* Flush stdout and stderr buffers. */
-	if (buffer_len(bout) > 0)
-		atomicio(vwrite, fileno(stdout), buffer_ptr(bout),
-		    buffer_len(bout));
-	if (buffer_len(berr) > 0)
-		atomicio(vwrite, fileno(stderr), buffer_ptr(berr),
-		    buffer_len(berr));
+	if (sshbuf_len(bout) > 0)
+		atomicio(vwrite, fileno(stdout), sshbuf_mutable_ptr(bout),
+		    sshbuf_len(bout));
+	if (sshbuf_len(berr) > 0)
+		atomicio(vwrite, fileno(stderr), sshbuf_mutable_ptr(berr),
+		    sshbuf_len(berr));
 
 	leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
 
-	/*
-	 * Free (and clear) the buffer to reduce the amount of data that gets
-	 * written to swap.
-	 */
-	buffer_free(bin);
-	buffer_free(bout);
-	buffer_free(berr);
+	sshbuf_reset(bin);
+	sshbuf_reset(bout);
+	sshbuf_reset(berr);
 
 	/* Send the suspend signal to the program itself. */
 	kill(getpid(), SIGTSTP);
@@ -748,19 +599,14 @@
 	/* Reset window sizes in case they have changed */
 	received_window_change_signal = 1;
 
-	/* OK, we have been continued by the user. Reinitialize buffers. */
-	buffer_init(bin);
-	buffer_init(bout);
-	buffer_init(berr);
-
 	enter_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
 }
 
 static void
 client_process_net_input(fd_set *readset)
 {
-	int len;
 	char buf[SSH_IOBUFSZ];
+	int r, len;
 
 	/*
 	 * Read input from the server, and add any such data to the buffer of
@@ -774,10 +620,11 @@
 			 * Received EOF.  The remote host has closed the
 			 * connection.
 			 */
-			snprintf(buf, sizeof buf,
+			if ((r = sshbuf_putf(stderr_buffer,
 			    "Connection to %.300s closed by remote host.\r\n",
-			    host);
-			buffer_append(&stderr_buffer, buf, strlen(buf));
+			    host)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			quit_pending = 1;
 			return;
 		}
@@ -794,10 +641,11 @@
 			 * An error has encountered.  Perhaps there is a
 			 * network problem.
 			 */
-			snprintf(buf, sizeof buf,
+			if ((r = sshbuf_putf(stderr_buffer,
 			    "Read from remote host %.300s: %.100s\r\n",
-			    host, strerror(errno));
-			buffer_append(&stderr_buffer, buf, strlen(buf));
+			    host, strerror(errno))) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			quit_pending = 1;
 			return;
 		}
@@ -806,11 +654,11 @@
 }
 
 static void
-client_status_confirm(int type, Channel *c, void *ctx)
+client_status_confirm(struct ssh *ssh, int type, Channel *c, void *ctx)
 {
 	struct channel_reply_ctx *cr = (struct channel_reply_ctx *)ctx;
 	char errmsg[256];
-	int tochan;
+	int r, tochan;
 
 	/*
 	 * If a TTY was explicitly requested, then a failure to allocate
@@ -821,7 +669,7 @@
 	    options.request_tty == REQUEST_TTY_YES))
 		cr->action = CONFIRM_CLOSE;
 
-	/* XXX supress on mux _client_ quietmode */
+	/* XXX suppress on mux _client_ quietmode */
 	tochan = options.log_level >= SYSLOG_LEVEL_ERROR &&
 	    c->ctl_chan != -1 && c->extended_usage == CHAN_EXTENDED_WRITE;
 
@@ -845,8 +693,10 @@
 		 * their stderr.
 		 */
 		if (tochan) {
-			buffer_append(&c->extended, errmsg,
-			    strlen(errmsg));
+			if ((r = sshbuf_put(c->extended, errmsg,
+			    strlen(errmsg))) != 0)
+				fatal("%s: buffer error %s", __func__,
+				    ssh_err(r));
 		} else
 			error("%s", errmsg);
 		if (cr->action == CONFIRM_TTY) {
@@ -857,23 +707,23 @@
 			if (c->self == session_ident)
 				leave_raw_mode(0);
 			else
-				mux_tty_alloc_failed(c);
+				mux_tty_alloc_failed(ssh, c);
 		} else if (cr->action == CONFIRM_CLOSE) {
-			chan_read_failed(c);
-			chan_write_failed(c);
+			chan_read_failed(ssh, c);
+			chan_write_failed(ssh, c);
 		}
 	}
 	free(cr);
 }
 
 static void
-client_abandon_status_confirm(Channel *c, void *ctx)
+client_abandon_status_confirm(struct ssh *ssh, Channel *c, void *ctx)
 {
 	free(ctx);
 }
 
 void
-client_expect_confirm(int id, const char *request,
+client_expect_confirm(struct ssh *ssh, int id, const char *request,
     enum confirm_action action)
 {
 	struct channel_reply_ctx *cr = xcalloc(1, sizeof(*cr));
@@ -881,7 +731,7 @@
 	cr->request_type = request;
 	cr->action = action;
 
-	channel_register_status_confirm(id, client_status_confirm,
+	channel_register_status_confirm(ssh, id, client_status_confirm,
 	    client_abandon_status_confirm, cr);
 }
 
@@ -907,7 +757,7 @@
 }
 
 static void
-process_cmdline(void)
+process_cmdline(struct ssh *ssh)
 {
 	void (*handler)(int);
 	char *s, *cmd;
@@ -970,11 +820,6 @@
 		goto out;
 	}
 
-	if (delete && !compat20) {
-		logit("Not supported for SSH protocol version 1.");
-		goto out;
-	}
-
 	while (isspace((u_char)*++s))
 		;
 
@@ -986,12 +831,12 @@
 			goto out;
 		}
 		if (remote)
-			ok = channel_request_rforward_cancel(&fwd) == 0;
+			ok = channel_request_rforward_cancel(ssh, &fwd) == 0;
 		else if (dynamic)
-			ok = channel_cancel_lport_listener(&fwd,
+			ok = channel_cancel_lport_listener(ssh, &fwd,
 			    0, &options.fwd_opts) > 0;
 		else
-			ok = channel_cancel_lport_listener(&fwd,
+			ok = channel_cancel_lport_listener(ssh, &fwd,
 			    CHANNEL_CANCEL_PORT_STATIC,
 			    &options.fwd_opts) > 0;
 		if (!ok) {
@@ -1005,13 +850,13 @@
 			goto out;
 		}
 		if (local || dynamic) {
-			if (!channel_setup_local_fwd_listener(&fwd,
+			if (!channel_setup_local_fwd_listener(ssh, &fwd,
 			    &options.fwd_opts)) {
 				logit("Port forwarding failed.");
 				goto out;
 			}
 		} else {
-			if (channel_request_remote_forwarding(&fwd) < 0) {
+			if (channel_request_remote_forwarding(ssh, &fwd) < 0) {
 				logit("Port forwarding failed.");
 				goto out;
 			}
@@ -1031,10 +876,9 @@
 
 /* reasons to suppress output of an escape command in help output */
 #define SUPPRESS_NEVER		0	/* never suppress, always show */
-#define SUPPRESS_PROTO1		1	/* don't show in protocol 1 sessions */
-#define SUPPRESS_MUXCLIENT	2	/* don't show in mux client sessions */
-#define SUPPRESS_MUXMASTER	4	/* don't show in mux master sessions */
-#define SUPPRESS_SYSLOG		8	/* don't show when logging to syslog */
+#define SUPPRESS_MUXCLIENT	1	/* don't show in mux client sessions */
+#define SUPPRESS_MUXMASTER	2	/* don't show in mux master sessions */
+#define SUPPRESS_SYSLOG		4	/* don't show when logging to syslog */
 struct escape_help_text {
 	const char *cmd;
 	const char *text;
@@ -1044,9 +888,9 @@
     {".",  "terminate session", SUPPRESS_MUXMASTER},
     {".",  "terminate connection (and any multiplexed sessions)",
 	SUPPRESS_MUXCLIENT},
-    {"B",  "send a BREAK to the remote system", SUPPRESS_PROTO1},
+    {"B",  "send a BREAK to the remote system", SUPPRESS_NEVER},
     {"C",  "open a command line", SUPPRESS_MUXCLIENT},
-    {"R",  "request rekey", SUPPRESS_PROTO1},
+    {"R",  "request rekey", SUPPRESS_NEVER},
     {"V/v",  "decrease/increase verbosity (LogLevel)", SUPPRESS_MUXCLIENT},
     {"^Z", "suspend ssh", SUPPRESS_MUXCLIENT},
     {"#",  "list forwarded connections", SUPPRESS_NEVER},
@@ -1056,17 +900,17 @@
 };
 
 static void
-print_escape_help(Buffer *b, int escape_char, int protocol2, int mux_client,
+print_escape_help(struct sshbuf *b, int escape_char, int mux_client,
     int using_stderr)
 {
 	unsigned int i, suppress_flags;
-	char string[1024];
+	int r;
 
-	snprintf(string, sizeof string, "%c?\r\n"
-	    "Supported escape sequences:\r\n", escape_char);
-	buffer_append(b, string, strlen(string));
+	if ((r = sshbuf_putf(b,
+	    "%c?\r\nSupported escape sequences:\r\n", escape_char)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	suppress_flags = (protocol2 ? 0 : SUPPRESS_PROTO1) |
+	suppress_flags =
 	    (mux_client ? SUPPRESS_MUXCLIENT : 0) |
 	    (mux_client ? 0 : SUPPRESS_MUXMASTER) |
 	    (using_stderr ? 0 : SUPPRESS_SYSLOG);
@@ -1074,45 +918,37 @@
 	for (i = 0; i < sizeof(esc_txt)/sizeof(esc_txt[0]); i++) {
 		if (esc_txt[i].flags & suppress_flags)
 			continue;
-		snprintf(string, sizeof string, " %c%-3s - %s\r\n",
-		    escape_char, esc_txt[i].cmd, esc_txt[i].text);
-		buffer_append(b, string, strlen(string));
+		if ((r = sshbuf_putf(b, " %c%-3s - %s\r\n",
+		    escape_char, esc_txt[i].cmd, esc_txt[i].text)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 
-	snprintf(string, sizeof string,
+	if ((r = sshbuf_putf(b,
 	    " %c%c   - send the escape character by typing it twice\r\n"
 	    "(Note that escapes are only recognized immediately after "
-	    "newline.)\r\n", escape_char, escape_char);
-	buffer_append(b, string, strlen(string));
+	    "newline.)\r\n", escape_char, escape_char)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 }
 
-/* 
- * Process the characters one by one, call with c==NULL for proto1 case.
+/*
+ * Process the characters one by one.
  */
 static int
-process_escapes(Channel *c, Buffer *bin, Buffer *bout, Buffer *berr,
+process_escapes(struct ssh *ssh, Channel *c,
+    struct sshbuf *bin, struct sshbuf *bout, struct sshbuf *berr,
     char *buf, int len)
 {
-	char string[1024];
 	pid_t pid;
-	int bytes = 0;
+	int r, bytes = 0;
 	u_int i;
 	u_char ch;
 	char *s;
-	int *escape_pendingp, escape_char;
-	struct escape_filter_ctx *efc;
+	struct escape_filter_ctx *efc = c->filter_ctx == NULL ?
+	    NULL : (struct escape_filter_ctx *)c->filter_ctx;
 
-	if (c == NULL) {
-		escape_pendingp = &escape_pending1;
-		escape_char = escape_char1;
-	} else {
-		if (c->filter_ctx == NULL)
-			return 0;
-		efc = (struct escape_filter_ctx *)c->filter_ctx;
-		escape_pendingp = &efc->escape_pending;
-		escape_char = efc->escape_char;
-	}
-	
+	if (c->filter_ctx == NULL)
+		return 0;
+
 	if (len <= 0)
 		return (0);
 
@@ -1120,27 +956,29 @@
 		/* Get one character at a time. */
 		ch = buf[i];
 
-		if (*escape_pendingp) {
+		if (efc->escape_pending) {
 			/* We have previously seen an escape character. */
 			/* Clear the flag now. */
-			*escape_pendingp = 0;
+			efc->escape_pending = 0;
 
 			/* Process the escaped character. */
 			switch (ch) {
 			case '.':
 				/* Terminate the connection. */
-				snprintf(string, sizeof string, "%c.\r\n",
-				    escape_char);
-				buffer_append(berr, string, strlen(string));
-
+				if ((r = sshbuf_putf(berr, "%c.\r\n",
+				    efc->escape_char)) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
 				if (c && c->ctl_chan != -1) {
-					chan_read_failed(c);
-					chan_write_failed(c);
-					if (c->detach_user)
-						c->detach_user(c->self, NULL);
+					chan_read_failed(ssh, c);
+					chan_write_failed(ssh, c);
+					if (c->detach_user) {
+						c->detach_user(ssh,
+						    c->self, NULL);
+					}
 					c->type = SSH_CHANNEL_ABANDONED;
-					buffer_clear(&c->input);
-					chan_ibuf_empty(c);
+					sshbuf_reset(c->input);
+					chan_ibuf_empty(ssh, c);
 					return 0;
 				} else
 					quit_pending = 1;
@@ -1155,18 +993,20 @@
 						snprintf(b, sizeof b, "^Z");
 					else
 						snprintf(b, sizeof b, "%c", ch);
-					snprintf(string, sizeof string,
+					if ((r = sshbuf_putf(berr,
 					    "%c%s escape not available to "
 					    "multiplexed sessions\r\n",
-					    escape_char, b);
-					buffer_append(berr, string,
-					    strlen(string));
+					    efc->escape_char, b)) != 0)
+						fatal("%s: buffer error: %s",
+						    __func__, ssh_err(r));
 					continue;
 				}
 				/* Suspend the program. Inform the user */
-				snprintf(string, sizeof string,
-				    "%c^Z [suspend ssh]\r\n", escape_char);
-				buffer_append(berr, string, strlen(string));
+				if ((r = sshbuf_putf(berr,
+				    "%c^Z [suspend ssh]\r\n",
+				    efc->escape_char)) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
 
 				/* Restore terminal modes and suspend. */
 				client_suspend_self(bin, bout, berr);
@@ -1175,26 +1015,23 @@
 				continue;
 
 			case 'B':
-				if (compat20) {
-					snprintf(string, sizeof string,
-					    "%cB\r\n", escape_char);
-					buffer_append(berr, string,
-					    strlen(string));
-					channel_request_start(c->self,
-					    "break", 0);
-					packet_put_int(1000);
-					packet_send();
-				}
+				if ((r = sshbuf_putf(berr,
+				    "%cB\r\n", efc->escape_char)) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
+				channel_request_start(ssh, c->self, "break", 0);
+				if ((r = sshpkt_put_u32(ssh, 1000)) != 0 ||
+				    (r = sshpkt_send(ssh)) != 0)
+					fatal("%s: %s", __func__,
+					    ssh_err(r));
 				continue;
 
 			case 'R':
-				if (compat20) {
-					if (datafellows & SSH_BUG_NOREKEY)
-						logit("Server does not "
-						    "support re-keying");
-					else
-						need_rekeying = 1;
-				}
+				if (datafellows & SSH_BUG_NOREKEY)
+					logit("Server does not "
+					    "support re-keying");
+				else
+					need_rekeying = 1;
 				continue;
 
 			case 'V':
@@ -1203,11 +1040,11 @@
 				if (c && c->ctl_chan != -1)
 					goto noescape;
 				if (!log_is_on_stderr()) {
-					snprintf(string, sizeof string,
+					if ((r = sshbuf_putf(berr,
 					    "%c%c [Logging to syslog]\r\n",
-					     escape_char, ch);
-					buffer_append(berr, string,
-					    strlen(string));
+					    efc->escape_char, ch)) != 0)
+						fatal("%s: buffer error: %s",
+						    __func__, ssh_err(r));
 					continue;
 				}
 				if (ch == 'V' && options.log_level >
@@ -1216,10 +1053,12 @@
 				if (ch == 'v' && options.log_level <
 				    SYSLOG_LEVEL_DEBUG3)
 					log_change_level(++options.log_level);
-				snprintf(string, sizeof string,
-				    "%c%c [LogLevel %s]\r\n", escape_char, ch,
-				    log_level_name(options.log_level));
-				buffer_append(berr, string, strlen(string));
+				if ((r = sshbuf_putf(berr,
+				    "%c%c [LogLevel %s]\r\n",
+				    efc->escape_char, ch,
+				    log_level_name(options.log_level))) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
 				continue;
 
 			case '&':
@@ -1235,11 +1074,13 @@
 				    options.request_tty == REQUEST_TTY_FORCE);
 
 				/* Stop listening for new connections. */
-				channel_stop_listening();
+				channel_stop_listening(ssh);
 
-				snprintf(string, sizeof string,
-				    "%c& [backgrounded]\n", escape_char);
-				buffer_append(berr, string, strlen(string));
+				if ((r = sshbuf_putf(berr,
+				    "%c& [backgrounded]\n", efc->escape_char))
+				     != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
 
 				/* Fork into background. */
 				pid = fork();
@@ -1252,52 +1093,41 @@
 					exit(0);
 				}
 				/* The child continues serving connections. */
-				if (compat20) {
-					buffer_append(bin, "\004", 1);
-					/* fake EOF on stdin */
-					return -1;
-				} else if (!stdin_eof) {
-					/*
-					 * Sending SSH_CMSG_EOF alone does not
-					 * always appear to be enough.  So we
-					 * try to send an EOF character first.
-					 */
-					packet_start(SSH_CMSG_STDIN_DATA);
-					packet_put_string("\004", 1);
-					packet_send();
-					/* Close stdin. */
-					stdin_eof = 1;
-					if (buffer_len(bin) == 0) {
-						packet_start(SSH_CMSG_EOF);
-						packet_send();
-					}
-				}
-				continue;
-
+				/* fake EOF on stdin */
+				if ((r = sshbuf_put_u8(bin, 4)) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
+				return -1;
 			case '?':
-				print_escape_help(berr, escape_char, compat20,
+				print_escape_help(berr, efc->escape_char,
 				    (c && c->ctl_chan != -1),
 				    log_is_on_stderr());
 				continue;
 
 			case '#':
-				snprintf(string, sizeof string, "%c#\r\n",
-				    escape_char);
-				buffer_append(berr, string, strlen(string));
-				s = channel_open_message();
-				buffer_append(berr, s, strlen(s));
+				if ((r = sshbuf_putf(berr, "%c#\r\n",
+				    efc->escape_char)) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
+				s = channel_open_message(ssh);
+				if ((r = sshbuf_put(berr, s, strlen(s))) != 0)
+					fatal("%s: buffer error: %s",
+					    __func__, ssh_err(r));
 				free(s);
 				continue;
 
 			case 'C':
 				if (c && c->ctl_chan != -1)
 					goto noescape;
-				process_cmdline();
+				process_cmdline(ssh);
 				continue;
 
 			default:
-				if (ch != escape_char) {
-					buffer_put_char(bin, escape_char);
+				if (ch != efc->escape_char) {
+					if ((r = sshbuf_put_u8(bin,
+					    efc->escape_char)) != 0)
+						fatal("%s: buffer error: %s",
+						    __func__, ssh_err(r));
 					bytes++;
 				}
 				/* Escaped characters fall through here */
@@ -1308,12 +1138,12 @@
 			 * The previous character was not an escape char.
 			 * Check if this is an escape.
 			 */
-			if (last_was_cr && ch == escape_char) {
+			if (last_was_cr && ch == efc->escape_char) {
 				/*
 				 * It is. Set the flag and continue to
 				 * next character.
 				 */
-				*escape_pendingp = 1;
+				efc->escape_pending = 1;
 				continue;
 			}
 		}
@@ -1323,121 +1153,13 @@
 		 * and append it to the buffer.
 		 */
 		last_was_cr = (ch == '\r' || ch == '\n');
-		buffer_put_char(bin, ch);
+		if ((r = sshbuf_put_u8(bin, ch)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		bytes++;
 	}
 	return bytes;
 }
 
-static void
-client_process_input(fd_set *readset)
-{
-	int len;
-	char buf[SSH_IOBUFSZ];
-
-	/* Read input from stdin. */
-	if (FD_ISSET(fileno(stdin), readset)) {
-		/* Read as much as possible. */
-		len = read(fileno(stdin), buf, sizeof(buf));
-		if (len < 0 &&
-		    (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
-			return;		/* we'll try again later */
-		if (len <= 0) {
-			/*
-			 * Received EOF or error.  They are treated
-			 * similarly, except that an error message is printed
-			 * if it was an error condition.
-			 */
-			if (len < 0) {
-				snprintf(buf, sizeof buf, "read: %.100s\r\n",
-				    strerror(errno));
-				buffer_append(&stderr_buffer, buf, strlen(buf));
-			}
-			/* Mark that we have seen EOF. */
-			stdin_eof = 1;
-			/*
-			 * Send an EOF message to the server unless there is
-			 * data in the buffer.  If there is data in the
-			 * buffer, no message will be sent now.  Code
-			 * elsewhere will send the EOF when the buffer
-			 * becomes empty if stdin_eof is set.
-			 */
-			if (buffer_len(&stdin_buffer) == 0) {
-				packet_start(SSH_CMSG_EOF);
-				packet_send();
-			}
-		} else if (escape_char1 == SSH_ESCAPECHAR_NONE) {
-			/*
-			 * Normal successful read, and no escape character.
-			 * Just append the data to buffer.
-			 */
-			buffer_append(&stdin_buffer, buf, len);
-		} else {
-			/*
-			 * Normal, successful read.  But we have an escape
-			 * character and have to process the characters one
-			 * by one.
-			 */
-			if (process_escapes(NULL, &stdin_buffer,
-			    &stdout_buffer, &stderr_buffer, buf, len) == -1)
-				return;
-		}
-	}
-}
-
-static void
-client_process_output(fd_set *writeset)
-{
-	int len;
-	char buf[100];
-
-	/* Write buffered output to stdout. */
-	if (FD_ISSET(fileno(stdout), writeset)) {
-		/* Write as much data as possible. */
-		len = write(fileno(stdout), buffer_ptr(&stdout_buffer),
-		    buffer_len(&stdout_buffer));
-		if (len <= 0) {
-			if (errno == EINTR || errno == EAGAIN ||
-			    errno == EWOULDBLOCK)
-				len = 0;
-			else {
-				/*
-				 * An error or EOF was encountered.  Put an
-				 * error message to stderr buffer.
-				 */
-				snprintf(buf, sizeof buf,
-				    "write stdout: %.50s\r\n", strerror(errno));
-				buffer_append(&stderr_buffer, buf, strlen(buf));
-				quit_pending = 1;
-				return;
-			}
-		}
-		/* Consume printed data from the buffer. */
-		buffer_consume(&stdout_buffer, len);
-	}
-	/* Write buffered output to stderr. */
-	if (FD_ISSET(fileno(stderr), writeset)) {
-		/* Write as much data as possible. */
-		len = write(fileno(stderr), buffer_ptr(&stderr_buffer),
-		    buffer_len(&stderr_buffer));
-		if (len <= 0) {
-			if (errno == EINTR || errno == EAGAIN ||
-			    errno == EWOULDBLOCK)
-				len = 0;
-			else {
-				/*
-				 * EOF or error, but can't even print
-				 * error message.
-				 */
-				quit_pending = 1;
-				return;
-			}
-		}
-		/* Consume printed characters from the buffer. */
-		buffer_consume(&stderr_buffer, len);
-	}
-}
-
 /*
  * Get packets from the connection input buffer, and process them as long as
  * there are packets available.
@@ -1453,7 +1175,7 @@
 static void
 client_process_buffered_input_packets(void)
 {
-	dispatch_run(DISPATCH_NONBLOCK, &quit_pending, active_state);
+	ssh_dispatch_run_fatal(active_state, DISPATCH_NONBLOCK, &quit_pending);
 }
 
 /* scan buf[] for '~' before sending data to the peer */
@@ -1472,25 +1194,25 @@
 
 /* Free the escape filter context on channel free */
 void
-client_filter_cleanup(int cid, void *ctx)
+client_filter_cleanup(struct ssh *ssh, int cid, void *ctx)
 {
 	free(ctx);
 }
 
 int
-client_simple_escape_filter(Channel *c, char *buf, int len)
+client_simple_escape_filter(struct ssh *ssh, Channel *c, char *buf, int len)
 {
 	if (c->extended_usage != CHAN_EXTENDED_WRITE)
 		return 0;
 
-	return process_escapes(c, &c->input, &c->output, &c->extended,
+	return process_escapes(ssh, c, c->input, c->output, c->extended,
 	    buf, len);
 }
 
 static void
-client_channel_closed(int id, void *arg)
+client_channel_closed(struct ssh *ssh, int id, void *arg)
 {
-	channel_cancel_cleanup(id);
+	channel_cancel_cleanup(ssh, id);
 	session_closed = 1;
 	leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
 }
@@ -1501,9 +1223,9 @@
  * remote host.  If escape_char != SSH_ESCAPECHAR_NONE, it is the character
  * used as an escape character for terminating or suspending the session.
  */
-
 int
-client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
+client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
+    int ssh2_chan_id)
 {
 	fd_set *readset = NULL, *writeset = NULL;
 	double start_time, total_time;
@@ -1541,41 +1263,24 @@
 
 	} else {
 		debug("pledge: network");
-		if (pledge("stdio unix inet dns tty", NULL) == -1)
+		if (pledge("stdio unix inet dns proc tty", NULL) == -1)
 			fatal("%s pledge(): %s", __func__, strerror(errno));
 	}
 
-	start_time = get_current_time();
+	start_time = monotime_double();
 
 	/* Initialize variables. */
-	escape_pending1 = 0;
 	last_was_cr = 1;
 	exit_status = -1;
-	stdin_eof = 0;
-	buffer_high = 64 * 1024;
 	connection_in = packet_get_connection_in();
 	connection_out = packet_get_connection_out();
 	max_fd = MAXIMUM(connection_in, connection_out);
 
-	if (!compat20) {
-		/* enable nonblocking unless tty */
-		if (!isatty(fileno(stdin)))
-			set_nonblock(fileno(stdin));
-		if (!isatty(fileno(stdout)))
-			set_nonblock(fileno(stdout));
-		if (!isatty(fileno(stderr)))
-			set_nonblock(fileno(stderr));
-		max_fd = MAXIMUM(max_fd, fileno(stdin));
-		max_fd = MAXIMUM(max_fd, fileno(stdout));
-		max_fd = MAXIMUM(max_fd, fileno(stderr));
-	}
 	quit_pending = 0;
-	escape_char1 = escape_char_arg;
 
-	/* Initialize buffers. */
-	buffer_init(&stdin_buffer);
-	buffer_init(&stdout_buffer);
-	buffer_init(&stderr_buffer);
+	/* Initialize buffer. */
+	if ((stderr_buffer = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 
 	client_init_dispatch();
 
@@ -1596,22 +1301,17 @@
 	if (have_pty)
 		enter_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
 
-	if (compat20) {
-		session_ident = ssh2_chan_id;
-		if (session_ident != -1) {
-			if (escape_char_arg != SSH_ESCAPECHAR_NONE) {
-				channel_register_filter(session_ident,
-				    client_simple_escape_filter, NULL,
-				    client_filter_cleanup,
-				    client_new_escape_filter_ctx(
-				    escape_char_arg));
-			}
-			channel_register_cleanup(session_ident,
-			    client_channel_closed, 0);
+	session_ident = ssh2_chan_id;
+	if (session_ident != -1) {
+		if (escape_char_arg != SSH_ESCAPECHAR_NONE) {
+			channel_register_filter(ssh, session_ident,
+			    client_simple_escape_filter, NULL,
+			    client_filter_cleanup,
+			    client_new_escape_filter_ctx(
+			    escape_char_arg));
 		}
-	} else {
-		/* Check if we should immediately send eof on stdin. */
-		client_check_initial_eof_on_stdin();
+		channel_register_cleanup(ssh, session_ident,
+		    client_channel_closed, 0);
 	}
 
 	/* Main loop of the client for the interactive session mode. */
@@ -1620,38 +1320,31 @@
 		/* Process buffered packets sent by the server. */
 		client_process_buffered_input_packets();
 
-		if (compat20 && session_closed && !channel_still_open())
+		if (session_closed && !channel_still_open(ssh))
 			break;
 
-		if (ssh_packet_is_rekeying(active_state)) {
+		if (ssh_packet_is_rekeying(ssh)) {
 			debug("rekeying in progress");
 		} else if (need_rekeying) {
 			/* manual rekey request */
 			debug("need rekeying");
-			if ((r = kex_start_rekex(active_state)) != 0)
+			if ((r = kex_start_rekex(ssh)) != 0)
 				fatal("%s: kex_start_rekex: %s", __func__,
 				    ssh_err(r));
 			need_rekeying = 0;
 		} else {
 			/*
-			 * Make packets of buffered stdin data, and buffer
-			 * them for sending to the server.
-			 */
-			if (!compat20)
-				client_make_packets_from_stdin_data();
-
-			/*
 			 * Make packets from buffered channel data, and
 			 * enqueue them for sending to the server.
 			 */
 			if (packet_not_very_much_data_to_write())
-				channel_output_poll();
+				channel_output_poll(ssh);
 
 			/*
 			 * Check if the window size has changed, and buffer a
 			 * message about it to the server if so.
 			 */
-			client_check_window_change();
+			client_check_window_change(ssh);
 
 			if (quit_pending)
 				break;
@@ -1661,15 +1354,15 @@
 		 * available on one of the descriptors).
 		 */
 		max_fd2 = max_fd;
-		client_wait_until_can_do_something(&readset, &writeset,
-		    &max_fd2, &nalloc, ssh_packet_is_rekeying(active_state));
+		client_wait_until_can_do_something(ssh, &readset, &writeset,
+		    &max_fd2, &nalloc, ssh_packet_is_rekeying(ssh));
 
 		if (quit_pending)
 			break;
 
 		/* Do channel operations unless rekeying in progress. */
-		if (!ssh_packet_is_rekeying(active_state))
-			channel_after_select(readset, writeset);
+		if (!ssh_packet_is_rekeying(ssh))
+			channel_after_select(ssh, readset, writeset);
 
 		/* Buffer input from the connection.  */
 		client_process_net_input(readset);
@@ -1677,16 +1370,6 @@
 		if (quit_pending)
 			break;
 
-		if (!compat20) {
-			/* Buffer data from stdin */
-			client_process_input(readset);
-			/*
-			 * Process output to stdout and stderr.  Output to
-			 * the connection is processed elsewhere (above).
-			 */
-			client_process_output(writeset);
-		}
-
 		/*
 		 * Send as much buffered packet data as possible to the
 		 * sender.
@@ -1714,16 +1397,14 @@
 	/* Stop watching for window change. */
 	signal(SIGWINCH, SIG_DFL);
 
-	if (compat20) {
-		packet_start(SSH2_MSG_DISCONNECT);
-		packet_put_int(SSH2_DISCONNECT_BY_APPLICATION);
-		packet_put_cstring("disconnected by user");
-		packet_put_cstring(""); /* language tag */
-		packet_send();
-		packet_write_wait();
-	}
+	packet_start(SSH2_MSG_DISCONNECT);
+	packet_put_int(SSH2_DISCONNECT_BY_APPLICATION);
+	packet_put_cstring("disconnected by user");
+	packet_put_cstring(""); /* language tag */
+	packet_send();
+	packet_write_wait();
 
-	channel_free_all();
+	channel_free_all(ssh);
 
 	if (have_pty)
 		leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
@@ -1746,47 +1427,38 @@
 		exit_status = 0;
 	}
 
-	if (received_signal)
-		fatal("Killed by signal %d.", (int) received_signal);
+	if (received_signal) {
+		verbose("Killed by signal %d.", (int) received_signal);
+		cleanup_exit(0);
+	}
 
 	/*
 	 * In interactive mode (with pseudo tty) display a message indicating
 	 * that the connection has been closed.
 	 */
 	if (have_pty && options.log_level != SYSLOG_LEVEL_QUIET) {
-		snprintf(buf, sizeof buf,
-		    "Connection to %.64s closed.\r\n", host);
-		buffer_append(&stderr_buffer, buf, strlen(buf));
-	}
-
-	/* Output any buffered data for stdout. */
-	if (buffer_len(&stdout_buffer) > 0) {
-		len = atomicio(vwrite, fileno(stdout),
-		    buffer_ptr(&stdout_buffer), buffer_len(&stdout_buffer));
-		if (len < 0 || (u_int)len != buffer_len(&stdout_buffer))
-			error("Write failed flushing stdout buffer.");
-		else
-			buffer_consume(&stdout_buffer, len);
+		if ((r = sshbuf_putf(stderr_buffer,
+		    "Connection to %.64s closed.\r\n", host)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 
 	/* Output any buffered data for stderr. */
-	if (buffer_len(&stderr_buffer) > 0) {
+	if (sshbuf_len(stderr_buffer) > 0) {
 		len = atomicio(vwrite, fileno(stderr),
-		    buffer_ptr(&stderr_buffer), buffer_len(&stderr_buffer));
-		if (len < 0 || (u_int)len != buffer_len(&stderr_buffer))
+		    (u_char *)sshbuf_ptr(stderr_buffer),
+		    sshbuf_len(stderr_buffer));
+		if (len < 0 || (u_int)len != sshbuf_len(stderr_buffer))
 			error("Write failed flushing stderr buffer.");
-		else
-			buffer_consume(&stderr_buffer, len);
+		else if ((r = sshbuf_consume(stderr_buffer, len)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 
 	/* Clear and free any buffers. */
 	explicit_bzero(buf, sizeof(buf));
-	buffer_free(&stdin_buffer);
-	buffer_free(&stdout_buffer);
-	buffer_free(&stderr_buffer);
+	sshbuf_free(stderr_buffer);
 
 	/* Report bytes transferred, and transfer rates. */
-	total_time = get_current_time() - start_time;
+	total_time = monotime_double() - start_time;
 	packet_get_bytes(&ibytes, &obytes);
 	verbose("Transferred: sent %llu, received %llu bytes, in %.1f seconds",
 	    (unsigned long long)obytes, (unsigned long long)ibytes, total_time);
@@ -1800,95 +1472,9 @@
 
 /*********/
 
-static int
-client_input_stdout_data(int type, u_int32_t seq, void *ctxt)
-{
-	u_int data_len;
-	char *data = packet_get_string(&data_len);
-	packet_check_eom();
-	buffer_append(&stdout_buffer, data, data_len);
-	explicit_bzero(data, data_len);
-	free(data);
-	return 0;
-}
-static int
-client_input_stderr_data(int type, u_int32_t seq, void *ctxt)
-{
-	u_int data_len;
-	char *data = packet_get_string(&data_len);
-	packet_check_eom();
-	buffer_append(&stderr_buffer, data, data_len);
-	explicit_bzero(data, data_len);
-	free(data);
-	return 0;
-}
-static int
-client_input_exit_status(int type, u_int32_t seq, void *ctxt)
-{
-	exit_status = packet_get_int();
-	packet_check_eom();
-	/* Acknowledge the exit. */
-	packet_start(SSH_CMSG_EXIT_CONFIRMATION);
-	packet_send();
-	/*
-	 * Must wait for packet to be sent since we are
-	 * exiting the loop.
-	 */
-	packet_write_wait();
-	/* Flag that we want to exit. */
-	quit_pending = 1;
-	return 0;
-}
-
-static int
-client_input_agent_open(int type, u_int32_t seq, void *ctxt)
-{
-	Channel *c = NULL;
-	int r, remote_id, sock;
-
-	/* Read the remote channel number from the message. */
-	remote_id = packet_get_int();
-	packet_check_eom();
-
-	/*
-	 * Get a connection to the local authentication agent (this may again
-	 * get forwarded).
-	 */
-	if ((r = ssh_get_authentication_socket(&sock)) != 0 &&
-	    r != SSH_ERR_AGENT_NOT_PRESENT)
-		debug("%s: ssh_get_authentication_socket: %s",
-		    __func__, ssh_err(r));
-
-
-	/*
-	 * If we could not connect the agent, send an error message back to
-	 * the server. This should never happen unless the agent dies,
-	 * because authentication forwarding is only enabled if we have an
-	 * agent.
-	 */
-	if (sock >= 0) {
-		c = channel_new("", SSH_CHANNEL_OPEN, sock, sock,
-		    -1, 0, 0, 0, "authentication agent connection", 1);
-		c->remote_id = remote_id;
-		c->force_drain = 1;
-	}
-	if (c == NULL) {
-		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
-		packet_put_int(remote_id);
-	} else {
-		/* Send a confirmation to the remote host. */
-		debug("Forwarding authentication connection.");
-		packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
-		packet_put_int(remote_id);
-		packet_put_int(c->self);
-	}
-	packet_send();
-	return 0;
-}
-
 static Channel *
-client_request_forwarded_tcpip(const char *request_type, int rchan,
-    u_int rwindow, u_int rmaxpack)
+client_request_forwarded_tcpip(struct ssh *ssh, const char *request_type,
+    int rchan, u_int rwindow, u_int rmaxpack)
 {
 	Channel *c = NULL;
 	struct sshbuf *b = NULL;
@@ -1906,7 +1492,7 @@
 	debug("%s: listen %s port %d, originator %s port %d", __func__,
 	    listen_address, listen_port, originator_address, originator_port);
 
-	c = channel_connect_by_listen_address(listen_address, listen_port,
+	c = channel_connect_by_listen_address(ssh, listen_address, listen_port,
 	    "forwarded-tcpip", originator_address);
 
 	if (c != NULL && c->type == SSH_CHANNEL_MUX_CLIENT) {
@@ -1925,7 +1511,7 @@
 		    (r = sshbuf_put_u32(b, listen_port)) != 0 ||
 		    (r = sshbuf_put_cstring(b, originator_address)) != 0 ||
 		    (r = sshbuf_put_u32(b, originator_port)) != 0 ||
-		    (r = sshbuf_put_stringb(&c->output, b)) != 0) {
+		    (r = sshbuf_put_stringb(c->output, b)) != 0) {
 			error("%s: compose for muxclient %s", __func__,
 			    ssh_err(r));
 			goto out;
@@ -1940,7 +1526,8 @@
 }
 
 static Channel *
-client_request_forwarded_streamlocal(const char *request_type, int rchan)
+client_request_forwarded_streamlocal(struct ssh *ssh,
+    const char *request_type, int rchan)
 {
 	Channel *c = NULL;
 	char *listen_path;
@@ -1954,14 +1541,14 @@
 
 	debug("%s: %s", __func__, listen_path);
 
-	c = channel_connect_by_listen_path(listen_path,
+	c = channel_connect_by_listen_path(ssh, listen_path,
 	    "forwarded-streamlocal@openssh.com", "forwarded-streamlocal");
 	free(listen_path);
 	return c;
 }
 
 static Channel *
-client_request_x11(const char *request_type, int rchan)
+client_request_x11(struct ssh *ssh, const char *request_type, int rchan)
 {
 	Channel *c = NULL;
 	char *originator;
@@ -1980,21 +1567,16 @@
 		return NULL;
 	}
 	originator = packet_get_string(NULL);
-	if (datafellows & SSH_BUG_X11FWD) {
-		debug2("buggy server: x11 request w/o originator_port");
-		originator_port = 0;
-	} else {
-		originator_port = packet_get_int();
-	}
+	originator_port = packet_get_int();
 	packet_check_eom();
 	/* XXX check permission */
 	debug("client_request_x11: request from %s %d", originator,
 	    originator_port);
 	free(originator);
-	sock = x11_connect_display();
+	sock = x11_connect_display(ssh);
 	if (sock < 0)
 		return NULL;
-	c = channel_new("x11",
+	c = channel_new(ssh, "x11",
 	    SSH_CHANNEL_X11_OPEN, sock, sock, -1,
 	    CHAN_TCP_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, 0, "x11", 1);
 	c->force_drain = 1;
@@ -2002,7 +1584,7 @@
 }
 
 static Channel *
-client_request_agent(const char *request_type, int rchan)
+client_request_agent(struct ssh *ssh, const char *request_type, int rchan)
 {
 	Channel *c = NULL;
 	int r, sock;
@@ -2019,7 +1601,7 @@
 			    __func__, ssh_err(r));
 		return NULL;
 	}
-	c = channel_new("authentication agent connection",
+	c = channel_new(ssh, "authentication agent connection",
 	    SSH_CHANNEL_OPEN, sock, sock, -1,
 	    CHAN_X11_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0,
 	    "authentication agent connection", 1);
@@ -2027,35 +1609,33 @@
 	return c;
 }
 
-int
-client_request_tun_fwd(int tun_mode, int local_tun, int remote_tun)
+char *
+client_request_tun_fwd(struct ssh *ssh, int tun_mode,
+    int local_tun, int remote_tun)
 {
 	Channel *c;
 	int fd;
+	char *ifname = NULL;
 
 	if (tun_mode == SSH_TUNMODE_NO)
 		return 0;
 
-	if (!compat20) {
-		error("Tunnel forwarding is not supported for protocol 1");
-		return -1;
-	}
-
 	debug("Requesting tun unit %d in mode %d", local_tun, tun_mode);
 
 	/* Open local tunnel device */
-	if ((fd = tun_open(local_tun, tun_mode)) == -1) {
+	if ((fd = tun_open(local_tun, tun_mode, &ifname)) == -1) {
 		error("Tunnel device open failed.");
-		return -1;
+		return NULL;
 	}
+	debug("Tunnel forwarding using interface %s", ifname);
 
-	c = channel_new("tun", SSH_CHANNEL_OPENING, fd, fd, -1,
+	c = channel_new(ssh, "tun", SSH_CHANNEL_OPENING, fd, fd, -1,
 	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, "tun", 1);
 	c->datagram = 1;
 
 #if defined(SSH_TUN_FILTER)
 	if (options.tun_open == SSH_TUNMODE_POINTOPOINT)
-		channel_register_filter(c->self, sys_tun_infilter,
+		channel_register_filter(ssh, c->self, sys_tun_infilter,
 		    sys_tun_outfilter, NULL, NULL);
 #endif
 
@@ -2068,12 +1648,12 @@
 	packet_put_int(remote_tun);
 	packet_send();
 
-	return 0;
+	return ifname;
 }
 
 /* XXXX move to generic input handler */
 static int
-client_input_channel_open(int type, u_int32_t seq, void *ctxt)
+client_input_channel_open(int type, u_int32_t seq, struct ssh *ssh)
 {
 	Channel *c = NULL;
 	char *ctype;
@@ -2089,20 +1669,21 @@
 	    ctype, rchan, rwindow, rmaxpack);
 
 	if (strcmp(ctype, "forwarded-tcpip") == 0) {
-		c = client_request_forwarded_tcpip(ctype, rchan, rwindow,
+		c = client_request_forwarded_tcpip(ssh, ctype, rchan, rwindow,
 		    rmaxpack);
 	} else if (strcmp(ctype, "forwarded-streamlocal@openssh.com") == 0) {
-		c = client_request_forwarded_streamlocal(ctype, rchan);
+		c = client_request_forwarded_streamlocal(ssh, ctype, rchan);
 	} else if (strcmp(ctype, "x11") == 0) {
-		c = client_request_x11(ctype, rchan);
+		c = client_request_x11(ssh, ctype, rchan);
 	} else if (strcmp(ctype, "auth-agent@openssh.com") == 0) {
-		c = client_request_agent(ctype, rchan);
+		c = client_request_agent(ssh, ctype, rchan);
 	}
 	if (c != NULL && c->type == SSH_CHANNEL_MUX_CLIENT) {
 		debug3("proxied to downstream: %s", ctype);
 	} else if (c != NULL) {
 		debug("confirm %s", ctype);
 		c->remote_id = rchan;
+		c->have_remote_id = 1;
 		c->remote_window = rwindow;
 		c->remote_maxpacket = rmaxpack;
 		if (c->type != SSH_CHANNEL_CONNECTING) {
@@ -2118,10 +1699,8 @@
 		packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
 		packet_put_int(rchan);
 		packet_put_int(SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED);
-		if (!(datafellows & SSH_BUG_OPENFAILURE)) {
-			packet_put_cstring("open failed");
-			packet_put_cstring("");
-		}
+		packet_put_cstring("open failed");
+		packet_put_cstring("");
 		packet_send();
 	}
 	free(ctype);
@@ -2129,15 +1708,15 @@
 }
 
 static int
-client_input_channel_req(int type, u_int32_t seq, void *ctxt)
+client_input_channel_req(int type, u_int32_t seq, struct ssh *ssh)
 {
 	Channel *c = NULL;
 	int exitval, id, reply, success = 0;
 	char *rtype;
 
 	id = packet_get_int();
-	c = channel_lookup(id);
-	if (channel_proxy_upstream(c, type, seq, ctxt))
+	c = channel_lookup(ssh, id);
+	if (channel_proxy_upstream(c, type, seq, ssh))
 		return 0;
 	rtype = packet_get_string(NULL);
 	reply = packet_get_char();
@@ -2152,11 +1731,11 @@
 		    "unknown channel", id);
 	} else if (strcmp(rtype, "eow@openssh.com") == 0) {
 		packet_check_eom();
-		chan_rcvd_eow(c);
+		chan_rcvd_eow(ssh, c);
 	} else if (strcmp(rtype, "exit-status") == 0) {
 		exitval = packet_get_int();
 		if (c->ctl_chan != -1) {
-			mux_exit_message(c, exitval);
+			mux_exit_message(ssh, c, exitval);
 			success = 1;
 		} else if (id == session_ident) {
 			/* Record exit value of local session */
@@ -2170,6 +1749,9 @@
 		packet_check_eom();
 	}
 	if (reply && c != NULL && !(c->flags & CHAN_CLOSE_SENT)) {
+		if (!c->have_remote_id)
+			fatal("%s: channel %d: no remote_id",
+			    __func__, c->self);
 		packet_start(success ?
 		    SSH2_MSG_CHANNEL_SUCCESS : SSH2_MSG_CHANNEL_FAILURE);
 		packet_put_int(c->remote_id);
@@ -2191,9 +1773,7 @@
 	 */
 	struct sshkey **keys;
 	int *keys_seen;
-	size_t nkeys;
-
-	size_t nnew;
+	size_t nkeys, nnew;
 
 	/*
 	 * Keys that are in known_hosts, but were not present in the update
@@ -2230,8 +1810,7 @@
 	size_t i;
 	struct sshkey **tmp;
 
-	if (l->status != HKF_STATUS_MATCHED || l->key == NULL ||
-	    l->key->type == KEY_RSA1)
+	if (l->status != HKF_STATUS_MATCHED || l->key == NULL)
 		return 0;
 
 	/* Mark off keys we've already seen for this host */
@@ -2246,9 +1825,9 @@
 	/* This line contained a key that not offered by the server */
 	debug3("%s: deprecated %s key at %s:%ld", __func__,
 	    sshkey_ssh_name(l->key), l->path, l->linenum);
-	if ((tmp = reallocarray(ctx->old_keys, ctx->nold + 1,
+	if ((tmp = recallocarray(ctx->old_keys, ctx->nold, ctx->nold + 1,
 	    sizeof(*ctx->old_keys))) == NULL)
-		fatal("%s: reallocarray failed nold = %zu",
+		fatal("%s: recallocarray failed nold = %zu",
 		    __func__, ctx->nold);
 	ctx->old_keys = tmp;
 	ctx->old_keys[ctx->nold++] = l->key;
@@ -2327,13 +1906,13 @@
 }
 
 static void
-client_global_hostkeys_private_confirm(int type, u_int32_t seq, void *_ctx)
+client_global_hostkeys_private_confirm(struct ssh *ssh, int type,
+    u_int32_t seq, void *_ctx)
 {
-	struct ssh *ssh = active_state; /* XXX */
 	struct hostkeys_update_ctx *ctx = (struct hostkeys_update_ctx *)_ctx;
 	size_t i, ndone;
 	struct sshbuf *signdata;
-	int r;
+	int r, kexsigtype, use_kexsigtype;
 	const u_char *sig;
 	size_t siglen;
 
@@ -2345,6 +1924,9 @@
 		hostkeys_update_ctx_free(ctx);
 		return;
 	}
+	kexsigtype = sshkey_type_plain(
+	    sshkey_type_from_name(ssh->kex->hostkey_alg));
+
 	if ((signdata = sshbuf_new()) == NULL)
 		fatal("%s: sshbuf_new failed", __func__);
 	/* Don't want to accidentally accept an unbound signature */
@@ -2373,8 +1955,15 @@
 			    __func__, ssh_err(r));
 			goto out;
 		}
+		/*
+		 * For RSA keys, prefer to use the signature type negotiated
+		 * during KEX to the default (SHA1).
+		 */
+		use_kexsigtype = kexsigtype == KEY_RSA &&
+		    sshkey_type_plain(ctx->keys[i]->type) == KEY_RSA;
 		if ((r = sshkey_verify(ctx->keys[i], sig, siglen,
-		    sshbuf_ptr(signdata), sshbuf_len(signdata), 0)) != 0) {
+		    sshbuf_ptr(signdata), sshbuf_len(signdata),
+		    use_kexsigtype ? ssh->kex->hostkey_alg : NULL, 0)) != 0) {
 			error("%s: server gave bad signature for %s key %zu",
 			    __func__, sshkey_type(ctx->keys[i]), i);
 			goto out;
@@ -2395,6 +1984,26 @@
 }
 
 /*
+ * Returns non-zero if the key is accepted by HostkeyAlgorithms.
+ * Made slightly less trivial by the multiple RSA signature algorithm names.
+ */
+static int
+key_accepted_by_hostkeyalgs(const struct sshkey *key)
+{
+	const char *ktype = sshkey_ssh_name(key);
+	const char *hostkeyalgs = options.hostkeyalgorithms != NULL ?
+	    options.hostkeyalgorithms : KEX_DEFAULT_PK_ALG;
+
+	if (key == NULL || key->type == KEY_UNSPEC)
+		return 0;
+	if (key->type == KEY_RSA &&
+	    (match_pattern_list("rsa-sha2-256", hostkeyalgs, 0) == 1 ||
+	    match_pattern_list("rsa-sha2-512", hostkeyalgs, 0) == 1))
+		return 1;
+	return match_pattern_list(ktype, hostkeyalgs, 0) == 1;
+}
+
+/*
  * Handle hostkeys-00@openssh.com global request to inform the client of all
  * the server's hostkeys. The keys are checked against the user's
  * HostkeyAlgorithms preference before they are accepted.
@@ -2440,10 +2049,7 @@
 		    sshkey_type(key), fp);
 		free(fp);
 
-		/* Check that the key is accepted in HostkeyAlgorithms */
-		if (match_pattern_list(sshkey_ssh_name(key),
-		    options.hostkeyalgorithms ? options.hostkeyalgorithms :
-		    KEX_DEFAULT_PK_ALG, 0) != 1) {
+		if (!key_accepted_by_hostkeyalgs(key)) {
 			debug3("%s: %s key not permitted by HostkeyAlgorithms",
 			    __func__, sshkey_ssh_name(key));
 			continue;
@@ -2463,9 +2069,9 @@
 			}
 		}
 		/* Key is good, record it */
-		if ((tmp = reallocarray(ctx->keys, ctx->nkeys + 1,
+		if ((tmp = recallocarray(ctx->keys, ctx->nkeys, ctx->nkeys + 1,
 		    sizeof(*ctx->keys))) == NULL)
-			fatal("%s: reallocarray failed nkeys = %zu",
+			fatal("%s: recallocarray failed nkeys = %zu",
 			    __func__, ctx->nkeys);
 		ctx->keys = tmp;
 		ctx->keys[ctx->nkeys++] = key;
@@ -2553,7 +2159,7 @@
 }
 
 static int
-client_input_global_request(int type, u_int32_t seq, void *ctxt)
+client_input_global_request(int type, u_int32_t seq, struct ssh *ssh)
 {
 	char *rtype;
 	int want_reply;
@@ -2576,16 +2182,18 @@
 }
 
 void
-client_session2_setup(int id, int want_tty, int want_subsystem,
-    const char *term, struct termios *tiop, int in_fd, Buffer *cmd, char **env)
+client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem,
+    const char *term, struct termios *tiop, int in_fd, struct sshbuf *cmd,
+    char **env)
 {
-	int len;
+	int i, j, matched, len;
+	char *name, *val;
 	Channel *c = NULL;
 
 	debug2("%s: id %d", __func__, id);
 
-	if ((c = channel_lookup(id)) == NULL)
-		fatal("client_session2_setup: channel %d: unknown channel", id);
+	if ((c = channel_lookup(ssh, id)) == NULL)
+		fatal("%s: channel %d: unknown channel", __func__, id);
 
 	packet_set_interactive(want_tty,
 	    options.ip_qos_interactive, options.ip_qos_bulk);
@@ -2597,8 +2205,8 @@
 		if (ioctl(in_fd, TIOCGWINSZ, &ws) < 0)
 			memset(&ws, 0, sizeof(ws));
 
-		channel_request_start(id, "pty-req", 1);
-		client_expect_confirm(id, "PTY allocation", CONFIRM_TTY);
+		channel_request_start(ssh, id, "pty-req", 1);
+		client_expect_confirm(ssh, id, "PTY allocation", CONFIRM_TTY);
 		packet_put_cstring(term != NULL ? term : "");
 		packet_put_int((u_int)ws.ws_col);
 		packet_put_int((u_int)ws.ws_row);
@@ -2606,7 +2214,7 @@
 		packet_put_int((u_int)ws.ws_ypixel);
 		if (tiop == NULL)
 			tiop = get_saved_tio();
-		tty_make_modes(-1, tiop);
+		ssh_tty_make_modes(ssh, -1, tiop);
 		packet_send();
 		/* XXX wait for reply */
 		c->client_tty = 1;
@@ -2614,9 +2222,6 @@
 
 	/* Transfer any environment variables from client to server */
 	if (options.num_send_env != 0 && env != NULL) {
-		int i, j, matched;
-		char *name, *val;
-
 		debug("Sending environment.");
 		for (i = 0; env[i] != NULL; i++) {
 			/* Split */
@@ -2641,40 +2246,57 @@
 			}
 
 			debug("Sending env %s = %s", name, val);
-			channel_request_start(id, "env", 0);
+			channel_request_start(ssh, id, "env", 0);
 			packet_put_cstring(name);
 			packet_put_cstring(val);
 			packet_send();
 			free(name);
 		}
 	}
+	for (i = 0; i < options.num_setenv; i++) {
+		/* Split */
+		name = xstrdup(options.setenv[i]);
+		if ((val = strchr(name, '=')) == NULL) {
+			free(name);
+			continue;
+		}
+		*val++ = '\0';
 
-	len = buffer_len(cmd);
+		debug("Setting env %s = %s", name, val);
+		channel_request_start(ssh, id, "env", 0);
+		packet_put_cstring(name);
+		packet_put_cstring(val);
+		packet_send();
+		free(name);
+	}
+
+	len = sshbuf_len(cmd);
 	if (len > 0) {
 		if (len > 900)
 			len = 900;
 		if (want_subsystem) {
 			debug("Sending subsystem: %.*s",
-			    len, (u_char*)buffer_ptr(cmd));
-			channel_request_start(id, "subsystem", 1);
-			client_expect_confirm(id, "subsystem", CONFIRM_CLOSE);
+			    len, (const u_char*)sshbuf_ptr(cmd));
+			channel_request_start(ssh, id, "subsystem", 1);
+			client_expect_confirm(ssh, id, "subsystem",
+			    CONFIRM_CLOSE);
 		} else {
 			debug("Sending command: %.*s",
-			    len, (u_char*)buffer_ptr(cmd));
-			channel_request_start(id, "exec", 1);
-			client_expect_confirm(id, "exec", CONFIRM_CLOSE);
+			    len, (const u_char*)sshbuf_ptr(cmd));
+			channel_request_start(ssh, id, "exec", 1);
+			client_expect_confirm(ssh, id, "exec", CONFIRM_CLOSE);
 		}
-		packet_put_string(buffer_ptr(cmd), buffer_len(cmd));
+		packet_put_string(sshbuf_ptr(cmd), sshbuf_len(cmd));
 		packet_send();
 	} else {
-		channel_request_start(id, "shell", 1);
-		client_expect_confirm(id, "shell", CONFIRM_CLOSE);
+		channel_request_start(ssh, id, "shell", 1);
+		client_expect_confirm(ssh, id, "shell", CONFIRM_CLOSE);
 		packet_send();
 	}
 }
 
 static void
-client_init_dispatch_20(void)
+client_init_dispatch(void)
 {
 	dispatch_init(&dispatch_protocol_error);
 
@@ -2699,45 +2321,6 @@
 	dispatch_set(SSH2_MSG_REQUEST_SUCCESS, &client_global_request_reply);
 }
 
-static void
-client_init_dispatch_13(void)
-{
-	dispatch_init(NULL);
-	dispatch_set(SSH_MSG_CHANNEL_CLOSE, &channel_input_close);
-	dispatch_set(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION, &channel_input_close_confirmation);
-	dispatch_set(SSH_MSG_CHANNEL_DATA, &channel_input_data);
-	dispatch_set(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation);
-	dispatch_set(SSH_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure);
-	dispatch_set(SSH_MSG_PORT_OPEN, &channel_input_port_open);
-	dispatch_set(SSH_SMSG_EXITSTATUS, &client_input_exit_status);
-	dispatch_set(SSH_SMSG_STDERR_DATA, &client_input_stderr_data);
-	dispatch_set(SSH_SMSG_STDOUT_DATA, &client_input_stdout_data);
-
-	dispatch_set(SSH_SMSG_AGENT_OPEN, options.forward_agent ?
-	    &client_input_agent_open : &deny_input_open);
-	dispatch_set(SSH_SMSG_X11_OPEN, options.forward_x11 ?
-	    &x11_input_open : &deny_input_open);
-}
-
-static void
-client_init_dispatch_15(void)
-{
-	client_init_dispatch_13();
-	dispatch_set(SSH_MSG_CHANNEL_CLOSE, &channel_input_ieof);
-	dispatch_set(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION, & channel_input_oclose);
-}
-
-static void
-client_init_dispatch(void)
-{
-	if (compat20)
-		client_init_dispatch_20();
-	else if (compat13)
-		client_init_dispatch_13();
-	else
-		client_init_dispatch_15();
-}
-
 void
 client_stop_mux(void)
 {
diff --git a/clientloop.h b/clientloop.h
index ae83aa8..bf79c87 100644
--- a/clientloop.h
+++ b/clientloop.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.h,v 1.33 2016/09/30 09:19:13 markus Exp $ */
+/* $OpenBSD: clientloop.h,v 1.36 2018/07/09 21:03:30 markus Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -37,28 +37,31 @@
 
 #include <termios.h>
 
+struct ssh;
+
 /* Client side main loop for the interactive session. */
-int	 client_loop(int, int, int);
-int	 client_x11_get_proto(const char *, const char *, u_int, u_int,
-	    char **, char **);
+int	 client_loop(struct ssh *, int, int, int);
+int	 client_x11_get_proto(struct ssh *, const char *, const char *,
+	    u_int, u_int, char **, char **);
 void	 client_global_request_reply_fwd(int, u_int32_t, void *);
-void	 client_session2_setup(int, int, int, const char *, struct termios *,
-	    int, Buffer *, char **);
-int	 client_request_tun_fwd(int, int, int);
+void	 client_session2_setup(struct ssh *, int, int, int,
+	    const char *, struct termios *, int, struct sshbuf *, char **);
+char	 *client_request_tun_fwd(struct ssh *, int, int, int);
 void	 client_stop_mux(void);
 
 /* Escape filter for protocol 2 sessions */
 void	*client_new_escape_filter_ctx(int);
-void	 client_filter_cleanup(int, void *);
-int	 client_simple_escape_filter(Channel *, char *, int);
+void	 client_filter_cleanup(struct ssh *, int, void *);
+int	 client_simple_escape_filter(struct ssh *, Channel *, char *, int);
 
 /* Global request confirmation callbacks */
-typedef void global_confirm_cb(int, u_int32_t seq, void *);
+typedef void global_confirm_cb(struct ssh *, int, u_int32_t, void *);
 void	 client_register_global_confirm(global_confirm_cb *, void *);
 
 /* Channel request confirmation callbacks */
 enum confirm_action { CONFIRM_WARN = 0, CONFIRM_CLOSE, CONFIRM_TTY };
-void client_expect_confirm(int, const char *, enum confirm_action);
+void client_expect_confirm(struct ssh *, int, const char *,
+    enum confirm_action);
 
 /* Multiplexing protocol version */
 #define SSHMUX_VER			4
@@ -73,8 +76,8 @@
 #define SSHMUX_COMMAND_CANCEL_FWD	7	/* Cancel forwarding(s) */
 #define SSHMUX_COMMAND_PROXY		8	/* Open new connection */
 
-void	muxserver_listen(void);
+void	muxserver_listen(struct ssh *);
 int	muxclient(const char *);
-void	mux_exit_message(Channel *, int);
-void	mux_tty_alloc_failed(Channel *);
+void	mux_exit_message(struct ssh *, Channel *, int);
+void	mux_tty_alloc_failed(struct ssh *ssh, Channel *);
 
diff --git a/compat.c b/compat.c
index 1e80cfa..0624dc6 100644
--- a/compat.c
+++ b/compat.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: compat.c,v 1.100 2017/02/03 23:01:19 djm Exp $ */
+/* $OpenBSD: compat.c,v 1.113 2018/08/13 02:41:05 djm Exp $ */
 /*
  * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl.  All rights reserved.
  *
@@ -32,31 +32,14 @@
 #include <stdarg.h>
 
 #include "xmalloc.h"
-#include "buffer.h"
 #include "packet.h"
 #include "compat.h"
 #include "log.h"
 #include "match.h"
 #include "kex.h"
 
-int compat13 = 0;
-int compat20 = 0;
 int datafellows = 0;
 
-void
-enable_compat20(void)
-{
-	if (compat20)
-		return;
-	debug("Enabling compatibility mode for protocol 2.0");
-	compat20 = 1;
-}
-void
-enable_compat13(void)
-{
-	debug("Enabling compatibility mode for protocol 1.3");
-	compat13 = 1;
-}
 /* datafellows bug compatibility */
 u_int
 compat_datafellows(const char *version)
@@ -66,83 +49,32 @@
 		char	*pat;
 		int	bugs;
 	} check[] = {
-		{ "OpenSSH-2.0*,"
-		  "OpenSSH-2.1*,"
-		  "OpenSSH_2.1*,"
-		  "OpenSSH_2.2*",	SSH_OLD_SESSIONID|SSH_BUG_BANNER|
-					SSH_OLD_DHGEX|SSH_BUG_NOREKEY|
-					SSH_BUG_EXTEOF|SSH_OLD_FORWARD_ADDR},
-		{ "OpenSSH_2.3.0*",	SSH_BUG_BANNER|SSH_BUG_BIGENDIANAES|
-					SSH_OLD_DHGEX|SSH_BUG_NOREKEY|
-					SSH_BUG_EXTEOF|SSH_OLD_FORWARD_ADDR},
-		{ "OpenSSH_2.3.*",	SSH_BUG_BIGENDIANAES|SSH_OLD_DHGEX|
-					SSH_BUG_NOREKEY|SSH_BUG_EXTEOF|
-					SSH_OLD_FORWARD_ADDR},
-		{ "OpenSSH_2.5.0p1*,"
-		  "OpenSSH_2.5.1p1*",
-					SSH_BUG_BIGENDIANAES|SSH_OLD_DHGEX|
-					SSH_BUG_NOREKEY|SSH_BUG_EXTEOF|
-					SSH_OLD_FORWARD_ADDR},
-		{ "OpenSSH_2.5.0*,"
-		  "OpenSSH_2.5.1*,"
-		  "OpenSSH_2.5.2*",	SSH_OLD_DHGEX|SSH_BUG_NOREKEY|
-					SSH_BUG_EXTEOF|SSH_OLD_FORWARD_ADDR},
-		{ "OpenSSH_2.5.3*",	SSH_BUG_NOREKEY|SSH_BUG_EXTEOF|
-					SSH_OLD_FORWARD_ADDR},
 		{ "OpenSSH_2.*,"
 		  "OpenSSH_3.0*,"
-		  "OpenSSH_3.1*",	SSH_BUG_EXTEOF|SSH_OLD_FORWARD_ADDR},
-		{ "OpenSSH_3.*",	SSH_OLD_FORWARD_ADDR },
-		{ "Sun_SSH_1.0*",	SSH_BUG_NOREKEY|SSH_BUG_EXTEOF},
-		{ "OpenSSH_4*",		0 },
-		{ "OpenSSH_5*",		SSH_NEW_OPENSSH|SSH_BUG_DYNAMIC_RPORT},
-		{ "OpenSSH_6.6.1*",	SSH_NEW_OPENSSH},
+		  "OpenSSH_3.1*",	SSH_BUG_EXTEOF|SSH_OLD_FORWARD_ADDR|
+					SSH_BUG_SIGTYPE},
+		{ "OpenSSH_3.*",	SSH_OLD_FORWARD_ADDR|SSH_BUG_SIGTYPE },
+		{ "Sun_SSH_1.0*",	SSH_BUG_NOREKEY|SSH_BUG_EXTEOF|
+					SSH_BUG_SIGTYPE},
+		{ "OpenSSH_2*,"
+		  "OpenSSH_3*,"
+		  "OpenSSH_4*",		SSH_BUG_SIGTYPE },
+		{ "OpenSSH_5*",		SSH_NEW_OPENSSH|SSH_BUG_DYNAMIC_RPORT|
+					SSH_BUG_SIGTYPE},
+		{ "OpenSSH_6.6.1*",	SSH_NEW_OPENSSH|SSH_BUG_SIGTYPE},
 		{ "OpenSSH_6.5*,"
-		  "OpenSSH_6.6*",	SSH_NEW_OPENSSH|SSH_BUG_CURVE25519PAD},
+		  "OpenSSH_6.6*",	SSH_NEW_OPENSSH|SSH_BUG_CURVE25519PAD|
+					SSH_BUG_SIGTYPE},
+		{ "OpenSSH_7.0*,"
+		  "OpenSSH_7.1*,"
+		  "OpenSSH_7.2*,"
+		  "OpenSSH_7.3*,"
+		  "OpenSSH_7.4*,"
+		  "OpenSSH_7.5*,"
+		  "OpenSSH_7.6*,"
+		  "OpenSSH_7.7*",	SSH_NEW_OPENSSH|SSH_BUG_SIGTYPE},
 		{ "OpenSSH*",		SSH_NEW_OPENSSH },
 		{ "*MindTerm*",		0 },
-		{ "2.1.0*",		SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
-					SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
-					SSH_BUG_RSASIGMD5|SSH_BUG_HBSERVICE|
-					SSH_BUG_FIRSTKEX },
-		{ "2.1 *",		SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
-					SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
-					SSH_BUG_RSASIGMD5|SSH_BUG_HBSERVICE|
-					SSH_BUG_FIRSTKEX },
-		{ "2.0.13*,"
-		  "2.0.14*,"
-		  "2.0.15*,"
-		  "2.0.16*,"
-		  "2.0.17*,"
-		  "2.0.18*,"
-		  "2.0.19*",		SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
-					SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
-					SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
-					SSH_BUG_PKOK|SSH_BUG_RSASIGMD5|
-					SSH_BUG_HBSERVICE|SSH_BUG_OPENFAILURE|
-					SSH_BUG_DUMMYCHAN|SSH_BUG_FIRSTKEX },
-		{ "2.0.11*,"
-		  "2.0.12*",		SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
-					SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
-					SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
-					SSH_BUG_PKAUTH|SSH_BUG_PKOK|
-					SSH_BUG_RSASIGMD5|SSH_BUG_OPENFAILURE|
-					SSH_BUG_DUMMYCHAN|SSH_BUG_FIRSTKEX },
-		{ "2.0.*",		SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
-					SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
-					SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
-					SSH_BUG_PKAUTH|SSH_BUG_PKOK|
-					SSH_BUG_RSASIGMD5|SSH_BUG_OPENFAILURE|
-					SSH_BUG_DERIVEKEY|SSH_BUG_DUMMYCHAN|
-					SSH_BUG_FIRSTKEX },
-		{ "2.2.0*,"
-		  "2.3.0*",		SSH_BUG_HMAC|SSH_BUG_DEBUG|
-					SSH_BUG_RSASIGMD5|SSH_BUG_FIRSTKEX },
-		{ "2.3.*",		SSH_BUG_DEBUG|SSH_BUG_RSASIGMD5|
-					SSH_BUG_FIRSTKEX },
-		{ "2.4",		SSH_OLD_SESSIONID },	/* Van Dyke */
-		{ "2.*",		SSH_BUG_DEBUG|SSH_BUG_FIRSTKEX|
-					SSH_BUG_RFWD_ADDR },
 		{ "3.0.*",		SSH_BUG_DEBUG },
 		{ "3.0 SecureCRT*",	SSH_OLD_SESSIONID },
 		{ "1.7 SecureFX*",	SSH_OLD_SESSIONID },
@@ -193,15 +125,22 @@
 		  "TTSSH/2.72*",	SSH_BUG_HOSTKEYS },
 		{ "WinSCP_release_4*,"
 		  "WinSCP_release_5.0*,"
-		  "WinSCP_release_5.1*,"
-		  "WinSCP_release_5.5*,"
-		  "WinSCP_release_5.6*,"
+		  "WinSCP_release_5.1,"
+		  "WinSCP_release_5.1.*,"
+		  "WinSCP_release_5.5,"
+		  "WinSCP_release_5.5.*,"
+		  "WinSCP_release_5.6,"
+		  "WinSCP_release_5.6.*,"
 		  "WinSCP_release_5.7,"
 		  "WinSCP_release_5.7.1,"
 		  "WinSCP_release_5.7.2,"
 		  "WinSCP_release_5.7.3,"
 		  "WinSCP_release_5.7.4",
 					SSH_OLD_DHGEX },
+		{ "ConfD-*",
+					SSH_BUG_UTF8TTYMODE },
+		{ "Twisted_*",		0 },
+		{ "Twisted*",		SSH_BUG_DEBUG },
 		{ NULL,			0 }
 	};
 
@@ -232,13 +171,6 @@
 		return ret;
 	for ((p = strsep(&q, SEP)); p && *p != '\0'; (p = strsep(&q, SEP))) {
 		switch (atoi(p)) {
-		case 1:
-#ifdef WITH_SSH1
-			if (ret == SSH_PROTO_UNKNOWN)
-				ret |= SSH_PROTO_1_PREFERRED;
-			ret |= SSH_PROTO_1;
-#endif
-			break;
 		case 2:
 			ret |= SSH_PROTO_2;
 			break;
@@ -257,8 +189,8 @@
 	if (!(datafellows & SSH_BUG_BIGENDIANAES))
 		return cipher_prop;
 	debug2("%s: original cipher proposal: %s", __func__, cipher_prop);
-	if ((cipher_prop = match_filter_list(cipher_prop, "aes*")) == NULL)
-		fatal("match_filter_list failed");
+	if ((cipher_prop = match_filter_blacklist(cipher_prop, "aes*")) == NULL)
+		fatal("match_filter_blacklist failed");
 	debug2("%s: compat cipher proposal: %s", __func__, cipher_prop);
 	if (*cipher_prop == '\0')
 		fatal("No supported ciphers found");
@@ -271,8 +203,8 @@
 	if (!(datafellows & SSH_BUG_RSASIGMD5))
 		return pkalg_prop;
 	debug2("%s: original public key proposal: %s", __func__, pkalg_prop);
-	if ((pkalg_prop = match_filter_list(pkalg_prop, "ssh-rsa")) == NULL)
-		fatal("match_filter_list failed");
+	if ((pkalg_prop = match_filter_blacklist(pkalg_prop, "ssh-rsa")) == NULL)
+		fatal("match_filter_blacklist failed");
 	debug2("%s: compat public key proposal: %s", __func__, pkalg_prop);
 	if (*pkalg_prop == '\0')
 		fatal("No supported PK algorithms found");
@@ -286,14 +218,14 @@
 		return p;
 	debug2("%s: original KEX proposal: %s", __func__, p);
 	if ((datafellows & SSH_BUG_CURVE25519PAD) != 0)
-		if ((p = match_filter_list(p,
+		if ((p = match_filter_blacklist(p,
 		    "curve25519-sha256@libssh.org")) == NULL)
-			fatal("match_filter_list failed");
+			fatal("match_filter_blacklist failed");
 	if ((datafellows & SSH_OLD_DHGEX) != 0) {
-		if ((p = match_filter_list(p,
+		if ((p = match_filter_blacklist(p,
 		    "diffie-hellman-group-exchange-sha256,"
 		    "diffie-hellman-group-exchange-sha1")) == NULL)
-			fatal("match_filter_list failed");
+			fatal("match_filter_blacklist failed");
 	}
 	debug2("%s: compat KEX proposal: %s", __func__, p);
 	if (*p == '\0')
diff --git a/compat.h b/compat.h
index 2be290a..d611d33 100644
--- a/compat.h
+++ b/compat.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: compat.h,v 1.48 2015/05/26 23:23:40 dtucker Exp $ */
+/* $OpenBSD: compat.h,v 1.54 2018/08/13 02:41:05 djm Exp $ */
 
 /*
  * Copyright (c) 1999, 2000, 2001 Markus Friedl.  All rights reserved.
@@ -32,46 +32,42 @@
 #define	SSH_PROTO_1_PREFERRED	0x02
 #define	SSH_PROTO_2		0x04
 
-#define SSH_BUG_SIGBLOB		0x00000001
-#define SSH_BUG_PKSERVICE	0x00000002
-#define SSH_BUG_HMAC		0x00000004
-#define SSH_BUG_X11FWD		0x00000008
+#define SSH_BUG_UTF8TTYMODE	0x00000001
+#define SSH_BUG_SIGTYPE		0x00000002
+/* #define unused		0x00000004 */
+/* #define unused		0x00000008 */
 #define SSH_OLD_SESSIONID	0x00000010
-#define SSH_BUG_PKAUTH		0x00000020
+/* #define unused		0x00000020 */
 #define SSH_BUG_DEBUG		0x00000040
-#define SSH_BUG_BANNER		0x00000080
+/* #define unused		0x00000080 */
 #define SSH_BUG_IGNOREMSG	0x00000100
-#define SSH_BUG_PKOK		0x00000200
+/* #define unused		0x00000200 */
 #define SSH_BUG_PASSWORDPAD	0x00000400
 #define SSH_BUG_SCANNER		0x00000800
 #define SSH_BUG_BIGENDIANAES	0x00001000
 #define SSH_BUG_RSASIGMD5	0x00002000
 #define SSH_OLD_DHGEX		0x00004000
 #define SSH_BUG_NOREKEY		0x00008000
-#define SSH_BUG_HBSERVICE	0x00010000
-#define SSH_BUG_OPENFAILURE	0x00020000
-#define SSH_BUG_DERIVEKEY	0x00040000
-#define SSH_BUG_DUMMYCHAN	0x00100000
+/* #define unused		0x00010000 */
+/* #define unused		0x00020000 */
+/* #define unused		0x00040000 */
+/* #define unused		0x00100000 */
 #define SSH_BUG_EXTEOF		0x00200000
 #define SSH_BUG_PROBE		0x00400000
-#define SSH_BUG_FIRSTKEX	0x00800000
+/* #define unused		0x00800000 */
 #define SSH_OLD_FORWARD_ADDR	0x01000000
-#define SSH_BUG_RFWD_ADDR	0x02000000
+/* #define unused		0x02000000 */
 #define SSH_NEW_OPENSSH		0x04000000
 #define SSH_BUG_DYNAMIC_RPORT	0x08000000
 #define SSH_BUG_CURVE25519PAD	0x10000000
 #define SSH_BUG_HOSTKEYS	0x20000000
 #define SSH_BUG_DHGEX_LARGE	0x40000000
 
-void     enable_compat13(void);
-void     enable_compat20(void);
 u_int    compat_datafellows(const char *);
 int	 proto_spec(const char *);
 char	*compat_cipher_proposal(char *);
 char	*compat_pkalg_proposal(char *);
 char	*compat_kex_proposal(char *);
 
-extern int compat13;
-extern int compat20;
 extern int datafellows;
 #endif
diff --git a/configure.ac b/configure.ac
index 972addf..83e5307 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,3 @@
-# $Id: configure.ac,v 1.583 2014/08/26 20:32:01 djm Exp $
 #
 # Copyright (c) 1999-2004 Damien Miller
 #
@@ -30,12 +29,11 @@
 AC_PROG_RANLIB
 AC_PROG_INSTALL
 AC_PROG_EGREP
+AC_PROG_MKDIR_P
 AC_CHECK_TOOLS([AR], [ar])
 AC_PATH_PROG([CAT], [cat])
 AC_PATH_PROG([KILL], [kill])
-AC_PATH_PROGS([PERL], [perl5 perl])
 AC_PATH_PROG([SED], [sed])
-AC_SUBST([PERL])
 AC_PATH_PROG([ENT], [ent])
 AC_SUBST([ENT])
 AC_PATH_PROG([TEST_MINUS_S_SH], [bash])
@@ -85,9 +83,11 @@
 		[Full path of your "passwd" program])
 fi
 
-if test -z "$LD" ; then
-	LD=$CC
-fi
+dnl Since autoconf doesn't support it very well,  we no longer allow users to
+dnl override LD, however keeping the hook here for now in case there's a use
+dnl use case we overlooked and someone needs to re-enable it.  Unless a good
+dnl reason is found we'll be removing this in future.
+LD="$CC"
 AC_SUBST([LD])
 
 AC_C_INLINE
@@ -109,13 +109,10 @@
 ])
 
 openssl=yes
-ssh1=no
-COMMENT_OUT_RSA1="#no ssh1#"
 AC_ARG_WITH([openssl],
 	[  --without-openssl       Disable use of OpenSSL; use only limited internal crypto **EXPERIMENTAL** ],
 	[  if test "x$withval" = "xno" ; then
 		openssl=no
-		ssh1=no
 	   fi
 	]
 )
@@ -127,31 +124,6 @@
 	AC_MSG_RESULT([no])
 fi
 
-AC_ARG_WITH([ssh1],
-	[  --with-ssh1             Enable support for SSH protocol 1],
-	[
-		if test "x$withval" = "xyes" ; then
-			if test "x$openssl" = "xno" ; then
-				AC_MSG_ERROR([Cannot enable SSH protocol 1 with OpenSSL disabled])
-			fi
-			ssh1=yes
-			COMMENT_OUT_RSA1=""
-		elif test "x$withval" = "xno" ; then
-			ssh1=no
-		else
-			AC_MSG_ERROR([unknown --with-ssh1 argument])
-		fi
-	]
-)
-AC_MSG_CHECKING([whether SSH protocol 1 support is enabled])
-if test "x$ssh1" = "xyes" ; then
-	AC_MSG_RESULT([yes])
-	AC_DEFINE_UNQUOTED([WITH_SSH1], [1], [include SSH protocol version 1 support])
-	AC_SUBST([COMMENT_OUT_RSA1])
-else
-	AC_MSG_RESULT([no])
-fi
-
 use_stack_protector=1
 use_toolchain_hardening=1
 AC_ARG_WITH([stackprotect],
@@ -179,6 +151,7 @@
 CFLAGS="$saved_CFLAGS"
 
 if test "$GCC" = "yes" || test "$GCC" = "egcs"; then
+	OSSH_CHECK_CFLAG_COMPILE([-pipe])
 	OSSH_CHECK_CFLAG_COMPILE([-Qunused-arguments])
 	OSSH_CHECK_CFLAG_COMPILE([-Wunknown-warning-option])
 	OSSH_CHECK_CFLAG_COMPILE([-Wall])
@@ -190,8 +163,19 @@
 	OSSH_CHECK_CFLAG_COMPILE([-Wpointer-sign], [-Wno-pointer-sign])
 	OSSH_CHECK_CFLAG_COMPILE([-Wunused-result], [-Wno-unused-result])
 	OSSH_CHECK_CFLAG_COMPILE([-fno-strict-aliasing])
-	OSSH_CHECK_CFLAG_COMPILE([-D_FORTIFY_SOURCE=2])
     if test "x$use_toolchain_hardening" = "x1"; then
+	# Cygwin GCC 7.x allows thunking on the CLI, but produces non-working
+	# code.  Unfortunately you only notice this at link time.
+	case "$host" in
+	*-*-cygwin*) ;;
+	*)
+	    OSSH_CHECK_CFLAG_COMPILE([-mfunction-return=thunk]) # gcc
+	    OSSH_CHECK_CFLAG_COMPILE([-mindirect-branch=thunk]) # gcc
+	    ;;
+	esac
+	OSSH_CHECK_CFLAG_COMPILE([-mretpoline]) # clang
+	OSSH_CHECK_LDFLAG_LINK([-Wl,-z,retpolineplt])
+	OSSH_CHECK_CFLAG_COMPILE([-D_FORTIFY_SOURCE=2])
 	OSSH_CHECK_LDFLAG_LINK([-Wl,-z,relro])
 	OSSH_CHECK_LDFLAG_LINK([-Wl,-z,now])
 	OSSH_CHECK_LDFLAG_LINK([-Wl,-z,noexecstack])
@@ -290,6 +274,18 @@
 	 [compiler does not accept __attribute__ on return types]) ]
 )
 
+AC_MSG_CHECKING([if compiler allows __attribute__ prototype args])
+AC_COMPILE_IFELSE(
+    [AC_LANG_PROGRAM([[
+#include <stdlib.h>
+typedef void foo(const char *, ...) __attribute__((format(printf, 1, 2)));]],
+    [[ exit(0); ]])],
+    [ AC_MSG_RESULT([yes]) ],
+    [ AC_MSG_RESULT([no])
+      AC_DEFINE(NO_ATTRIBUTE_ON_PROTOTYPE_ARGS, 1,
+	 [compiler does not accept __attribute__ on prototype args]) ]
+)
+
 if test "x$no_attrib_nonnull" != "x1" ; then
 	AC_DEFINE([HAVE_ATTRIBUTE__NONNULL__], [1], [Have attribute nonnull])
 fi
@@ -316,6 +312,16 @@
 		fi
 	]
 )
+
+AC_ARG_WITH([cflags-after],
+	[  --with-cflags-after     Specify additional flags to pass to compiler after configure],
+	[
+		if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
+		    test "x${withval}" != "xyes"; then
+			CFLAGS_AFTER="$withval"
+		fi
+	]
+)
 AC_ARG_WITH([cppflags],
 	[  --with-cppflags         Specify additional flags to pass to preprocessor] ,
 	[
@@ -334,6 +340,15 @@
 		fi
 	]
 )
+AC_ARG_WITH([ldflags-after],
+	[  --with-ldflags-after    Specify additional flags to pass to linker after configure],
+	[
+		if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
+		    test "x${withval}" != "xyes"; then
+			LDFLAGS_AFTER="$withval"
+		fi
+	]
+)
 AC_ARG_WITH([libs],
 	[  --with-libs             Specify additional libraries to link with],
 	[
@@ -371,6 +386,7 @@
 	glob.h \
 	ia.h \
 	iaf.h \
+	ifaddrs.h \
 	inttypes.h \
 	langinfo.h \
 	limits.h \
@@ -394,18 +410,19 @@
 	stdint.h \
 	string.h \
 	strings.h \
-	sys/audit.h \
 	sys/bitypes.h \
 	sys/bsdtty.h \
-	sys/capability.h \
 	sys/cdefs.h \
 	sys/dir.h \
+	sys/file.h \
 	sys/mman.h \
+	sys/label.h \
 	sys/ndir.h \
 	sys/poll.h \
 	sys/prctl.h \
 	sys/pstat.h \
 	sys/ptrace.h \
+	sys/random.h \
 	sys/select.h \
 	sys/stat.h \
 	sys/stream.h \
@@ -415,6 +432,7 @@
 	sys/sysmacros.h \
 	sys/time.h \
 	sys/timers.h \
+	sys/vfs.h \
 	time.h \
 	tmpdir.h \
 	ttyent.h \
@@ -429,6 +447,37 @@
 	wchar.h \
 ])
 
+# On some platforms (eg SunOS4) sys/audit.h requires sys/[time|types|label.h]
+# to be included first.
+AC_CHECK_HEADERS([sys/audit.h], [], [], [
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_LABEL_H
+# include <sys/label.h>
+#endif
+])
+
+# sys/capsicum.h requires sys/types.h
+AC_CHECK_HEADERS([sys/capsicum.h], [], [], [
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+])
+
+# net/route.h requires sys/socket.h and sys/types.h.
+# sys/sysctl.h also requires sys/param.h
+AC_CHECK_HEADERS([net/route.h sys/sysctl.h], [], [], [
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <sys/param.h>
+#include <sys/socket.h>
+])
+
 # lastlog.h requires sys/time.h to be included first on Solaris
 AC_CHECK_HEADERS([lastlog.h], [], [], [
 #ifdef HAVE_SYS_TIME_H
@@ -475,7 +524,7 @@
 	# Some versions of VAC won't allow macro redefinitions at
 	# -qlanglevel=ansi, and autoconf 2.60 sometimes insists on using that
 	# particularly with older versions of vac or xlc.
-	# It also throws errors about null macro argments, but these are
+	# It also throws errors about null macro arguments, but these are
 	# not fatal.
 	AC_MSG_CHECKING([if compiler allows macro redefinitions])
 	AC_COMPILE_IFELSE(
@@ -486,7 +535,6 @@
 	    [ AC_MSG_RESULT([yes]) ],
 	    [ AC_MSG_RESULT([no])
 	      CC="`echo $CC | sed 's/-qlanglvl\=ansi//g'`"
-	      LD="`echo $LD | sed 's/-qlanglvl\=ansi//g'`"
 	      CFLAGS="`echo $CFLAGS | sed 's/-qlanglvl\=ansi//g'`"
 	      CPPFLAGS="`echo $CPPFLAGS | sed 's/-qlanglvl\=ansi//g'`"
 	    ]
@@ -564,6 +612,8 @@
 	    [AIX 5.2 and 5.3 (and presumably newer) require this])
 	AC_DEFINE([PTY_ZEROREAD], [1], [read(1) can return 0 for a non-closed fd])
 	AC_DEFINE([PLATFORM_SYS_DIR_UID], 2, [System dirs owned by bin (uid 2)])
+	AC_DEFINE([BROKEN_STRNDUP], 1, [strndup broken, see APAR IY61211])
+	AC_DEFINE([BROKEN_STRNLEN], 1, [strnlen broken, see APAR IY62551])
 	;;
 *-*-android*)
 	AC_DEFINE([DISABLE_UTMP], [1], [Define if you don't want to use utmp])
@@ -712,7 +762,7 @@
 	PATH="$PATH:/usr/etc"
 	AC_DEFINE([WITH_IRIX_ARRAY], [1],
 		[Define if you have/want arrays
-		(cluster-wide session managment, not C arrays)])
+		(cluster-wide session management, not C arrays)])
 	AC_DEFINE([WITH_IRIX_PROJECT], [1],
 		[Define if you want IRIX project management])
 	AC_DEFINE([WITH_IRIX_AUDIT], [1],
@@ -771,8 +821,36 @@
 		AC_DEFINE([SSH_TUN_PREPEND_AF], [1],
 		    [Prepend the address family to IP tunnel traffic])
 	fi
+	AC_CHECK_HEADER([linux/if.h],
+	    AC_DEFINE([SYS_RDOMAIN_LINUX], [1],
+		[Support routing domains using Linux VRF]), [], [
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.H>
+#endif
+	    ])
 	AC_CHECK_HEADERS([linux/seccomp.h linux/filter.h linux/audit.h], [],
 	    [], [#include <linux/types.h>])
+	# Obtain MIPS ABI
+	case "$host" in
+	mips*)
+		AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if _MIPS_SIM != _ABIO32
+#error
+#endif
+			]])],[mips_abi="o32"],[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if _MIPS_SIM != _ABIN32
+#error
+#endif
+				]])],[mips_abi="n32"],[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if _MIPS_SIM != _ABI64
+#error
+#endif
+					]])],[mips_abi="n64"],[AC_MSG_ERROR([unknown MIPS ABI])
+				])
+			])
+		])
+		;;
+	esac
 	AC_MSG_CHECKING([for seccomp architecture])
 	seccomp_audit_arch=
 	case "$host" in
@@ -807,10 +885,24 @@
 		seccomp_audit_arch=AUDIT_ARCH_MIPSEL
 		;;
 	mips64-*)
-		seccomp_audit_arch=AUDIT_ARCH_MIPS64
+		case "$mips_abi" in
+		"n32")
+			seccomp_audit_arch=AUDIT_ARCH_MIPS64N32
+			;;
+		"n64")
+			seccomp_audit_arch=AUDIT_ARCH_MIPS64
+			;;
+		esac
 		;;
 	mips64el-*)
-		seccomp_audit_arch=AUDIT_ARCH_MIPSEL64
+		case "$mips_abi" in
+		"n32")
+			seccomp_audit_arch=AUDIT_ARCH_MIPSEL64N32
+			;;
+		"n64")
+			seccomp_audit_arch=AUDIT_ARCH_MIPSEL64
+			;;
+		esac
 		;;
 	esac
 	if test "x$seccomp_audit_arch" != "x" ; then
@@ -961,6 +1053,7 @@
 	conf_wtmp_location=/var/adm/wtmp
 	conf_lastlog_location=/var/adm/lastlog
 	AC_DEFINE([USE_PIPES])
+	AC_DEFINE([DISABLE_UTMPX], [1], [no utmpx])
 	;;
 *-ncr-sysv*)
 	LIBS="$LIBS -lc89"
@@ -1007,21 +1100,18 @@
 	AC_DEFINE([BROKEN_SETREUID])
 	AC_DEFINE([BROKEN_SETREGID])
 	AC_DEFINE([PASSWD_NEEDS_USERNAME])
+	AC_DEFINE([BROKEN_TCGETATTR_ICANON])
 	TEST_SHELL=$SHELL	# let configure find us a capable shell
+	check_for_libcrypt_later=1
 	case "$host" in
 	*-*-sysv5SCO_SV*)	# SCO OpenServer 6.x
 		maildir=/var/spool/mail
-		AC_DEFINE([BROKEN_LIBIAF], [1],
-			[ia_uinfo routines not supported by OS yet])
 		AC_DEFINE([BROKEN_UPDWTMPX])
 		AC_CHECK_LIB([prot], [getluid], [ LIBS="$LIBS -lprot"
 			AC_CHECK_FUNCS([getluid setluid], , , [-lprot])
-			AC_DEFINE([HAVE_SECUREWARE])
-			AC_DEFINE([DISABLE_SHADOW])
 			], , )
 		;;
 	*)	AC_DEFINE([LOCKED_PASSWD_STRING], ["*LK*"])
-		check_for_libcrypt_later=1
 		;;
 	esac
 	;;
@@ -1054,40 +1144,6 @@
 	TEST_SHELL=$SHELL	# let configure find us a capable shell
 	SKIP_DISABLE_LASTLOG_DEFINE=yes
 	;;
-*-*-unicosmk*)
-	AC_DEFINE([NO_SSH_LASTLOG], [1],
-		[Define if you don't want to use lastlog in session.c])
-	AC_DEFINE([SETEUID_BREAKS_SETUID])
-	AC_DEFINE([BROKEN_SETREUID])
-	AC_DEFINE([BROKEN_SETREGID])
-	AC_DEFINE([USE_PIPES])
-	AC_DEFINE([DISABLE_FD_PASSING])
-	LDFLAGS="$LDFLAGS"
-	LIBS="$LIBS -lgen -lrsc -lshare -luex -lacm"
-	MANTYPE=cat
-	;;
-*-*-unicosmp*)
-	AC_DEFINE([SETEUID_BREAKS_SETUID])
-	AC_DEFINE([BROKEN_SETREUID])
-	AC_DEFINE([BROKEN_SETREGID])
-	AC_DEFINE([WITH_ABBREV_NO_TTY])
-	AC_DEFINE([USE_PIPES])
-	AC_DEFINE([DISABLE_FD_PASSING])
-	LDFLAGS="$LDFLAGS"
-	LIBS="$LIBS -lgen -lacid -ldb"
-	MANTYPE=cat
-	;;
-*-*-unicos*)
-	AC_DEFINE([SETEUID_BREAKS_SETUID])
-	AC_DEFINE([BROKEN_SETREUID])
-	AC_DEFINE([BROKEN_SETREGID])
-	AC_DEFINE([USE_PIPES])
-	AC_DEFINE([DISABLE_FD_PASSING])
-	AC_DEFINE([NO_SSH_LASTLOG])
-	LDFLAGS="$LDFLAGS -Wl,-Dmsglevel=334:fatal"
-	LIBS="$LIBS -lgen -lrsc -lshare -luex -lacm"
-	MANTYPE=cat
-	;;
 *-dec-osf*)
 	AC_MSG_CHECKING([for Digital Unix SIA])
 	no_osfsia=""
@@ -1332,7 +1388,32 @@
 AC_SEARCH_LIBS([inet_ntop], [resolv nsl])
 AC_SEARCH_LIBS([gethostbyname], [resolv nsl])
 
+# "Particular Function Checks"
+# see https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Particular-Functions.html
 AC_FUNC_STRFTIME
+AC_FUNC_MALLOC
+AC_FUNC_REALLOC
+# autoconf doesn't have AC_FUNC_CALLOC so fake it if malloc returns NULL;
+AC_MSG_CHECKING([if calloc(0, N) returns non-null])
+AC_RUN_IFELSE(
+	[AC_LANG_PROGRAM(
+		[[ #include <stdlib.h> ]],
+		[[ void *p = calloc(0, 1); exit(p == NULL); ]]
+	)],
+	[ func_calloc_0_nonnull=yes ],
+	[ func_calloc_0_nonnull=no ],
+	[ AC_MSG_WARN([cross compiling: assuming same as malloc])
+	  func_calloc_0_nonnull="$ac_cv_func_malloc_0_nonnull"]
+)
+AC_MSG_RESULT([$func_calloc_0_nonnull])
+
+if test "x$func_calloc_0_nonnull" = "xyes"; then
+	AC_DEFINE(HAVE_CALLOC, 1, [calloc(0, x) returns non-null])
+else
+	AC_DEFINE(HAVE_CALLOC, 0, [calloc(0, x) returns NULL])
+	AC_DEFINE(calloc, rpl_calloc,
+	    [Define to rpl_calloc if the replacement function should be used.])
+fi
 
 # Check for ALTDIRFUNC glob() extension
 AC_MSG_CHECKING([for GLOB_ALTDIRFUNC support])
@@ -1421,55 +1502,6 @@
 	AC_MSG_RESULT([no])
 fi
 
-# Check whether user wants S/Key support
-SKEY_MSG="no"
-AC_ARG_WITH([skey],
-	[  --with-skey[[=PATH]]      Enable S/Key support (optionally in PATH)],
-	[
-		if test "x$withval" != "xno" ; then
-
-			if test "x$withval" != "xyes" ; then
-				CPPFLAGS="$CPPFLAGS -I${withval}/include"
-				LDFLAGS="$LDFLAGS -L${withval}/lib"
-			fi
-
-			AC_DEFINE([SKEY], [1], [Define if you want S/Key support])
-			LIBS="-lskey $LIBS"
-			SKEY_MSG="yes"
-
-			AC_MSG_CHECKING([for s/key support])
-			AC_LINK_IFELSE(
-				[AC_LANG_PROGRAM([[
-#include <stdio.h>
-#include <skey.h>
-				]], [[
-	char *ff = skey_keyinfo(""); ff="";
-	exit(0);
-				]])],
-				[AC_MSG_RESULT([yes])],
-				[
-					AC_MSG_RESULT([no])
-					AC_MSG_ERROR([** Incomplete or missing s/key libraries.])
-				])
-			AC_MSG_CHECKING([if skeychallenge takes 4 arguments])
-			AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-#include <stdio.h>
-#include <skey.h>
-				]], [[
-	(void)skeychallenge(NULL,"name","",0);
-				]])],
-			[
-				AC_MSG_RESULT([yes])
-				AC_DEFINE([SKEYCHALLENGE_4ARG], [1],
-					[Define if your skeychallenge()
-					function takes 4 arguments (NetBSD)])],
-			[
-				AC_MSG_RESULT([no])
-			])
-		fi
-	]
-)
-
 # Check whether user wants to use ldns
 LDNS_MSG="no"
 AC_ARG_WITH(ldns,
@@ -1478,7 +1510,7 @@
 	ldns=""
 	if test "x$withval" = "xyes" ; then
 		AC_PATH_TOOL([LDNSCONFIG], [ldns-config], [no])
-		if test "x$PKGCONFIG" = "xno"; then
+		if test "x$LDNSCONFIG" = "xno"; then
 			CPPFLAGS="$CPPFLAGS -I${withval}/include"
 			LDFLAGS="$LDFLAGS -L${withval}/lib"
 			LIBS="-lldns $LIBS"
@@ -1486,6 +1518,7 @@
 		else
 			LIBS="$LIBS `$LDNSCONFIG --libs`"
 			CPPFLAGS="$CPPFLAGS `$LDNSCONFIG --cflags`"
+			ldns=yes
 		fi
 	elif test "x$withval" != "xno" ; then
 			CPPFLAGS="$CPPFLAGS -I${withval}/include"
@@ -1685,6 +1718,7 @@
 	bcrypt_pbkdf \
 	bindresvport_sa \
 	blf_enc \
+	bzero \
 	cap_rights_limit \
 	clock \
 	closefrom \
@@ -1695,21 +1729,26 @@
 	explicit_bzero \
 	fchmod \
 	fchown \
+	flock \
 	freeaddrinfo \
+	freezero \
 	fstatfs \
 	fstatvfs \
 	futimes \
 	getaddrinfo \
 	getcwd \
 	getgrouplist \
+	getline \
 	getnameinfo \
 	getopt \
+	getpagesize \
 	getpeereid \
 	getpeerucred \
 	getpgid \
-	getpgrp \
 	_getpty \
 	getrlimit \
+	getrandom \
+	getsid \
 	getttyent \
 	glob \
 	group_from_gid \
@@ -1717,6 +1756,7 @@
 	inet_ntoa \
 	inet_ntop \
 	innetgr \
+	llabs \
 	login_getcapbool \
 	md5_crypt \
 	memmove \
@@ -1730,9 +1770,11 @@
 	poll \
 	prctl \
 	pstat \
+	raise \
 	readpassphrase \
 	reallocarray \
 	recvmsg \
+	recallocarray \
 	rresvport_af \
 	sendmsg \
 	setdtablesize \
@@ -1763,9 +1805,11 @@
 	strlcat \
 	strlcpy \
 	strmode \
+	strndup \
 	strnlen \
 	strnvis \
 	strptime \
+	strsignal \
 	strtonum \
 	strtoll \
 	strtoul \
@@ -1785,6 +1829,8 @@
 	warn \
 ])
 
+AC_CHECK_DECLS([bzero])
+
 dnl Wide character support.
 AC_CHECK_FUNCS([mblen mbtowc nl_langinfo wcwidth])
 
@@ -1827,7 +1873,10 @@
 if test "x$openssl" = "xyes" && test "x$disable_pkcs11" = "x"; then
 	# PKCS#11 support requires dlopen() and co
 	AC_SEARCH_LIBS([dlopen], [dl],
-	    [AC_DEFINE([ENABLE_PKCS11], [], [Enable for PKCS#11 support])]
+	    AC_CHECK_DECL([RTLD_NOW],
+		AC_DEFINE([ENABLE_PKCS11], [], [Enable for PKCS#11 support]),
+		[], [#include <dlfcn.h>]
+	    )
 	)
 fi
 
@@ -1854,7 +1903,6 @@
 	[AC_DEFINE([HAVE_CLOCK_GETTIME], [1], [Have clock_gettime])])
 
 dnl Make sure prototypes are defined for these before using them.
-AC_CHECK_DECL([getrusage], [AC_CHECK_FUNCS([getrusage])])
 AC_CHECK_DECL([strsep],
 	[AC_CHECK_FUNCS([strsep])],
 	[],
@@ -1890,7 +1938,7 @@
 #endif
 	])
 
-AC_CHECK_DECLS([writev], , , [
+AC_CHECK_DECLS([readv, writev], , , [
 #include <sys/types.h>
 #include <sys/uio.h>
 #include <unistd.h>
@@ -2007,6 +2055,16 @@
 	)
 ])
 
+AC_MSG_CHECKING([for working fflush(NULL)])
+AC_RUN_IFELSE(
+	[AC_LANG_PROGRAM([[#include <stdio.h>]], [[fflush(NULL); exit(0);]])],
+	AC_MSG_RESULT([yes]),
+	[AC_MSG_RESULT([no])
+	 AC_DEFINE([FFLUSH_NULL_BUG], [1],
+	    [define if fflush(NULL) does not work])],
+	AC_MSG_WARN([cross compiling: assuming working])
+)
+
 dnl    Checks for time functions
 AC_CHECK_FUNCS([gettimeofday time])
 dnl    Checks for utmp functions
@@ -2378,7 +2436,16 @@
 	)
 fi
 
-AC_FUNC_GETPGRP
+AC_CHECK_FUNCS([getpgrp],[
+	AC_MSG_CHECKING([if getpgrp accepts zero args])
+	AC_COMPILE_IFELSE(
+		[AC_LANG_PROGRAM([[$ac_includes_default]], [[ getpgrp(); ]])],
+		[ AC_MSG_RESULT([yes])
+		  AC_DEFINE([GETPGRP_VOID], [1], [getpgrp takes zero args])],
+		[ AC_MSG_RESULT([no])
+		  AC_DEFINE([GETPGRP_VOID], [0], [getpgrp takes one arg])]
+	)
+])
 
 # Search for OpenSSL
 saved_CPPFLAGS="$CPPFLAGS"
@@ -2531,10 +2598,14 @@
 			ssl_library_ver=`cat conftest.ssllibver`
 			# Check version is supported.
 			case "$ssl_library_ver" in
-				0090[[0-7]]*|009080[[0-5]]*)
-					AC_MSG_ERROR([OpenSSL >= 0.9.8f required (have "$ssl_library_ver")])
+				10000*|0*)
+					AC_MSG_ERROR([OpenSSL >= 1.0.1 required (have "$ssl_library_ver")])
 			                ;;
-			        *) ;;
+				100*)   ;; # 1.0.x
+				200*)   ;; # LibreSSL
+			        *)
+					AC_MSG_ERROR([OpenSSL >= 1.1.0 is not yet supported (have "$ssl_library_ver")])
+			                ;;
 			esac
 			AC_MSG_RESULT([$ssl_library_ver])
 		],
@@ -2767,9 +2838,6 @@
 	#include <openssl/evp.h>
 	#include <openssl/objects.h>
 	#include <openssl/opensslv.h>
-	#if OPENSSL_VERSION_NUMBER < 0x0090807f /* 0.9.8g */
-	# error "OpenSSL < 0.9.8g has unreliable ECC code"
-	#endif
 		]], [[
 		EC_KEY *e = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
 		const EVP_MD *m = EVP_sha256(); /* We need this too */
@@ -2788,9 +2856,6 @@
 	#include <openssl/evp.h>
 	#include <openssl/objects.h>
 	#include <openssl/opensslv.h>
-	#if OPENSSL_VERSION_NUMBER < 0x0090807f /* 0.9.8g */
-	# error "OpenSSL < 0.9.8g has unreliable ECC code"
-	#endif
 		]], [[
 		EC_KEY *e = EC_KEY_new_by_curve_name(NID_secp384r1);
 		const EVP_MD *m = EVP_sha384(); /* We need this too */
@@ -2809,9 +2874,6 @@
 	#include <openssl/evp.h>
 	#include <openssl/objects.h>
 	#include <openssl/opensslv.h>
-	#if OPENSSL_VERSION_NUMBER < 0x0090807f /* 0.9.8g */
-	# error "OpenSSL < 0.9.8g has unreliable ECC code"
-	#endif
 		]], [[
 		EC_KEY *e = EC_KEY_new_by_curve_name(NID_secp521r1);
 		const EVP_MD *m = EVP_sha512(); /* We need this too */
@@ -2905,7 +2967,7 @@
 
 ### Configure cryptographic random number support
 
-# Check wheter OpenSSL seeds itself
+# Check whether OpenSSL seeds itself
 if test "x$openssl" = "xyes" ; then
 	AC_MSG_CHECKING([whether OpenSSL's PRNG is internally seeded])
 	AC_RUN_IFELSE(
@@ -3196,7 +3258,8 @@
 	 select_works_with_rlimit=yes],
 	[AC_MSG_RESULT([no])
 	 select_works_with_rlimit=no],
-	[AC_MSG_WARN([cross compiling: assuming yes])]
+	[AC_MSG_WARN([cross compiling: assuming yes])
+	 select_works_with_rlimit=yes]
 )
 
 AC_MSG_CHECKING([if setrlimit(RLIMIT_NOFILE,{0,0}) works])
@@ -3222,7 +3285,8 @@
 	 rlimit_nofile_zero_works=yes],
 	[AC_MSG_RESULT([no])
 	 rlimit_nofile_zero_works=no],
-	[AC_MSG_WARN([cross compiling: assuming yes])]
+	[AC_MSG_WARN([cross compiling: assuming yes])
+	 rlimit_nofile_zero_works=yes]
 )
 
 AC_MSG_CHECKING([if setrlimit RLIMIT_FSIZE works])
@@ -3285,10 +3349,10 @@
 	AC_DEFINE([SANDBOX_SECCOMP_FILTER], [1], [Sandbox using seccomp filter])
 elif test "x$sandbox_arg" = "xcapsicum" || \
      ( test -z "$sandbox_arg" && \
-       test "x$ac_cv_header_sys_capability_h" = "xyes" && \
+       test "x$ac_cv_header_sys_capsicum_h" = "xyes" && \
        test "x$ac_cv_func_cap_rights_limit" = "xyes") ; then
-       test "x$ac_cv_header_sys_capability_h" != "xyes" && \
-		AC_MSG_ERROR([capsicum sandbox requires sys/capability.h header])
+       test "x$ac_cv_header_sys_capsicum_h" != "xyes" && \
+		AC_MSG_ERROR([capsicum sandbox requires sys/capsicum.h header])
        test "x$ac_cv_func_cap_rights_limit" != "xyes" && \
 		AC_MSG_ERROR([capsicum sandbox requires cap_rights_limit function])
        SANDBOX_STYLE="capsicum"
@@ -3629,6 +3693,23 @@
 #endif
 ])
 
+AC_CHECK_MEMBERS([struct statfs.f_flags], [], [], [[
+#include <sys/types.h>
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+#ifdef HAVE_SYS_STATFS_H
+#include <sys/statfs.h>
+#endif
+#ifdef HAVE_SYS_STATVFS_H
+#include <sys/statvfs.h>
+#endif
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#endif
+]])
+
+
 AC_CHECK_TYPES([in_addr_t, in_port_t], , ,
 [#include <sys/types.h>
 #include <netinet/in.h>])
@@ -3785,7 +3866,7 @@
 
 AC_CHECK_TYPES([struct timespec])
 
-# We need int64_t or else certian parts of the compile will fail.
+# We need int64_t or else certain parts of the compile will fail.
 if test "x$ac_cv_have_int64_t" = "xno" && \
 	test "x$ac_cv_sizeof_long_int" != "x8" && \
 	test "x$ac_cv_sizeof_long_long_int" = "x0" ; then
@@ -3844,6 +3925,8 @@
 OSSH_CHECK_HEADER_FOR_FIELD([ut_tv], [utmpx.h], [HAVE_TV_IN_UTMPX])
 
 AC_CHECK_MEMBERS([struct stat.st_blksize])
+AC_CHECK_MEMBERS([struct stat.st_mtim])
+AC_CHECK_MEMBERS([struct stat.st_mtime])
 AC_CHECK_MEMBERS([struct passwd.pw_gecos, struct passwd.pw_class,
 struct passwd.pw_change, struct passwd.pw_expire],
 [], [], [[
@@ -4741,7 +4824,7 @@
 fi
 
 AC_ARG_WITH([pid-dir],
-	[  --with-pid-dir=PATH     Specify location of ssh.pid file],
+	[  --with-pid-dir=PATH     Specify location of sshd.pid file],
 	[
 		if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
 		    test "x${withval}" != "xyes"; then
@@ -5042,6 +5125,10 @@
 AC_SUBST([TEST_SSH_UTF8], [$TEST_SSH_UTF8])
 AC_SUBST([TEST_MALLOC_OPTIONS], [$TEST_MALLOC_OPTIONS])
 AC_SUBST([UNSUPPORTED_ALGORITHMS], [$unsupported_algorithms])
+AC_SUBST([DEPEND], [$(cat $srcdir/.depend)])
+
+CFLAGS="${CFLAGS} ${CFLAGS_AFTER}"
+LDFLAGS="${LDFLAGS} ${LDFLAGS_AFTER}"
 
 AC_EXEEXT
 AC_CONFIG_FILES([Makefile buildpkg.sh opensshd.init openssh.xml \
@@ -5090,8 +5177,6 @@
 echo "                   OSF SIA support: $SIA_MSG"
 echo "                 KerberosV support: $KRB5_MSG"
 echo "                   SELinux support: $SELINUX_MSG"
-echo "                 Smartcard support: $SCARD_MSG"
-echo "                     S/KEY support: $SKEY_MSG"
 echo "              MD5 password support: $MD5_MSG"
 echo "                   libedit support: $LIBEDIT_MSG"
 echo "                   libldns support: $LDNS_MSG"
diff --git a/contrib/aix/README b/contrib/aix/README
index 2a29935..1aa5919 100644
--- a/contrib/aix/README
+++ b/contrib/aix/README
@@ -35,7 +35,7 @@
 appropriate).  It seems to work, though......
 
 If there are any patches to this that have not yet been integrated they
-may be found at http://www.zip.com.au/~dtucker/openssh/.
+may be found at http://www.dtucker.net/openssh/.
 
 
 Disclaimer:
@@ -47,4 +47,3 @@
 	- Darren Tucker (dtucker at zip dot com dot au)
 	  2002/03/01
 
-$Id: README,v 1.4 2003/08/25 05:01:04 dtucker Exp $
diff --git a/contrib/aix/buildbff.sh b/contrib/aix/buildbff.sh
index 81d8cc3..55113d9 100755
--- a/contrib/aix/buildbff.sh
+++ b/contrib/aix/buildbff.sh
@@ -1,7 +1,6 @@
 #!/bin/sh
 #
 # buildbff.sh: Create AIX SMIT-installable OpenSSH packages
-# $Id: buildbff.sh,v 1.13 2011/05/05 03:48:41 djm Exp $
 #
 # Author: Darren Tucker (dtucker at zip dot com dot au)
 # This file is placed in the public domain and comes with absolutely
@@ -241,21 +240,7 @@
 
 # Generate keys unless they already exist
 echo Creating host keys if required.
-if [ -f "$sysconfdir/ssh_host_key" ] ; then
-	echo "$sysconfdir/ssh_host_key already exists, skipping."
-else
-	$bindir/ssh-keygen -t rsa1 -f $sysconfdir/ssh_host_key -N ""
-fi
-if [ -f $sysconfdir/ssh_host_dsa_key ] ; then
-	echo "$sysconfdir/ssh_host_dsa_key already exists, skipping."
-else
-	$bindir/ssh-keygen -t dsa -f $sysconfdir/ssh_host_dsa_key -N ""
-fi
-if [ -f $sysconfdir/ssh_host_rsa_key ] ; then
-	echo "$sysconfdir/ssh_host_rsa_key already exists, skipping."
-else
-	$bindir/ssh-keygen -t rsa -f $sysconfdir/ssh_host_rsa_key -N ""
-fi
+$bindir/ssh-keygen -A
 echo
 
 # Set startup command depending on SRC support
diff --git a/contrib/aix/inventory.sh b/contrib/aix/inventory.sh
index e2641e7..7d76f49 100755
--- a/contrib/aix/inventory.sh
+++ b/contrib/aix/inventory.sh
@@ -1,7 +1,6 @@
 #!/bin/sh
 #
 # inventory.sh
-# $Id: inventory.sh,v 1.6 2003/11/21 12:48:56 djm Exp $
 #
 # Originally written by Ben Lindstrom, modified by Darren Tucker to use perl
 # This file is placed into the public domain.
diff --git a/contrib/cygwin/Makefile b/contrib/cygwin/Makefile
index a0261f4..4b78cd9 100644
--- a/contrib/cygwin/Makefile
+++ b/contrib/cygwin/Makefile
@@ -13,6 +13,7 @@
 inetdefdir=$(defaultsdir)/inetd.d
 PRIVSEP_PATH=/var/empty
 INSTALL=/usr/bin/install -c
+MKDIR_P=$(srcdir)/mkinstalldirs
 
 DESTDIR=
 
@@ -23,7 +24,7 @@
 	@echo
 
 move-config-files: $(DESTDIR)$(sysconfdir)/ssh_config $(DESTDIR)$(sysconfdir)/sshd_config
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(defaultsdir)
+	$(MKDIR_P) $(DESTDIR)$(defaultsdir)
 	mv $(DESTDIR)$(sysconfdir)/ssh_config $(DESTDIR)$(defaultsdir)
 	mv $(DESTDIR)$(sysconfdir)/sshd_config $(DESTDIR)$(defaultsdir)
 
@@ -31,11 +32,11 @@
 	rm -rf $(DESTDIR)$(PRIVSEP_PATH)
 
 install-inetd-config:
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(inetdefdir)
+	$(MKDIR_P) $(DESTDIR)$(inetdefdir)
 	$(INSTALL) -m 644 sshd-inetd  $(DESTDIR)$(inetdefdir)/sshd-inetd
 
 install-sshdoc:
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(sshdocdir)
+	$(MKDIR_P) $(DESTDIR)$(sshdocdir)
 	-$(INSTALL) -m 644 $(srcdir)/CREDITS $(DESTDIR)$(sshdocdir)/CREDITS
 	-$(INSTALL) -m 644 $(srcdir)/ChangeLog $(DESTDIR)$(sshdocdir)/ChangeLog
 	-$(INSTALL) -m 644 $(srcdir)/LICENCE $(DESTDIR)$(sshdocdir)/LICENCE
@@ -52,13 +53,13 @@
 	-$(INSTALL) -m 644 $(srcdir)/TODO $(DESTDIR)$(sshdocdir)/TODO
 
 install-cygwindoc: README
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(cygdocdir)
+	$(MKDIR_P) $(DESTDIR)$(cygdocdir)
 	$(INSTALL) -m 644 README $(DESTDIR)$(cygdocdir)/openssh.README
 
 install-doc: install-sshdoc install-cygwindoc
 
 install-scripts: ssh-host-config ssh-user-config
-	$(srcdir)/mkinstalldirs $(DESTDIR)$(bindir)
+	$(MKDIR_P) $(DESTDIR)$(bindir)
 	$(INSTALL) -m 755 ssh-host-config $(DESTDIR)$(bindir)/ssh-host-config
 	$(INSTALL) -m 755 ssh-user-config $(DESTDIR)$(bindir)/ssh-user-config
 
diff --git a/contrib/cygwin/ssh-host-config b/contrib/cygwin/ssh-host-config
index d934d09..261020a 100644
--- a/contrib/cygwin/ssh-host-config
+++ b/contrib/cygwin/ssh-host-config
@@ -22,7 +22,7 @@
 
 CSIH_SCRIPT=/usr/share/csih/cygwin-service-installation-helper.sh
 
-# List of apps used.  This is checkad for existance in csih_sanity_check
+# List of apps used.  This is checkad for existence in csih_sanity_check
 # Don't use *any* transient commands before sourcing the csih helper script,
 # otherwise the sanity checks are short-circuited.
 declare -a csih_required_commands=(
@@ -63,7 +63,6 @@
 port_number=22
 service_name=sshd
 strictmodes=yes
-privsep_used=yes
 cygwin_value=""
 user_account=
 password_value=
@@ -140,33 +139,21 @@
 
 # ======================================================================
 # Routine: sshd_privsep
-#  MODIFIES: privsep_used
+# Try to create ssshd user account
 # ======================================================================
 sshd_privsep() {
   local ret=0
 
   if [ "${sshd_config_configured}" != "yes" ]
   then
-    echo
-    csih_inform "Privilege separation is set to 'sandbox' by default since"
-    csih_inform "OpenSSH 6.1.  This is unsupported by Cygwin and has to be set"
-    csih_inform "to 'yes' or 'no'."
-    csih_inform "However, using privilege separation requires a non-privileged account"
-    csih_inform "called 'sshd'."
-    csih_inform "For more info on privilege separation read /usr/share/doc/openssh/README.privsep."
-    if csih_request "Should privilege separation be used?"
+    if ! csih_create_unprivileged_user sshd
     then
-      privsep_used=yes
-      if ! csih_create_unprivileged_user sshd
-      then
-	csih_error_recoverable "Couldn't create user 'sshd'!"
-	csih_error_recoverable "Privilege separation set to 'no' again!"
-	csih_error_recoverable "Check your ${SYSCONFDIR}/sshd_config file!"
-	let ++ret
-	privsep_used=no
-      fi
-    else
-      privsep_used=no
+      csih_error_recoverable "Could not create user 'sshd'!"
+      csih_error_recoverable "You will not be able to run an sshd service"
+      csih_error_recoverable "under a privileged account successfully."
+      csih_error_recoverable "Make sure to create a non-privileged user 'sshd'"
+      csih_error_recoverable "manually before trying to run the service!"
+      let ++ret
     fi
   fi
   return $ret
@@ -202,18 +189,6 @@
       let ++ret
     fi
   fi
-  if [ "${sshd_config_configured}" != "yes" ]
-  then
-    /usr/bin/sed -i -e "
-      s/^#\?UsePrivilegeSeparation .*/UsePrivilegeSeparation ${privsep_used}/" \
-      ${SYSCONFDIR}/sshd_config
-    if [ $? -ne 0 ]
-    then
-      csih_warning "Setting privilege separation failed!"
-      csih_warning "Check your ${SYSCONFDIR}/sshd_config file!"
-      let ++ret
-    fi
-  fi
   return $ret
 } # --- End of sshd_config_tweak --- #
 
@@ -693,7 +668,7 @@
   fi
 fi
 
-# handle sshd_config (and privsep)
+# handle sshd_config
 csih_install_config "${SYSCONFDIR}/sshd_config" "${SYSCONFDIR}/defaults" || let ++warning_cnt
 if ! /usr/bin/cmp "${SYSCONFDIR}/sshd_config" "${SYSCONFDIR}/defaults/${SYSCONFDIR}/sshd_config" >/dev/null 2>&1
 then
diff --git a/contrib/cygwin/ssh-user-config b/contrib/cygwin/ssh-user-config
index 33dc0cb..6fa4bb3 100644
--- a/contrib/cygwin/ssh-user-config
+++ b/contrib/cygwin/ssh-user-config
@@ -127,7 +127,7 @@
 check_user_dot_ssh_dir() {
   if [ -e "${pwdhome}/.ssh" -a ! -d "${pwdhome}/.ssh" ]
   then
-    csih_error "${pwdhome}/.ssh is existant but not a directory. Cannot create user identity files."
+    csih_error "${pwdhome}/.ssh is existent but not a directory. Cannot create user identity files."
   fi
   
   if [ ! -e "${pwdhome}/.ssh" ]
diff --git a/contrib/findssl.sh b/contrib/findssl.sh
index 263fd26..95a0d66 100644
--- a/contrib/findssl.sh
+++ b/contrib/findssl.sh
@@ -1,7 +1,5 @@
 #!/bin/sh
 #
-# $Id: findssl.sh,v 1.4 2007/02/19 11:44:25 dtucker Exp $
-#
 # findssl.sh
 #	Search for all instances of OpenSSL headers and libraries
 #	and print their versions.
diff --git a/contrib/redhat/openssh.spec b/contrib/redhat/openssh.spec
index 666097c..8e9594d 100644
--- a/contrib/redhat/openssh.spec
+++ b/contrib/redhat/openssh.spec
@@ -1,5 +1,5 @@
-%define ver 7.4p1
-%define rel 1
+%define ver 7.8p1
+%define rel 1%{?dist}
 
 # OpenSSH privilege separation requires a user & group ID
 %define sshd_uid    74
@@ -23,8 +23,19 @@
 # Use GTK2 instead of GNOME in gnome-ssh-askpass
 %define gtk2 1
 
-# Is this build for RHL 6.x?
+# Use build6x options for older RHEL builds
+# RHEL 7 not yet supported
+%if 0%{?rhel} > 6
 %define build6x 0
+%else
+%define build6x 1
+%endif
+
+%if 0%{?fedora} >= 26
+%define compat_openssl 1
+%else
+%define compat_openssl 0
+%endif
 
 # Do we want kerberos5 support (1=yes 0=no)
 %define kerberos5 1
@@ -64,7 +75,7 @@
 %define kerberos5 0
 %endif
 
-Summary: The OpenSSH implementation of SSH protocol versions 1 and 2.
+Summary: The OpenSSH implementation of SSH protocol version 2.
 Name: openssh
 Version: %{ver}
 %if %{rescue}
@@ -74,9 +85,7 @@
 %endif
 URL: https://www.openssh.com/portable.html
 Source0: https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-%{version}.tar.gz
-%if ! %{no_x11_askpass}
 Source1: http://www.jmknoble.net/software/x11-ssh-askpass/x11-ssh-askpass-%{aversion}.tar.gz
-%endif
 License: BSD
 Group: Applications/Internet
 BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot
@@ -86,7 +95,13 @@
 %else
 Requires: initscripts >= 5.20
 %endif
-BuildRequires: perl, openssl-devel
+BuildRequires: perl
+%if %{compat_openssl}
+BuildRequires: compat-openssl10-devel
+%else
+BuildRequires: openssl-devel >= 1.0.1
+BuildRequires: openssl-devel < 1.1
+%endif
 BuildRequires: /bin/login
 %if ! %{build6x}
 BuildRequires: glibc-devel, pam
@@ -95,6 +110,12 @@
 %endif
 %if ! %{no_x11_askpass}
 BuildRequires: /usr/include/X11/Xlib.h
+# Xt development tools
+BuildRequires: libXt-devel
+# Provides xmkmf
+BuildRequires: imake
+# Rely on relatively recent gtk
+BuildRequires: gtk2-devel
 %endif
 %if ! %{no_gnome_askpass}
 BuildRequires: pkgconfig
@@ -183,11 +204,6 @@
 CFLAGS="$RPM_OPT_FLAGS -Os"; export CFLAGS
 %endif
 
-%if %{kerberos5}
-K5DIR=`rpm -ql krb5-devel | grep 'include/krb5\.h' | sed 's,\/include\/krb5.h,,'`
-echo K5DIR=$K5DIR
-%endif
-
 %configure \
 	--sysconfdir=%{_sysconfdir}/ssh \
 	--libexecdir=%{_libexecdir}/openssh \
@@ -196,6 +212,9 @@
 	--with-superuser-path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \
 	--with-privsep-path=%{_var}/empty/sshd \
 	--with-md5-passwords \
+	--mandir=%{_mandir} \
+	--with-mantype=man \
+	--disable-strip \
 %if %{scard}
 	--with-smartcard \
 %endif
@@ -262,12 +281,12 @@
 install -m755 contrib/redhat/sshd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/sshd
 
 %if ! %{no_x11_askpass}
-install -s x11-ssh-askpass-%{aversion}/x11-ssh-askpass $RPM_BUILD_ROOT%{_libexecdir}/openssh/x11-ssh-askpass
+install x11-ssh-askpass-%{aversion}/x11-ssh-askpass $RPM_BUILD_ROOT%{_libexecdir}/openssh/x11-ssh-askpass
 ln -s x11-ssh-askpass $RPM_BUILD_ROOT%{_libexecdir}/openssh/ssh-askpass
 %endif
 
 %if ! %{no_gnome_askpass}
-install -s contrib/gnome-ssh-askpass $RPM_BUILD_ROOT%{_libexecdir}/openssh/gnome-ssh-askpass
+install contrib/gnome-ssh-askpass $RPM_BUILD_ROOT%{_libexecdir}/openssh/gnome-ssh-askpass
 %endif
 
 %if ! %{scard}
@@ -391,7 +410,7 @@
 %doc x11-ssh-askpass-%{aversion}/README
 %doc x11-ssh-askpass-%{aversion}/ChangeLog
 %doc x11-ssh-askpass-%{aversion}/SshAskpass*.ad
-%attr(0755,root,root) %{_libexecdir}/openssh/ssh-askpass
+%{_libexecdir}/openssh/ssh-askpass
 %attr(0755,root,root) %{_libexecdir}/openssh/x11-ssh-askpass
 %endif
 
@@ -403,6 +422,22 @@
 %endif
 
 %changelog
+* Sat Feb 10 2018 Darren Tucker <dtucker@dtucker.net>
+- Update openssl-devel dependency to match current requirements.
+- Handle Fedora >=6 openssl 1.0 compat libs.
+- Remove SSH1 from description.
+- Don't strip binaries at build time so that debuginfo package can be
+  created.
+
+* Sun Nov 16 2014 Nico Kadel-Garcia <nakdel@gmail.com>
+- Add '--mandir' and '--with-mantype' for RHEL 5 compatibility
+- Add 'dist' option to 'ver' so package names reflect OS at build time
+- Always include x11-ssh-askpass tarball in SRPM
+- Add openssh-x11-aspass BuildRequires for libXT-devel, imake, gtk2-devel
+- Discard 'K5DIR' reporting, not usable inside 'mock' for RHEL 5 compatibility
+- Discard obsolete '--with-rsh' configure option
+- Update openssl-devel dependency to 0.9.8f, as found in autoconf
+
 * Wed Jul 14 2010 Tim Rice <tim@multitalents.net>
 - test for skip_x11_askpass (line 77) should have been for no_x11_askpass
 
@@ -414,7 +449,7 @@
 - Don't install profile.d scripts when not building with GNOME/GTK askpass
   (patch from bet@rahul.net)
 
-* Wed Oct 01 2002 Damien Miller <djm@mindrot.org>
+* Tue Oct 01 2002 Damien Miller <djm@mindrot.org>
 - Install ssh-agent setgid nobody to prevent ptrace() key theft attacks
 
 * Mon Sep 30 2002 Damien Miller <djm@mindrot.org>
@@ -460,7 +495,7 @@
 - remove dependency on db1-devel, which has just been swallowed up whole
   by gnome-libs-devel
 
-* Sun Dec 29 2001 Nalin Dahyabhai <nalin@redhat.com>
+* Sat Dec 29 2001 Nalin Dahyabhai <nalin@redhat.com>
 - adjust build dependencies so that build6x actually works right (fix
   from Hugo van der Kooij)
 
diff --git a/contrib/redhat/sshd.init b/contrib/redhat/sshd.init
index 40c8dfd..8ee5fcd 100755
--- a/contrib/redhat/sshd.init
+++ b/contrib/redhat/sshd.init
@@ -40,7 +40,6 @@
 	# Create keys if necessary
 	/usr/bin/ssh-keygen -A
 	if [ -x /sbin/restorecon ]; then
-		/sbin/restorecon /etc/ssh/ssh_host_key.pub
 		/sbin/restorecon /etc/ssh/ssh_host_rsa_key.pub
 		/sbin/restorecon /etc/ssh/ssh_host_dsa_key.pub
 		/sbin/restorecon /etc/ssh/ssh_host_ecdsa_key.pub
diff --git a/contrib/redhat/sshd.init.old b/contrib/redhat/sshd.init.old
index 0deb608..8a30f7d 100755
--- a/contrib/redhat/sshd.init.old
+++ b/contrib/redhat/sshd.init.old
@@ -24,7 +24,6 @@
 # Some functions to make the below more readable
 KEYGEN=/usr/bin/ssh-keygen
 SSHD=/usr/sbin/sshd
-RSA1_KEY=/etc/ssh/ssh_host_key
 RSA_KEY=/etc/ssh/ssh_host_rsa_key
 DSA_KEY=/etc/ssh/ssh_host_dsa_key
 PID_FILE=/var/run/sshd.pid
@@ -61,21 +60,6 @@
     ;;
   esac
 }
-do_rsa1_keygen() {
-	if [ ! -s $RSA1_KEY ]; then
-		echo -n "Generating SSH1 RSA host key: "
-		if $KEYGEN -q -t rsa1 -f $RSA1_KEY -C '' -N '' >&/dev/null; then
-			chmod 600 $RSA1_KEY
-			chmod 644 $RSA1_KEY.pub
-			my_success "RSA1 key generation"
-			echo
-		else
-			my_failure "RSA1 key generation"
-			echo
-			exit 1
-		fi
-	fi
-}
 do_rsa_keygen() {
 	if [ ! -s $RSA_KEY ]; then
 		echo -n "Generating SSH2 RSA host key: "
@@ -119,7 +103,6 @@
 case "$1" in
 	start)
 		# Create keys if necessary
-		do_rsa1_keygen;
 		do_rsa_keygen;
 		do_dsa_keygen;
 		
diff --git a/contrib/solaris/README b/contrib/solaris/README
index fefdd4b..cabecaa 100644
--- a/contrib/solaris/README
+++ b/contrib/solaris/README
@@ -5,7 +5,7 @@
 
 The build process is called a 'dummy install'.. Which means the software does
 a  "make install-nokeys DESTDIR=[fakeroot]".  This way all manpages should
-be handled correctly and key are defered until the first time the sshd
+be handled correctly and key are deferred until the first time the sshd
 is started.
 
 Directions:
diff --git a/contrib/ssh-copy-id b/contrib/ssh-copy-id
index bef5c95..b83b836 100644
--- a/contrib/ssh-copy-id
+++ b/contrib/ssh-copy-id
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright (c) 1999-2013 Philip Hands <phil@hands.com>
+# Copyright (c) 1999-2016 Philip Hands <phil@hands.com>
 #               2013 Martin Kletzander <mkletzan@redhat.com>
 #               2010 Adeodato =?iso-8859-1?Q?Sim=F3?= <asp16@alu.ua.es>
 #               2010 Eric Moret <eric.moret@gmail.com>
@@ -56,7 +56,8 @@
   fi
 fi
 
-DEFAULT_PUB_ID_FILE="$HOME/$(cd "$HOME" ; ls -t .ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1)"
+most_recent_id="$(cd "$HOME" ; ls -t .ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1)"
+DEFAULT_PUB_ID_FILE="${most_recent_id:+$HOME/}$most_recent_id"
 
 usage () {
   printf 'Usage: %s [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname\n' "$0" >&2
@@ -74,6 +75,11 @@
 use_id_file() {
   local L_ID_FILE="$1"
 
+  if [ -z "$L_ID_FILE" ] ; then
+    printf "%s: ERROR: no ID file found\n" "$0"
+    exit 1
+  fi
+
   if expr "$L_ID_FILE" : ".*\.pub$" >/dev/null ; then
     PUB_ID_FILE="$L_ID_FILE"
   else
@@ -287,9 +293,10 @@
   *)
     # Assuming that the remote host treats ~/.ssh/authorized_keys as one might expect
     populate_new_ids 0
-    # in ssh below - to defend against quirky remote shells: use 'exec sh -c' to get POSIX; 'cd' to be at $HOME; and all on one line, because tcsh.
+    # in ssh below - to defend against quirky remote shells: use 'exec sh -c' to get POSIX;
+    #     'cd' to be at $HOME; add a newline if it's missing; and all on one line, because tcsh.
     [ "$DRY_RUN" ] || printf '%s\n' "$NEW_IDS" | \
-      ssh "$@" "exec sh -c 'cd ; umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys || exit 1 ; if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi'" \
+      ssh "$@" "exec sh -c 'cd ; umask 077 ; mkdir -p .ssh && { [ -z "'`tail -1c .ssh/authorized_keys 2>/dev/null`'" ] || echo >> .ssh/authorized_keys ; } && cat >> .ssh/authorized_keys || exit 1 ; if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi'" \
       || exit 1
     ADDED=$(printf '%s\n' "$NEW_IDS" | wc -l)
     ;;
diff --git a/contrib/suse/openssh.spec b/contrib/suse/openssh.spec
index 4c4bbb6..9a1168f 100644
--- a/contrib/suse/openssh.spec
+++ b/contrib/suse/openssh.spec
@@ -13,7 +13,7 @@
 
 Summary:	OpenSSH, a free Secure Shell (SSH) protocol implementation
 Name:		openssh
-Version:	7.4p1
+Version:	7.8p1
 URL:		https://www.openssh.com/
 Release:	1
 Source0:	openssh-%{version}.tar.gz
@@ -56,7 +56,7 @@
 
 OpenSSH is OpenBSD's rework of the last free version of SSH, bringing it
 up to date in terms of security and features, as well as removing all
-patented algorithms to seperate libraries (OpenSSL).
+patented algorithms to separate libraries (OpenSSL).
 
 This package includes all files necessary for both the OpenSSH
 client and server.
@@ -70,7 +70,7 @@
 
 OpenSSH is OpenBSD's rework of the last free version of SSH, bringing it
 up to date in terms of security and features, as well as removing all
-patented algorithms to seperate libraries (OpenSSL).
+patented algorithms to separate libraries (OpenSSL).
 
 This package contains an X Window System passphrase dialog for OpenSSH.
 
diff --git a/crypto_api.h b/crypto_api.h
index 5820ce8..7f45bbd 100644
--- a/crypto_api.h
+++ b/crypto_api.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: crypto_api.h,v 1.3 2013/12/17 10:36:38 markus Exp $ */
+/* $OpenBSD: crypto_api.h,v 1.4 2017/12/14 21:07:39 naddy Exp $ */
 
 /*
  * Assembled from generated headers and source files by Markus Friedl.
@@ -8,6 +8,8 @@
 #ifndef crypto_api_h
 #define crypto_api_h
 
+#include "includes.h"
+
 #ifdef HAVE_STDINT_H
 # include <stdint.h>
 #endif
@@ -18,12 +20,6 @@
 
 #define randombytes(buf, buf_len) arc4random_buf((buf), (buf_len))
 
-#define crypto_hashblocks_sha512_STATEBYTES 64U
-#define crypto_hashblocks_sha512_BLOCKBYTES 128U
-
-int	crypto_hashblocks_sha512(unsigned char *, const unsigned char *,
-     unsigned long long);
-
 #define crypto_hash_sha512_BYTES 64U
 
 int	crypto_hash_sha512(unsigned char *, const unsigned char *,
diff --git a/deattack.c b/deattack.c
deleted file mode 100644
index e76481a..0000000
--- a/deattack.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/* $OpenBSD: deattack.c,v 1.32 2015/01/20 23:14:00 deraadt Exp $ */
-/*
- * Cryptographic attack detector for ssh - source code
- *
- * Copyright (c) 1998 CORE SDI S.A., Buenos Aires, Argentina.
- *
- * All rights reserved. Redistribution and use in source and binary
- * forms, with or without modification, are permitted provided that
- * this copyright notice is retained.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR
- * CONSEQUENTIAL DAMAGES RESULTING FROM THE USE OR MISUSE OF THIS
- * SOFTWARE.
- *
- * Ariel Futoransky <futo@core-sdi.com>
- * <http://www.core-sdi.com>
- */
-
-#include "includes.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "deattack.h"
-#include "crc32.h"
-#include "sshbuf.h"
-#include "misc.h"
-
-/*
- * CRC attack detection has a worst-case behaviour that is O(N^3) over
- * the number of identical blocks in a packet. This behaviour can be 
- * exploited to create a limited denial of service attack. 
- * 
- * However, because we are dealing with encrypted data, identical
- * blocks should only occur every 2^35 maximally-sized packets or so. 
- * Consequently, we can detect this DoS by looking for identical blocks
- * in a packet.
- *
- * The parameter below determines how many identical blocks we will
- * accept in a single packet, trading off between attack detection and
- * likelihood of terminating a legitimate connection. A value of 32 
- * corresponds to an average of 2^40 messages before an attack is
- * misdetected
- */
-#define MAX_IDENTICAL	32
-
-/* SSH Constants */
-#define SSH_MAXBLOCKS	(32 * 1024)
-#define SSH_BLOCKSIZE	(8)
-
-/* Hashing constants */
-#define HASH_MINSIZE	(8 * 1024)
-#define HASH_ENTRYSIZE	(2)
-#define HASH_FACTOR(x)	((x)*3/2)
-#define HASH_UNUSEDCHAR	(0xff)
-#define HASH_UNUSED	(0xffff)
-#define HASH_IV		(0xfffe)
-
-#define HASH_MINBLOCKS	(7*SSH_BLOCKSIZE)
-
-
-/* Hash function (Input keys are cipher results) */
-#define HASH(x)		PEEK_U32(x)
-
-#define CMP(a, b)	(memcmp(a, b, SSH_BLOCKSIZE))
-
-static void
-crc_update(u_int32_t *a, u_int32_t b)
-{
-	b ^= *a;
-	*a = ssh_crc32((u_char *)&b, sizeof(b));
-}
-
-/* detect if a block is used in a particular pattern */
-static int
-check_crc(const u_char *S, const u_char *buf, u_int32_t len)
-{
-	u_int32_t crc;
-	const u_char *c;
-
-	crc = 0;
-	for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) {
-		if (!CMP(S, c)) {
-			crc_update(&crc, 1);
-			crc_update(&crc, 0);
-		} else {
-			crc_update(&crc, 0);
-			crc_update(&crc, 0);
-		}
-	}
-	return crc == 0;
-}
-
-void
-deattack_init(struct deattack_ctx *dctx)
-{
-	bzero(dctx, sizeof(*dctx));
-	dctx->n = HASH_MINSIZE / HASH_ENTRYSIZE;
-}
-
-/* Detect a crc32 compensation attack on a packet */
-int
-detect_attack(struct deattack_ctx *dctx, const u_char *buf, u_int32_t len)
-{
-	u_int32_t i, j, l, same;
-	u_int16_t *tmp;
-	const u_char *c, *d;
-
-	if (len > (SSH_MAXBLOCKS * SSH_BLOCKSIZE) ||
-	    len % SSH_BLOCKSIZE != 0)
-		return DEATTACK_ERROR;
-	for (l = dctx->n; l < HASH_FACTOR(len / SSH_BLOCKSIZE); l = l << 2)
-		;
-
-	if (dctx->h == NULL) {
-		if ((dctx->h = calloc(l, HASH_ENTRYSIZE)) == NULL)
-			return DEATTACK_ERROR;
-		dctx->n = l;
-	} else {
-		if (l > dctx->n) {
-			if ((tmp = reallocarray(dctx->h, l, HASH_ENTRYSIZE))
-			    == NULL) {
-				free(dctx->h);
-				dctx->h = NULL;
-				return DEATTACK_ERROR;
-			}
-			dctx->h = tmp;
-			dctx->n = l;
-		}
-	}
-
-	if (len <= HASH_MINBLOCKS) {
-		for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) {
-			for (d = buf; d < c; d += SSH_BLOCKSIZE) {
-				if (!CMP(c, d)) {
-					if ((check_crc(c, buf, len)))
-						return DEATTACK_DETECTED;
-					else
-						break;
-				}
-			}
-		}
-		return DEATTACK_OK;
-	}
-	memset(dctx->h, HASH_UNUSEDCHAR, dctx->n * HASH_ENTRYSIZE);
-
-	for (c = buf, same = j = 0; c < (buf + len); c += SSH_BLOCKSIZE, j++) {
-		for (i = HASH(c) & (dctx->n - 1); dctx->h[i] != HASH_UNUSED;
-		    i = (i + 1) & (dctx->n - 1)) {
-			if (!CMP(c, buf + dctx->h[i] * SSH_BLOCKSIZE)) {
-				if (++same > MAX_IDENTICAL)
-					return DEATTACK_DOS_DETECTED;
-				if (check_crc(c, buf, len))
-					return DEATTACK_DETECTED;
-				else
-					break;
-			}
-		}
-		dctx->h[i] = j;
-	}
-	return DEATTACK_OK;
-}
diff --git a/deattack.h b/deattack.h
deleted file mode 100644
index ce67a30..0000000
--- a/deattack.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $OpenBSD: deattack.h,v 1.11 2015/01/19 19:52:16 markus Exp $ */
-
-/*
- * Cryptographic attack detector for ssh - Header file
- *
- * Copyright (c) 1998 CORE SDI S.A., Buenos Aires, Argentina.
- *
- * All rights reserved. Redistribution and use in source and binary
- * forms, with or without modification, are permitted provided that
- * this copyright notice is retained.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR
- * CONSEQUENTIAL DAMAGES RESULTING FROM THE USE OR MISUSE OF THIS
- * SOFTWARE.
- *
- * Ariel Futoransky <futo@core-sdi.com>
- * <http://www.core-sdi.com>
- */
-
-#ifndef _DEATTACK_H
-#define _DEATTACK_H
-
-/* Return codes */
-#define DEATTACK_OK		0
-#define DEATTACK_DETECTED	1
-#define DEATTACK_DOS_DETECTED	2
-#define DEATTACK_ERROR		3
-
-struct deattack_ctx {
-	u_int16_t *h;
-	u_int32_t n;
-};
-
-void	 deattack_init(struct deattack_ctx *);
-int	 detect_attack(struct deattack_ctx *, const u_char *, u_int32_t);
-#endif
diff --git a/defines.h b/defines.h
index c89f85a..8f42130 100644
--- a/defines.h
+++ b/defines.h
@@ -214,24 +214,12 @@
 # if (SIZEOF_SHORT_INT == 2)
 typedef short int int16_t;
 # else
-#  ifdef _UNICOS
-#   if (SIZEOF_SHORT_INT == 4)
-typedef short int16_t;
-#   else
-typedef long  int16_t;
-#   endif
-#  else
 #   error "16 bit int type not found."
-#  endif /* _UNICOS */
 # endif
 # if (SIZEOF_INT == 4)
 typedef int int32_t;
 # else
-#  ifdef _UNICOS
-typedef long  int32_t;
-#  else
 #   error "32 bit int type not found."
-#  endif /* _UNICOS */
 # endif
 #endif
 
@@ -247,24 +235,12 @@
 #  if (SIZEOF_SHORT_INT == 2)
 typedef unsigned short int u_int16_t;
 #  else
-#   ifdef _UNICOS
-#    if (SIZEOF_SHORT_INT == 4)
-typedef unsigned short u_int16_t;
-#    else
-typedef unsigned long  u_int16_t;
-#    endif
-#   else
 #    error "16 bit int type not found."
-#   endif
 #  endif
 #  if (SIZEOF_INT == 4)
 typedef unsigned int u_int32_t;
 #  else
-#   ifdef _UNICOS
-typedef unsigned long  u_int32_t;
-#   else
 #    error "32 bit int type not found."
-#   endif
 #  endif
 # endif
 #define __BIT_TYPES_DEFINED__
@@ -328,6 +304,28 @@
 #define SIZE_MAX SIZE_T_MAX
 #endif
 
+#ifndef INT32_MAX
+# if (SIZEOF_INT == 4)
+#  define INT32_MAX INT_MAX
+# elif (SIZEOF_LONG == 4)
+#  define INT32_MAX LONG_MAX
+# else
+#  error "need INT32_MAX"
+# endif
+#endif
+
+#ifndef INT64_MAX
+# if (SIZEOF_INT == 8)
+#  define INT64_MAX INT_MAX
+# elif (SIZEOF_LONG == 8)
+#  define INT64_MAX LONG_MAX
+# elif (SIZEOF_LONG_LONG_INT == 8)
+#  define INT64_MAX LLONG_MAX
+# else
+#  error "need INT64_MAX"
+# endif
+#endif
+
 #ifndef HAVE_SSIZE_T
 typedef int ssize_t;
 # define HAVE_SSIZE_T
@@ -497,6 +495,13 @@
 }
 #endif
 
+#ifndef timespeccmp
+#define timespeccmp(tsp, usp, cmp)					\
+	(((tsp)->tv_sec == (usp)->tv_sec) ?				\
+	    ((tsp)->tv_nsec cmp (usp)->tv_nsec) :			\
+	    ((tsp)->tv_sec cmp (usp)->tv_sec))
+#endif
+
 #ifndef __P
 # define __P(x) x
 #endif
@@ -655,12 +660,6 @@
 #  define krb5_get_err_text(context,code) error_message(code)
 #endif
 
-#if defined(SKEYCHALLENGE_4ARG)
-# define _compat_skeychallenge(a,b,c,d) skeychallenge(a,b,c,d)
-#else
-# define _compat_skeychallenge(a,b,c,d) skeychallenge(a,b,c)
-#endif
-
 /* Maximum number of file descriptors available */
 #ifdef HAVE_SYSCONF
 # define SSH_SYSFDMAX sysconf(_SC_OPEN_MAX)
diff --git a/dh.c b/dh.c
index 3b14a7b..6b74175 100644
--- a/dh.c
+++ b/dh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dh.c,v 1.62 2016/12/15 21:20:41 dtucker Exp $ */
+/* $OpenBSD: dh.c,v 1.66 2018/08/04 00:55:06 djm Exp $ */
 /*
  * Copyright (c) 2000 Niels Provos.  All rights reserved.
  *
@@ -25,6 +25,7 @@
 
 #include "includes.h"
 
+#ifdef WITH_OPENSSL
 
 #include <openssl/bn.h>
 #include <openssl/dh.h>
@@ -134,10 +135,8 @@
 	return 1;
 
  fail:
-	if (dhg->g != NULL)
-		BN_clear_free(dhg->g);
-	if (dhg->p != NULL)
-		BN_clear_free(dhg->p);
+	BN_clear_free(dhg->g);
+	BN_clear_free(dhg->p);
 	dhg->g = dhg->p = NULL;
 	return 0;
 }
@@ -146,9 +145,9 @@
 choose_dh(int min, int wantbits, int max)
 {
 	FILE *f;
-	char line[4096];
-	int best, bestcount, which;
-	int linenum;
+	char *line = NULL;
+	size_t linesize = 0;
+	int best, bestcount, which, linenum;
 	struct dhgroup dhg;
 
 	if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL) {
@@ -159,7 +158,7 @@
 
 	linenum = 0;
 	best = bestcount = 0;
-	while (fgets(line, sizeof(line), f)) {
+	while (getline(&line, &linesize, f) != -1) {
 		linenum++;
 		if (!parse_prime(linenum, line, &dhg))
 			continue;
@@ -177,6 +176,9 @@
 		if (dhg.size == best)
 			bestcount++;
 	}
+	free(line);
+	line = NULL;
+	linesize = 0;
 	rewind(f);
 
 	if (bestcount == 0) {
@@ -187,7 +189,7 @@
 
 	linenum = 0;
 	which = arc4random_uniform(bestcount);
-	while (fgets(line, sizeof(line), f)) {
+	while (getline(&line, &linesize, f) != -1) {
 		if (!parse_prime(linenum, line, &dhg))
 			continue;
 		if ((dhg.size > max || dhg.size < min) ||
@@ -199,6 +201,8 @@
 		}
 		break;
 	}
+	free(line);
+	line = NULL;
 	fclose(f);
 	if (linenum != which+1) {
 		logit("WARNING: line %d disappeared in %s, giving up",
@@ -275,6 +279,7 @@
 	if (DH_generate_key(dh) == 0 ||
 	    !dh_pub_is_valid(dh, dh->pub_key)) {
 		BN_clear_free(dh->priv_key);
+		dh->priv_key = NULL;
 		return SSH_ERR_LIBCRYPTO_ERROR;
 	}
 	return 0;
@@ -465,3 +470,5 @@
 		return 7680;
 	return 8192;
 }
+
+#endif /* WITH_OPENSSL */
diff --git a/digest-libc.c b/digest-libc.c
index 40db002..c2b0b24 100644
--- a/digest-libc.c
+++ b/digest-libc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: digest-libc.c,v 1.5 2015/05/05 02:48:17 jsg Exp $ */
+/* $OpenBSD: digest-libc.c,v 1.6 2017/05/08 22:57:38 djm Exp $ */
 /*
  * Copyright (c) 2013 Damien Miller <djm@mindrot.org>
  * Copyright (c) 2014 Markus Friedl.  All rights reserved.
@@ -69,16 +69,6 @@
 		(md_final_fn *) MD5Final
 	},
 	{
-		SSH_DIGEST_RIPEMD160,
-		"RIPEMD160",
-		RMD160_BLOCK_LENGTH,
-		RMD160_DIGEST_LENGTH,
-		sizeof(RMD160_CTX),
-		(md_init_fn *) RMD160Init,
-		(md_update_fn *) RMD160Update,
-		(md_final_fn *) RMD160Final
-	},
-	{
 		SSH_DIGEST_SHA1,
 		"SHA1",
 		SHA1_BLOCK_LENGTH,
diff --git a/digest-openssl.c b/digest-openssl.c
index 13b63c2..2770999 100644
--- a/digest-openssl.c
+++ b/digest-openssl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: digest-openssl.c,v 1.5 2014/12/21 22:27:56 djm Exp $ */
+/* $OpenBSD: digest-openssl.c,v 1.7 2017/05/08 22:57:38 djm Exp $ */
 /*
  * Copyright (c) 2013 Damien Miller <djm@mindrot.org>
  *
@@ -56,7 +56,6 @@
 /* NB. Indexed directly by algorithm number */
 const struct ssh_digest digests[] = {
 	{ SSH_DIGEST_MD5,	"MD5",	 	16,	EVP_md5 },
-	{ SSH_DIGEST_RIPEMD160,	"RIPEMD160",	20,	EVP_ripemd160 },
 	{ SSH_DIGEST_SHA1,	"SHA1",	 	20,	EVP_sha1 },
 	{ SSH_DIGEST_SHA256,	"SHA256", 	32,	EVP_sha256 },
 	{ SSH_DIGEST_SHA384,	"SHA384",	48,	EVP_sha384 },
@@ -158,7 +157,7 @@
 	const struct ssh_digest *digest = ssh_digest_by_alg(ctx->alg);
 	u_int l = dlen;
 
-	if (dlen > UINT_MAX)
+	if (digest == NULL || dlen > UINT_MAX)
 		return SSH_ERR_INVALID_ARGUMENT;
 	if (dlen < digest->digest_len) /* No truncation allowed */
 		return SSH_ERR_INVALID_ARGUMENT;
diff --git a/digest.h b/digest.h
index 3fe0734..274574d 100644
--- a/digest.h
+++ b/digest.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: digest.h,v 1.7 2014/12/21 22:27:56 djm Exp $ */
+/* $OpenBSD: digest.h,v 1.8 2017/05/08 22:57:38 djm Exp $ */
 /*
  * Copyright (c) 2013 Damien Miller <djm@mindrot.org>
  *
@@ -23,12 +23,11 @@
 
 /* Digest algorithms */
 #define SSH_DIGEST_MD5		0
-#define SSH_DIGEST_RIPEMD160	1
-#define SSH_DIGEST_SHA1		2
-#define SSH_DIGEST_SHA256	3
-#define SSH_DIGEST_SHA384	4
-#define SSH_DIGEST_SHA512	5
-#define SSH_DIGEST_MAX		6
+#define SSH_DIGEST_SHA1		1
+#define SSH_DIGEST_SHA256	2
+#define SSH_DIGEST_SHA384	3
+#define SSH_DIGEST_SHA512	4
+#define SSH_DIGEST_MAX		5
 
 struct sshbuf;
 struct ssh_digest_ctx;
diff --git a/dispatch.c b/dispatch.c
index aac933e..0b3ea61 100644
--- a/dispatch.c
+++ b/dispatch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dispatch.c,v 1.27 2015/05/01 07:10:01 djm Exp $ */
+/* $OpenBSD: dispatch.c,v 1.31 2017/05/31 07:00:13 markus Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -30,7 +30,6 @@
 #include <signal.h>
 #include <stdarg.h>
 
-#include "ssh1.h"
 #include "ssh2.h"
 #include "log.h"
 #include "dispatch.h"
@@ -39,14 +38,11 @@
 #include "ssherr.h"
 
 int
-dispatch_protocol_error(int type, u_int32_t seq, void *ctx)
+dispatch_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = active_state; /* XXX */
 	int r;
 
 	logit("dispatch_protocol_error: type %d seq %u", type, seq);
-	if (!compat20)
-		fatal("protocol error");
 	if ((r = sshpkt_start(ssh, SSH2_MSG_UNIMPLEMENTED)) != 0 ||
 	    (r = sshpkt_put_u32(ssh, seq)) != 0 ||
 	    (r = sshpkt_send(ssh)) != 0 ||
@@ -56,7 +52,7 @@
 }
 
 int
-dispatch_protocol_ignore(int type, u_int32_t seq, void *ssh)
+dispatch_protocol_ignore(int type, u_int32_t seq, struct ssh *ssh)
 {
 	logit("dispatch_protocol_ignore: type %d seq %u", type, seq);
 	return 0;
@@ -89,8 +85,7 @@
 }
 
 int
-ssh_dispatch_run(struct ssh *ssh, int mode, volatile sig_atomic_t *done,
-    void *ctxt)
+ssh_dispatch_run(struct ssh *ssh, int mode, volatile sig_atomic_t *done)
 {
 	int r;
 	u_char type;
@@ -115,8 +110,7 @@
 				ssh->dispatch_skip_packets--;
 				continue;
 			}
-			/* XXX 'ssh' will replace 'ctxt' later */
-			r = (*ssh->dispatch[type])(type, seqnr, ctxt);
+			r = (*ssh->dispatch[type])(type, seqnr, ssh);
 			if (r != 0)
 				return r;
 		} else {
@@ -132,11 +126,10 @@
 }
 
 void
-ssh_dispatch_run_fatal(struct ssh *ssh, int mode, volatile sig_atomic_t *done,
-    void *ctxt)
+ssh_dispatch_run_fatal(struct ssh *ssh, int mode, volatile sig_atomic_t *done)
 {
 	int r;
 
-	if ((r = ssh_dispatch_run(ssh, mode, done, ctxt)) != 0)
+	if ((r = ssh_dispatch_run(ssh, mode, done)) != 0)
 		sshpkt_fatal(ssh, __func__, r);
 }
diff --git a/dispatch.h b/dispatch.h
index cd51dbc..17a6f3d 100644
--- a/dispatch.h
+++ b/dispatch.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dispatch.h,v 1.12 2015/01/19 20:07:45 markus Exp $ */
+/* $OpenBSD: dispatch.h,v 1.14 2017/05/31 07:00:13 markus Exp $ */
 
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
@@ -36,15 +36,15 @@
 
 struct ssh;
 
-typedef int dispatch_fn(int, u_int32_t, void *);
+typedef int dispatch_fn(int, u_int32_t, struct ssh *);
 
-int	dispatch_protocol_error(int, u_int32_t, void *);
-int	dispatch_protocol_ignore(int, u_int32_t, void *);
+int	dispatch_protocol_error(int, u_int32_t, struct ssh *);
+int	dispatch_protocol_ignore(int, u_int32_t, struct ssh *);
 void	ssh_dispatch_init(struct ssh *, dispatch_fn *);
 void	ssh_dispatch_set(struct ssh *, int, dispatch_fn *);
 void	ssh_dispatch_range(struct ssh *, u_int, u_int, dispatch_fn *);
-int	ssh_dispatch_run(struct ssh *, int, volatile sig_atomic_t *, void *);
-void	ssh_dispatch_run_fatal(struct ssh *, int, volatile sig_atomic_t *, void *);
+int	ssh_dispatch_run(struct ssh *, int, volatile sig_atomic_t *);
+void	ssh_dispatch_run_fatal(struct ssh *, int, volatile sig_atomic_t *);
 
 #define dispatch_init(dflt) \
 	ssh_dispatch_init(active_state, (dflt))
@@ -52,7 +52,5 @@
 	ssh_dispatch_range(active_state, (from), (to), (fn))
 #define dispatch_set(type, fn) \
 	ssh_dispatch_set(active_state, (type), (fn))
-#define dispatch_run(mode, done, ctxt) \
-	ssh_dispatch_run_fatal(active_state, (mode), (done), (ctxt))
 
 #endif
diff --git a/dns.c b/dns.c
index e813afe..ff1a2c4 100644
--- a/dns.c
+++ b/dns.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dns.c,v 1.35 2015/08/20 22:32:42 deraadt Exp $ */
+/* $OpenBSD: dns.c,v 1.38 2018/02/23 15:58:37 markus Exp $ */
 
 /*
  * Copyright (c) 2003 Wesley Griffin. All rights reserved.
@@ -105,6 +105,11 @@
 		if (!*digest_type)
 			*digest_type = SSHFP_HASH_SHA256;
 		break;
+	case KEY_XMSS:
+		*algorithm = SSHFP_KEY_XMSS;
+		if (!*digest_type)
+			*digest_type = SSHFP_HASH_SHA256;
+		break;
 	default:
 		*algorithm = SSHFP_KEY_RESERVED; /* 0 */
 		*digest_type = SSHFP_HASH_RESERVED; /* 0 */
diff --git a/dns.h b/dns.h
index 30e2b19..91f3c63 100644
--- a/dns.h
+++ b/dns.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dns.h,v 1.15 2015/05/08 06:45:13 djm Exp $ */
+/* $OpenBSD: dns.h,v 1.18 2018/02/23 15:58:37 markus Exp $ */
 
 /*
  * Copyright (c) 2003 Wesley Griffin. All rights reserved.
@@ -33,7 +33,8 @@
 	SSHFP_KEY_RSA = 1,
 	SSHFP_KEY_DSA = 2,
 	SSHFP_KEY_ECDSA = 3,
-	SSHFP_KEY_ED25519 = 4
+	SSHFP_KEY_ED25519 = 4,
+	SSHFP_KEY_XMSS = 5
 };
 
 enum sshfp_hashes {
diff --git a/entropy.c b/entropy.c
index 9305f89..c178c00 100644
--- a/entropy.c
+++ b/entropy.c
@@ -53,7 +53,8 @@
 #include "atomicio.h"
 #include "pathnames.h"
 #include "log.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 
 /*
  * Portable OpenSSH PRNG seeding:
@@ -108,7 +109,7 @@
 		    strlen(socket_path) + 1;
 	}
 
-	old_sigpipe = mysignal(SIGPIPE, SIG_IGN);
+	old_sigpipe = signal(SIGPIPE, SIG_IGN);
 
 	errors = 0;
 	rval = -1;
@@ -158,7 +159,7 @@
 
 	rval = 0;
 done:
-	mysignal(SIGPIPE, old_sigpipe);
+	signal(SIGPIPE, old_sigpipe);
 	if (fd != -1)
 		close(fd);
 	return rval;
@@ -181,29 +182,34 @@
 }
 
 void
-rexec_send_rng_seed(Buffer *m)
+rexec_send_rng_seed(struct sshbuf *m)
 {
 	u_char buf[RANDOM_SEED_SIZE];
+	size_t len = sizeof(buf);
+	int r;
 
 	if (RAND_bytes(buf, sizeof(buf)) <= 0) {
 		error("Couldn't obtain random bytes (error %ld)",
 		    ERR_get_error());
-		buffer_put_string(m, "", 0);
-	} else 
-		buffer_put_string(m, buf, sizeof(buf));
+		len = 0;
+	}
+	if ((r = sshbuf_put_string(m, buf, len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	explicit_bzero(buf, sizeof(buf));
 }
 
 void
-rexec_recv_rng_seed(Buffer *m)
+rexec_recv_rng_seed(struct sshbuf *m)
 {
-	u_char *buf;
-	u_int len;
+	u_char *buf = NULL;
+	size_t len = 0;
+	int r;
 
-	buf = buffer_get_string_ret(m, &len);
-	if (buf != NULL) {
-		debug3("rexec_recv_rng_seed: seeding rng with %u bytes", len);
-		RAND_add(buf, len, len);
-	}
+	if ((r = sshbuf_get_string_direct(m, &buf, &len)) != 0
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+
+	debug3("rexec_recv_rng_seed: seeding rng with %u bytes", len);
+	RAND_add(buf, len, len);
 }
 #endif /* OPENSSL_PRNG_ONLY */
 
diff --git a/entropy.h b/entropy.h
index 9d5285b..870164d 100644
--- a/entropy.h
+++ b/entropy.h
@@ -25,11 +25,10 @@
 #ifndef _RANDOMS_H
 #define _RANDOMS_H
 
-#include "buffer.h"
+struct sshbuf;
 
 void seed_rng(void);
-
-void rexec_send_rng_seed(Buffer *);
-void rexec_recv_rng_seed(Buffer *);
+void rexec_send_rng_seed(struct sshbuf *);
+void rexec_recv_rng_seed(struct sshbuf *);
 
 #endif /* _RANDOMS_H */
diff --git a/fixprogs b/fixprogs
deleted file mode 100755
index af76ee3..0000000
--- a/fixprogs
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/perl
-#
-# fixprogs  - run through the list of entropy commands and
-#             score out the losers
-#
-
-$entscale = 50; # divisor for optional entropy measurement
-
-sub usage {
-  return("Usage: $0 <command file>\n");
-}
-
-if (($#ARGV == -1) || ($#ARGV>1)) {
-  die(&usage);
-}
-
-# 'undocumented' option - run ent (in second param) on the output
-if ($#ARGV==1) {
-  $entcmd=$ARGV[1]
-} else {
-  $entcmd = ""
-};
-
-$infilename = $ARGV[0];
-
-if (!open(IN, "<".$infilename)) {
-  die("Couldn't open input file");
-}
-$outfilename=$infilename.".out";
-if (!open(OUT, ">$outfilename")) {
-  die("Couldn't open output file $outfilename");
-}
-@infile=<IN>;
-
-select(OUT); $|=1; select(STDOUT);
-
-foreach (@infile) {
-  if (/^\s*\#/ || /^\s*$/) {
-    print OUT;
-    next;
-  }
-  ($cmd, $path, $est) = /^\"([^\"]+)\"\s+([\w\/_-]+)\s+([\d\.\-]+)/o;
-  @args = split(/ /, $cmd);
-   if (! ($pid = fork())) {
-     # child
-     close STDIN; close STDOUT; close STDERR;
-     open (STDIN,  "</dev/null");
-     open (STDOUT, ">/dev/null");
-     open (STDERR, ">/dev/null");
-     exec $path @args;
-     exit 1; # shouldn't be here
-   }
-   # parent
-   waitpid ($pid, 0); $ret=$? >> 8;
-
-  if ($ret != 0) {
-    $path = "undef";
-  } else {
-    if ($entcmd ne "") {
-      # now try to run ent on the command
-      $mostargs=join(" ", splice(@args,1));
-      print "Evaluating '$path $mostargs'\n";
-      @ent = qx{$path $mostargs | $entcmd -b -t};
-      @ent = grep(/^1,/, @ent);
-      ($null, $null, $rate) = split(/,/, $ent[0]);
-      $est = $rate / $entscale;		# scale the estimate back
-    }
-  }
-  print OUT "\"$cmd\" $path $est\n";
-}
-
-close(IN);
diff --git a/fuchsia/sshd_config b/fuchsia/sshd_config
index 1dcdf13..44d9a3f 100644
--- a/fuchsia/sshd_config
+++ b/fuchsia/sshd_config
@@ -96,7 +96,6 @@
 ClientAliveInterval 1
 ClientAliveCountMax 5
 #UseLogin no
-UsePrivilegeSeparation no
 #PermitUserEnvironment no
 #Compression delayed
 #ClientAliveInterval 0
diff --git a/gss-genr.c b/gss-genr.c
index 62559ed..d56257b 100644
--- a/gss-genr.c
+++ b/gss-genr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gss-genr.c,v 1.24 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: gss-genr.c,v 1.26 2018/07/10 09:13:30 djm Exp $ */
 
 /*
  * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
@@ -37,7 +37,8 @@
 #include <unistd.h>
 
 #include "xmalloc.h"
-#include "buffer.h"
+#include "ssherr.h"
+#include "sshbuf.h"
 #include "log.h"
 #include "ssh2.h"
 
@@ -46,6 +47,21 @@
 extern u_char *session_id2;
 extern u_int session_id2_len;
 
+/* sshbuf_get for gss_buffer_desc */
+int
+ssh_gssapi_get_buffer_desc(struct sshbuf *b, gss_buffer_desc *g)
+{
+	int r;
+	u_char *p;
+	size_t len;
+
+	if ((r = sshbuf_get_string(b, &p, &len)) != 0)
+		return r;
+	g->value = p;
+	g->length = len;
+	return 0;
+}
+
 /* Check that the OID in a data stream matches that in the context */
 int
 ssh_gssapi_check_oid(Gssctxt *ctx, void *data, size_t len)
@@ -94,10 +110,12 @@
 	OM_uint32 lmin;
 	gss_buffer_desc msg = GSS_C_EMPTY_BUFFER;
 	OM_uint32 ctx;
-	Buffer b;
+	struct sshbuf *b;
 	char *ret;
+	int r;
 
-	buffer_init(&b);
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 
 	if (major_status != NULL)
 		*major_status = ctxt->major;
@@ -110,8 +128,9 @@
 		gss_display_status(&lmin, ctxt->major,
 		    GSS_C_GSS_CODE, ctxt->oid, &ctx, &msg);
 
-		buffer_append(&b, msg.value, msg.length);
-		buffer_put_char(&b, '\n');
+		if ((r = sshbuf_put(b, msg.value, msg.length)) != 0 ||
+		    (r = sshbuf_put_u8(b, '\n')) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 		gss_release_buffer(&lmin, &msg);
 	} while (ctx != 0);
@@ -121,16 +140,17 @@
 		gss_display_status(&lmin, ctxt->minor,
 		    GSS_C_MECH_CODE, ctxt->oid, &ctx, &msg);
 
-		buffer_append(&b, msg.value, msg.length);
-		buffer_put_char(&b, '\n');
+		if ((r = sshbuf_put(b, msg.value, msg.length)) != 0 ||
+		    (r = sshbuf_put_u8(b, '\n')) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 		gss_release_buffer(&lmin, &msg);
 	} while (ctx != 0);
 
-	buffer_put_char(&b, '\0');
-	ret = xmalloc(buffer_len(&b));
-	buffer_get(&b, ret, buffer_len(&b));
-	buffer_free(&b);
+	if ((r = sshbuf_put_u8(b, '\n')) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	ret = xstrdup((const char *)sshbuf_ptr(b));
+	sshbuf_free(b);
 	return (ret);
 }
 
@@ -238,15 +258,18 @@
 }
 
 void
-ssh_gssapi_buildmic(Buffer *b, const char *user, const char *service,
+ssh_gssapi_buildmic(struct sshbuf *b, const char *user, const char *service,
     const char *context)
 {
-	buffer_init(b);
-	buffer_put_string(b, session_id2, session_id2_len);
-	buffer_put_char(b, SSH2_MSG_USERAUTH_REQUEST);
-	buffer_put_cstring(b, user);
-	buffer_put_cstring(b, service);
-	buffer_put_cstring(b, context);
+	int r;
+
+	sshbuf_reset(b);
+	if ((r = sshbuf_put_string(b, session_id2, session_id2_len)) != 0 ||
+	    (r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshbuf_put_cstring(b, user)) != 0 ||
+	    (r = sshbuf_put_cstring(b, service)) != 0 ||
+	    (r = sshbuf_put_cstring(b, context)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 }
 
 int
diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
index 795992d..a151bc1 100644
--- a/gss-serv-krb5.c
+++ b/gss-serv-krb5.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gss-serv-krb5.c,v 1.8 2013/07/20 01:55:13 djm Exp $ */
+/* $OpenBSD: gss-serv-krb5.c,v 1.9 2018/07/09 21:37:55 markus Exp $ */
 
 /*
  * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
@@ -35,14 +35,13 @@
 #include <string.h>
 
 #include "xmalloc.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "log.h"
 #include "misc.h"
 #include "servconf.h"
 
-#include "buffer.h"
 #include "ssh-gss.h"
 
 extern ServerOptions options;
diff --git a/gss-serv.c b/gss-serv.c
index 53993d6..ab3a15f 100644
--- a/gss-serv.c
+++ b/gss-serv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gss-serv.c,v 1.29 2015/05/22 03:50:02 djm Exp $ */
+/* $OpenBSD: gss-serv.c,v 1.31 2018/07/09 21:37:55 markus Exp $ */
 
 /*
  * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
@@ -36,8 +36,7 @@
 
 #include "openbsd-compat/sys-queue.h"
 #include "xmalloc.h"
-#include "buffer.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "log.h"
@@ -393,4 +392,13 @@
 	return (ctx->major);
 }
 
+/* Privileged */
+const char *ssh_gssapi_displayname(void)
+{
+	if (gssapi_client.displayname.length == 0 ||
+	    gssapi_client.displayname.value == NULL)
+		return NULL;
+	return (char *)gssapi_client.displayname.value;
+}
+
 #endif
diff --git a/hash.c b/hash.c
index 734c6be..5875d41 100644
--- a/hash.c
+++ b/hash.c
@@ -1,76 +1,27 @@
-/* $OpenBSD: hash.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */
+/* $OpenBSD: hash.c,v 1.4 2017/12/14 21:07:39 naddy Exp $ */
 
-/* Copied from nacl-20110221/crypto_hash/sha512/ref/hash.c */
-
+/* $OpenBSD: hash.c,v 1.5 2018/01/13 00:24:09 naddy Exp $ */
 /*
-20080913
-D. J. Bernstein
-Public domain.
-*/
-
-#include "includes.h"
+ * Public domain. Author: Christian Weisgerber <naddy@openbsd.org>
+ * API compatible reimplementation of function from nacl
+ */
 
 #include "crypto_api.h"
 
-#define blocks crypto_hashblocks_sha512
+#include <stdarg.h>
 
-static const unsigned char iv[64] = {
-  0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08,
-  0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b,
-  0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b,
-  0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1,
-  0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1,
-  0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f,
-  0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b,
-  0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79
-} ;
+#include "digest.h"
+#include "log.h"
+#include "ssherr.h"
 
-typedef unsigned long long uint64;
-
-int crypto_hash_sha512(unsigned char *out,const unsigned char *in,unsigned long long inlen)
+int
+crypto_hash_sha512(unsigned char *out, const unsigned char *in,
+    unsigned long long inlen)
 {
-  unsigned char h[64];
-  unsigned char padded[256];
-  unsigned int i;
-  unsigned long long bytes = inlen;
+	int r;
 
-  for (i = 0;i < 64;++i) h[i] = iv[i];
-
-  blocks(h,in,inlen);
-  in += inlen;
-  inlen &= 127;
-  in -= inlen;
-
-  for (i = 0;i < inlen;++i) padded[i] = in[i];
-  padded[inlen] = 0x80;
-
-  if (inlen < 112) {
-    for (i = inlen + 1;i < 119;++i) padded[i] = 0;
-    padded[119] = bytes >> 61;
-    padded[120] = bytes >> 53;
-    padded[121] = bytes >> 45;
-    padded[122] = bytes >> 37;
-    padded[123] = bytes >> 29;
-    padded[124] = bytes >> 21;
-    padded[125] = bytes >> 13;
-    padded[126] = bytes >> 5;
-    padded[127] = bytes << 3;
-    blocks(h,padded,128);
-  } else {
-    for (i = inlen + 1;i < 247;++i) padded[i] = 0;
-    padded[247] = bytes >> 61;
-    padded[248] = bytes >> 53;
-    padded[249] = bytes >> 45;
-    padded[250] = bytes >> 37;
-    padded[251] = bytes >> 29;
-    padded[252] = bytes >> 21;
-    padded[253] = bytes >> 13;
-    padded[254] = bytes >> 5;
-    padded[255] = bytes << 3;
-    blocks(h,padded,256);
-  }
-
-  for (i = 0;i < 64;++i) out[i] = h[i];
-
-  return 0;
+	if ((r = ssh_digest_memory(SSH_DIGEST_SHA512, in, inlen, out,
+	    crypto_hash_sha512_BYTES)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
+	return 0;
 }
diff --git a/hostfile.c b/hostfile.c
index 4548fba..e1f826b 100644
--- a/hostfile.c
+++ b/hostfile.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hostfile.c,v 1.67 2016/09/17 18:00:27 tedu Exp $ */
+/* $OpenBSD: hostfile.c,v 1.73 2018/07/16 03:09:13 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -251,7 +251,7 @@
 	    l->marker == MRK_NONE ? "" :
 	    (l->marker == MRK_CA ? "ca " : "revoked "),
 	    sshkey_type(l->key), l->path, l->linenum);
-	if ((tmp = reallocarray(hostkeys->entries,
+	if ((tmp = recallocarray(hostkeys->entries, hostkeys->num_entries,
 	    hostkeys->num_entries + 1, sizeof(*hostkeys->entries))) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
 	hostkeys->entries = tmp;
@@ -346,16 +346,11 @@
 	HostStatus end_return = HOST_NEW;
 	int want_cert = sshkey_is_cert(k);
 	HostkeyMarker want_marker = want_cert ? MRK_CA : MRK_NONE;
-	int proto = (k ? k->type : keytype) == KEY_RSA1 ? 1 : 2;
 
 	if (found != NULL)
 		*found = NULL;
 
 	for (i = 0; i < hostkeys->num_entries; i++) {
-		if (proto == 1 && hostkeys->entries[i].key->type != KEY_RSA1)
-			continue;
-		if (proto == 2 && hostkeys->entries[i].key->type == KEY_RSA1)
-			continue;
 		if (hostkeys->entries[i].marker != want_marker)
 			continue;
 		if (k == NULL) {
@@ -419,19 +414,24 @@
     const struct sshkey *key, int store_hash)
 {
 	int r, success = 0;
-	char *hashed_host = NULL;
+	char *hashed_host = NULL, *lhost;
+
+	lhost = xstrdup(host);
+	lowercase(lhost);
 
 	if (store_hash) {
-		if ((hashed_host = host_hash(host, NULL, 0)) == NULL) {
+		if ((hashed_host = host_hash(lhost, NULL, 0)) == NULL) {
 			error("%s: host_hash failed", __func__);
+			free(lhost);
 			return 0;
 		}
 		fprintf(f, "%s ", hashed_host);
 	} else if (ip != NULL)
-		fprintf(f, "%s,%s ", host, ip);
-	else
-		fprintf(f, "%s ", host);
-
+		fprintf(f, "%s,%s ", lhost, ip);
+	else {
+		fprintf(f, "%s ", lhost);
+	}
+	free(lhost);
 	if ((r = sshkey_write(key, f)) == 0)
 		success = 1;
 	else
@@ -485,13 +485,6 @@
 			return 0;
 		}
 
-		/* XXX might need a knob for this later */
-		/* Don't remove RSA1 keys */
-		if (l->key->type == KEY_RSA1) {
-			fprintf(ctx->out, "%s\n", l->line);
-			return 0;
-		}
-
 		/*
 		 * If this line contains one of the keys that we will be
 		 * adding later, then don't change it and mark the key for
@@ -670,14 +663,14 @@
     const char *host, const char *ip, u_int options)
 {
 	FILE *f;
-	char line[8192], oline[8192], ktype[128];
+	char *line = NULL, ktype[128];
 	u_long linenum = 0;
 	char *cp, *cp2;
 	u_int kbits;
 	int hashed;
 	int s, r = 0;
 	struct hostkey_foreach_line lineinfo;
-	size_t l;
+	size_t linesize = 0, l;
 
 	memset(&lineinfo, 0, sizeof(lineinfo));
 	if (host == NULL && (options & HKF_WANT_MATCH) != 0)
@@ -686,15 +679,16 @@
 		return SSH_ERR_SYSTEM_ERROR;
 
 	debug3("%s: reading file \"%s\"", __func__, path);
-	while (read_keyfile_line(f, path, line, sizeof(line), &linenum) == 0) {
+	while (getline(&line, &linesize, f) != -1) {
+		linenum++;
 		line[strcspn(line, "\n")] = '\0';
-		strlcpy(oline, line, sizeof(oline));
 
+		free(lineinfo.line);
 		sshkey_free(lineinfo.key);
 		memset(&lineinfo, 0, sizeof(lineinfo));
 		lineinfo.path = path;
 		lineinfo.linenum = linenum;
-		lineinfo.line = oline;
+		lineinfo.line = xstrdup(line);
 		lineinfo.marker = MRK_NONE;
 		lineinfo.status = HKF_STATUS_OK;
 		lineinfo.keytype = KEY_UNSPEC;
@@ -784,20 +778,7 @@
 				break;
 			}
 			if (!hostfile_read_key(&cp, &kbits, lineinfo.key)) {
-#ifdef WITH_SSH1
-				sshkey_free(lineinfo.key);
-				lineinfo.key = sshkey_new(KEY_RSA1);
-				if (lineinfo.key  == NULL) {
-					error("%s: sshkey_new fail", __func__);
-					r = SSH_ERR_ALLOC_FAIL;
-					break;
-				}
-				if (!hostfile_read_key(&cp, &kbits,
-				    lineinfo.key))
-					goto bad;
-#else
 				goto bad;
-#endif
 			}
 			lineinfo.keytype = lineinfo.key->type;
 			lineinfo.comment = cp;
@@ -812,12 +793,12 @@
 			lineinfo.keytype = sshkey_type_from_name(ktype);
 
 			/*
-			 * Assume RSA1 if the first component is a short
+			 * Assume legacy RSA1 if the first component is a short
 			 * decimal number.
 			 */
 			if (lineinfo.keytype == KEY_UNSPEC && l < 8 &&
 			    strspn(ktype, "0123456789") == l)
-				lineinfo.keytype = KEY_RSA1;
+				goto bad;
 
 			/*
 			 * Check that something other than whitespace follows
@@ -846,6 +827,8 @@
 			break;
 	}
 	sshkey_free(lineinfo.key);
+	free(lineinfo.line);
+	free(line);
 	fclose(f);
 	return r;
 }
diff --git a/includes.h b/includes.h
index 497a038..0fd7179 100644
--- a/includes.h
+++ b/includes.h
@@ -93,6 +93,9 @@
 #ifdef HAVE_SYS_SYSMACROS_H
 # include <sys/sysmacros.h> /* For MIN, MAX, etc */
 #endif
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h> /* for timespeccmp if present */
+#endif
 #ifdef HAVE_SYS_MMAN_H
 #include <sys/mman.h> /* for MAP_ANONYMOUS */
 #endif
diff --git a/install-sh b/install-sh
index 220abbf..377bb86 100755
--- a/install-sh
+++ b/install-sh
@@ -1,251 +1,527 @@
 #!/bin/sh
-#
 # install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
+
+scriptversion=2011-11-20.07; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
 #
-# Copyright 1991 by the Massachusetts Institute of Technology
+# Copyright (C) 1994 X Consortium
 #
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
+# from scratch.
 
+nl='
+'
+IFS=" ""	$nl"
 
 # set DOITPROG to echo to test this script
 
 # Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-	-c) instcmd="$cpprog"
-	    shift
-	    continue;;
-
-	-d) dir_arg=true
-	    shift
-	    continue;;
-
-	-m) chmodcmd="$chmodprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-o) chowncmd="$chownprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-g) chgrpcmd="$chgrpprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-s) stripcmd="$stripprog"
-	    shift
-	    continue;;
-
-	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
-	    shift
-	    continue;;
-
-	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-	    shift
-	    continue;;
-
-	*)  if [ x"$src" = x ]
-	    then
-		src=$1
-	    else
-		# this colon is to work around a 386BSD /bin/sh bug
-		:
-		dst=$1
-	    fi
-	    shift
-	    continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-	echo "install:	no input file specified"
-	exit 1
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
 else
-	true
+  doit_exec=$doit
 fi
 
-if [ x"$dir_arg" != x ]; then
-	dst=$src
-	src=""
-	
-	if [ -d $dst ]; then
-		instcmd=:
-		chmodcmd=""
-	else
-		instcmd=mkdir
-	fi
-else
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
 
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
-# if $src (and thus $dsttmp) contains '*'.
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
 
-	if [ -f $src -o -d $src ]
-	then
-		true
-	else
-		echo "install:  $src does not exist"
-		exit 1
-	fi
-	
-	if [ x"$dst" = x ]
-	then
-		echo "install:	no destination specified"
-		exit 1
-	else
-		true
-	fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-	if [ -d $dst ]
-	then
-		dst="$dst"/`basename $src`
-	else
-		true
-	fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='	
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
 '
-IFS="${IFS-${defaultIFS}}"
 
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
+posix_mkdir=
 
-pathcomp=''
+# Desired mode of installed file.
+mode=0755
 
-while [ $# -ne 0 ] ; do
-	pathcomp="${pathcomp}${1}"
-	shift
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
 
-	if [ ! -d "${pathcomp}" ] ;
-	then
-		$mkdirprog "${pathcomp}"
-	else
-		true
-	fi
+src=
+dst=
+dir_arg=
+dst_arg=
 
-	pathcomp="${pathcomp}/"
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	# Protect names problematic for 'test' and other utilities.
+	case $dst_arg in
+	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
+	esac
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
 done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
 fi
 
-if [ x"$dir_arg" != x ]
-then
-	$doit $instcmd $dst &&
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
 
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
 
-# If we're going to rename the final executable, determine the name now.
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
 
-	if [ x"$transformarg" = x ]
-	then
-		dstfile=`basename $dst`
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
 	else
-		dstfile=`basename $dst $transformbasename |
-			sed $transformarg`$transformbasename
+	  mkdir_mode=
 	fi
 
-# don't allow the sed command to completely eliminate the filename
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
 
-	if [ x"$dstfile" = x ]
-	then
-		dstfile=`basename $dst`
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	[-=\(\)!]*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test X"$d" = X && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
 	else
-		true
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
 	fi
+	prefix=$prefix/
+      done
 
-# Make a temp file name in the proper directory.
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
 
-	dsttmp=$dstdir/#inst.$$#
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
 
-# Move or copy the file name to the temp name
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
 
-	$doit $instcmd $src $dsttmp &&
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
-	trap "rm -f ${dsttmp}" 0 &&
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
-# and set any options; do chmod last to preserve setuid bits
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
 
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
 
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
 
-# Now rename the file to the real destination.
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
 
-	$doit $rmcmd -f $dstdir/$dstfile &&
-	$doit $mvcmd $dsttmp $dstdir/$dstfile
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
 
-fi &&
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
 
+    trap '' 0
+  fi
+done
 
-exit 0
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/kex.c b/kex.c
index a30dabe..25f9f66 100644
--- a/kex.c
+++ b/kex.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex.c,v 1.128 2017/02/03 23:01:19 djm Exp $ */
+/* $OpenBSD: kex.c,v 1.141 2018/07/09 13:37:10 sf Exp $ */
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
  *
@@ -54,17 +54,9 @@
 #include "sshbuf.h"
 #include "digest.h"
 
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
-# if defined(HAVE_EVP_SHA256)
-# define evp_ssh_sha256 EVP_sha256
-# else
-extern const EVP_MD *evp_ssh_sha256(void);
-# endif
-#endif
-
 /* prototype */
 static int kex_choose_conf(struct ssh *);
-static int kex_input_newkeys(int, u_int32_t, void *);
+static int kex_input_newkeys(int, u_int32_t, struct ssh *);
 
 static const char *proposal_names[PROPOSAL_MAX] = {
 	"KEX algorithms",
@@ -178,11 +170,11 @@
 char *
 kex_names_cat(const char *a, const char *b)
 {
-	char *ret = NULL, *tmp = NULL, *cp, *p;
+	char *ret = NULL, *tmp = NULL, *cp, *p, *m;
 	size_t len;
 
 	if (a == NULL || *a == '\0')
-		return NULL;
+		return strdup(b);
 	if (b == NULL || *b == '\0')
 		return strdup(a);
 	if (strlen(b) > 1024*1024)
@@ -195,8 +187,10 @@
 	}
 	strlcpy(ret, a, len);
 	for ((p = strsep(&cp, ",")); p && *p != '\0'; (p = strsep(&cp, ","))) {
-		if (match_list(ret, p, NULL) != NULL)
+		if ((m = match_list(ret, p, NULL)) != NULL) {
+			free(m);
 			continue; /* Algorithm already present */
+		}
 		if (strlcat(ret, ",", len) >= len ||
 		    strlcat(ret, p, len) >= len) {
 			free(tmp);
@@ -215,27 +209,88 @@
  * specified names should be removed.
  */
 int
-kex_assemble_names(const char *def, char **list)
+kex_assemble_names(char **listp, const char *def, const char *all)
 {
-	char *ret;
+	char *cp, *tmp, *patterns;
+	char *list = NULL, *ret = NULL, *matching = NULL, *opatterns = NULL;
+	int r = SSH_ERR_INTERNAL_ERROR;
 
-	if (list == NULL || *list == NULL || **list == '\0') {
-		*list = strdup(def);
+	if (listp == NULL || *listp == NULL || **listp == '\0') {
+		if ((*listp = strdup(def)) == NULL)
+			return SSH_ERR_ALLOC_FAIL;
 		return 0;
 	}
-	if (**list == '+') {
-		if ((ret = kex_names_cat(def, *list + 1)) == NULL)
-			return SSH_ERR_ALLOC_FAIL;
-		free(*list);
-		*list = ret;
-	} else if (**list == '-') {
-		if ((ret = match_filter_list(def, *list + 1)) == NULL)
-			return SSH_ERR_ALLOC_FAIL;
-		free(*list);
-		*list = ret;
+
+	list = *listp;
+	*listp = NULL;
+	if (*list == '+') {
+		/* Append names to default list */
+		if ((tmp = kex_names_cat(def, list + 1)) == NULL) {
+			r = SSH_ERR_ALLOC_FAIL;
+			goto fail;
+		}
+		free(list);
+		list = tmp;
+	} else if (*list == '-') {
+		/* Remove names from default list */
+		if ((*listp = match_filter_blacklist(def, list + 1)) == NULL) {
+			r = SSH_ERR_ALLOC_FAIL;
+			goto fail;
+		}
+		free(list);
+		/* filtering has already been done */
+		return 0;
+	} else {
+		/* Explicit list, overrides default - just use "list" as is */
 	}
 
-	return 0;
+	/*
+	 * The supplied names may be a pattern-list. For the -list case,
+	 * the patterns are applied above. For the +list and explicit list
+	 * cases we need to do it now.
+	 */
+	ret = NULL;
+	if ((patterns = opatterns = strdup(list)) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto fail;
+	}
+	/* Apply positive (i.e. non-negated) patterns from the list */
+	while ((cp = strsep(&patterns, ",")) != NULL) {
+		if (*cp == '!') {
+			/* negated matches are not supported here */
+			r = SSH_ERR_INVALID_ARGUMENT;
+			goto fail;
+		}
+		free(matching);
+		if ((matching = match_filter_whitelist(all, cp)) == NULL) {
+			r = SSH_ERR_ALLOC_FAIL;
+			goto fail;
+		}
+		if ((tmp = kex_names_cat(ret, matching)) == NULL) {
+			r = SSH_ERR_ALLOC_FAIL;
+			goto fail;
+		}
+		free(ret);
+		ret = tmp;
+	}
+	if (ret == NULL || *ret == '\0') {
+		/* An empty name-list is an error */
+		/* XXX better error code? */
+		r = SSH_ERR_INVALID_ARGUMENT;
+		goto fail;
+	}
+
+	/* success */
+	*listp = ret;
+	ret = NULL;
+	r = 0;
+
+ fail:
+	free(matching);
+	free(opatterns);
+	free(list);
+	free(ret);
+	return r;
 }
 
 /* put algorithm proposal into buffer */
@@ -321,9 +376,8 @@
 
 /* ARGSUSED */
 static int
-kex_protocol_error(int type, u_int32_t seq, void *ctxt)
+kex_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = active_state; /* XXX */
 	int r;
 
 	error("kex protocol error: type %d seq %u", type, seq);
@@ -339,7 +393,6 @@
 {
 	ssh_dispatch_range(ssh, SSH2_MSG_TRANSPORT_MIN,
 	    SSH2_MSG_TRANSPORT_MAX, &kex_protocol_error);
-	ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_input_kexinit);
 }
 
 static int
@@ -348,8 +401,9 @@
 	int r;
 	char *algs;
 
-	if ((algs = sshkey_alg_list(0, 1, ',')) == NULL)
+	if ((algs = sshkey_alg_list(0, 1, 1, ',')) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
+	/* XXX filter algs list by allowed pubkey/hostbased types */
 	if ((r = sshpkt_start(ssh, SSH2_MSG_EXT_INFO)) != 0 ||
 	    (r = sshpkt_put_u32(ssh, 1)) != 0 ||
 	    (r = sshpkt_put_cstring(ssh, "server-sig-algs")) != 0 ||
@@ -382,12 +436,13 @@
 }
 
 int
-kex_input_ext_info(int type, u_int32_t seq, void *ctxt)
+kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	u_int32_t i, ninfo;
-	char *name, *val, *found;
+	char *name;
+	u_char *val;
+	size_t vlen;
 	int r;
 
 	debug("SSH2_MSG_EXT_INFO received");
@@ -397,23 +452,21 @@
 	for (i = 0; i < ninfo; i++) {
 		if ((r = sshpkt_get_cstring(ssh, &name, NULL)) != 0)
 			return r;
-		if ((r = sshpkt_get_cstring(ssh, &val, NULL)) != 0) {
+		if ((r = sshpkt_get_string(ssh, &val, &vlen)) != 0) {
 			free(name);
 			return r;
 		}
-		debug("%s: %s=<%s>", __func__, name, val);
 		if (strcmp(name, "server-sig-algs") == 0) {
-			found = match_list("rsa-sha2-256", val, NULL);
-			if (found) {
-				kex->rsa_sha2 = 256;
-				free(found);
+			/* Ensure no \0 lurking in value */
+			if (memchr(val, '\0', vlen) != NULL) {
+				error("%s: nul byte in %s", __func__, name);
+				return SSH_ERR_INVALID_FORMAT;
 			}
-			found = match_list("rsa-sha2-512", val, NULL);
-			if (found) {
-				kex->rsa_sha2 = 512;
-				free(found);
-			}
-		}
+			debug("%s: %s=<%s>", __func__, name, val);
+			kex->server_sig_algs = val;
+			val = NULL;
+		} else
+			debug("%s: %s (unrecognised)", __func__, name);
 		free(name);
 		free(val);
 	}
@@ -421,14 +474,14 @@
 }
 
 static int
-kex_input_newkeys(int type, u_int32_t seq, void *ctxt)
+kex_input_newkeys(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	int r;
 
 	debug("SSH2_MSG_NEWKEYS received");
 	ssh_dispatch_set(ssh, SSH2_MSG_NEWKEYS, &kex_protocol_error);
+	ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_input_kexinit);
 	if ((r = sshpkt_get_end(ssh)) != 0)
 		return r;
 	if ((r = ssh_set_newkeys(ssh, MODE_IN)) != 0)
@@ -473,9 +526,8 @@
 
 /* ARGSUSED */
 int
-kex_input_kexinit(int type, u_int32_t seq, void *ctxt)
+kex_input_kexinit(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	const u_char *ptr;
 	u_int i;
@@ -543,6 +595,7 @@
 		goto out;
 	kex->done = 0;
 	kex_reset_dispatch(ssh);
+	ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_input_kexinit);
 	r = 0;
 	*kexp = kex;
  out:
@@ -588,11 +641,9 @@
 	u_int mode;
 
 #ifdef WITH_OPENSSL
-	if (kex->dh)
-		DH_free(kex->dh);
+	DH_free(kex->dh);
 #ifdef OPENSSL_HAS_ECC
-	if (kex->ec_client_key)
-		EC_KEY_free(kex->ec_client_key);
+	EC_KEY_free(kex->ec_client_key);
 #endif /* OPENSSL_HAS_ECC */
 #endif /* WITH_OPENSSL */
 	for (mode = 0; mode < MODE_MAX; mode++) {
@@ -651,8 +702,10 @@
 
 	if (name == NULL)
 		return SSH_ERR_NO_CIPHER_ALG_MATCH;
-	if ((enc->cipher = cipher_by_name(name)) == NULL)
+	if ((enc->cipher = cipher_by_name(name)) == NULL) {
+		free(name);
 		return SSH_ERR_INTERNAL_ERROR;
+	}
 	enc->name = name;
 	enc->enabled = 0;
 	enc->iv = NULL;
@@ -670,11 +723,10 @@
 
 	if (name == NULL)
 		return SSH_ERR_NO_MAC_ALG_MATCH;
-	if (mac_setup(mac, name) < 0)
+	if (mac_setup(mac, name) < 0) {
+		free(name);
 		return SSH_ERR_INTERNAL_ERROR;
-	/* truncate the key */
-	if (ssh->compat & SSH_BUG_HMAC)
-		mac->key_len = 16;
+	}
 	mac->name = name;
 	mac->key = NULL;
 	mac->enabled = 0;
@@ -695,6 +747,7 @@
 	} else if (strcmp(name, "none") == 0) {
 		comp->type = COMP_NONE;
 	} else {
+		free(name);
 		return SSH_ERR_INTERNAL_ERROR;
 	}
 	comp->name = name;
@@ -862,8 +915,7 @@
 	kex->dh_need = dh_need;
 
 	/* ignore the next message if the proposals do not match */
-	if (first_kex_follows && !proposals_match(my, peer) &&
-	    !(ssh->compat & SSH_BUG_FIRSTKEX))
+	if (first_kex_follows && !proposals_match(my, peer))
 		ssh->dispatch_skip_packets = 1;
 	r = 0;
  out:
@@ -980,47 +1032,6 @@
 }
 #endif
 
-#ifdef WITH_SSH1
-int
-derive_ssh1_session_id(BIGNUM *host_modulus, BIGNUM *server_modulus,
-    u_int8_t cookie[8], u_int8_t id[16])
-{
-	u_int8_t hbuf[2048], sbuf[2048], obuf[SSH_DIGEST_MAX_LENGTH];
-	struct ssh_digest_ctx *hashctx = NULL;
-	size_t hlen, slen;
-	int r;
-
-	hlen = BN_num_bytes(host_modulus);
-	slen = BN_num_bytes(server_modulus);
-	if (hlen < (512 / 8) || (u_int)hlen > sizeof(hbuf) ||
-	    slen < (512 / 8) || (u_int)slen > sizeof(sbuf))
-		return SSH_ERR_KEY_BITS_MISMATCH;
-	if (BN_bn2bin(host_modulus, hbuf) <= 0 ||
-	    BN_bn2bin(server_modulus, sbuf) <= 0) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-	if ((hashctx = ssh_digest_start(SSH_DIGEST_MD5)) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-	if (ssh_digest_update(hashctx, hbuf, hlen) != 0 ||
-	    ssh_digest_update(hashctx, sbuf, slen) != 0 ||
-	    ssh_digest_update(hashctx, cookie, 8) != 0 ||
-	    ssh_digest_final(hashctx, obuf, sizeof(obuf)) != 0) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-	memcpy(id, obuf, ssh_digest_bytes(SSH_DIGEST_MD5));
-	r = 0;
- out:
-	ssh_digest_free(hashctx);
-	explicit_bzero(hbuf, sizeof(hbuf));
-	explicit_bzero(sbuf, sizeof(sbuf));
-	explicit_bzero(obuf, sizeof(obuf));
-	return r;
-}
-#endif
 
 #if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) || defined(DEBUG_KEXECDH)
 void
diff --git a/kex.h b/kex.h
index 3794f21..593de12 100644
--- a/kex.h
+++ b/kex.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex.h,v 1.81 2016/09/28 21:44:52 djm Exp $ */
+/* $OpenBSD: kex.h,v 1.91 2018/07/11 18:53:29 markus Exp $ */
 
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
@@ -27,8 +27,6 @@
 #define KEX_H
 
 #include "mac.h"
-#include "buffer.h" /* XXX for typedef */
-#include "key.h" /* XXX for typedef */
 
 #ifdef WITH_LEAKMALLOC
 #include "leakmalloc.h"
@@ -43,6 +41,8 @@
 #  define EC_POINT	void
 # endif /* OPENSSL_HAS_ECC */
 #else /* WITH_OPENSSL */
+# define DH		void
+# define BIGNUM		void
 # define EC_KEY		void
 # define EC_GROUP	void
 # define EC_POINT	void
@@ -64,6 +64,7 @@
 #define	KEX_CURVE25519_SHA256_OLD	"curve25519-sha256@libssh.org"
 
 #define COMP_NONE	0
+/* pre-auth compression (COMP_ZLIB) is only supported in the client */
 #define COMP_ZLIB	1
 #define COMP_DELAYED	2
 
@@ -139,7 +140,7 @@
 	int	hostkey_type;
 	int	hostkey_nid;
 	u_int	kex_type;
-	int	rsa_sha2;
+	char	*server_sig_algs;
 	int	ext_info_c;
 	struct sshbuf *my;
 	struct sshbuf *peer;
@@ -169,7 +170,7 @@
 int	 kex_names_valid(const char *);
 char	*kex_alg_list(char);
 char	*kex_names_cat(const char *, const char *);
-int	 kex_assemble_names(const char *, char **);
+int	 kex_assemble_names(char **, const char *, const char *);
 
 int	 kex_new(struct ssh *, char *[PROPOSAL_MAX], struct kex **);
 int	 kex_setup(struct ssh *, char *[PROPOSAL_MAX]);
@@ -181,8 +182,8 @@
 void	 kex_prop_free(char **);
 
 int	 kex_send_kexinit(struct ssh *);
-int	 kex_input_kexinit(int, u_int32_t, void *);
-int	 kex_input_ext_info(int, u_int32_t, void *);
+int	 kex_input_kexinit(int, u_int32_t, struct ssh *);
+int	 kex_input_ext_info(int, u_int32_t, struct ssh *);
 int	 kex_derive_keys(struct ssh *, u_char *, u_int, const struct sshbuf *);
 int	 kex_derive_keys_bn(struct ssh *, u_char *, u_int, const BIGNUM *);
 int	 kex_send_newkeys(struct ssh *);
@@ -225,9 +226,6 @@
 	__attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
 	__attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
 
-int
-derive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]);
-
 #if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) || defined(DEBUG_KEXECDH)
 void	dump_digest(char *, u_char *, int);
 #endif
diff --git a/kexc25519c.c b/kexc25519c.c
index b7ef65d..a8d9214 100644
--- a/kexc25519c.c
+++ b/kexc25519c.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexc25519c.c,v 1.7 2015/01/26 06:10:03 djm Exp $ */
+/* $OpenBSD: kexc25519c.c,v 1.9 2017/12/18 02:25:15 djm Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2010 Damien Miller.  All rights reserved.
@@ -44,7 +44,7 @@
 #include "ssherr.h"
 
 static int
-input_kex_c25519_reply(int type, u_int32_t seq, void *ctxt);
+input_kex_c25519_reply(int type, u_int32_t seq, struct ssh *ssh);
 
 int
 kexc25519_client(struct ssh *ssh)
@@ -69,9 +69,8 @@
 }
 
 static int
-input_kex_c25519_reply(int type, u_int32_t seq, void *ctxt)
+input_kex_c25519_reply(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	struct sshkey *server_host_key = NULL;
 	struct sshbuf *shared_secret = NULL;
@@ -142,7 +141,7 @@
 		goto out;
 
 	if ((r = sshkey_verify(server_host_key, signature, slen, hash, hashlen,
-	    ssh->compat)) != 0)
+	    kex->hostkey_alg, ssh->compat)) != 0)
 		goto out;
 
 	/* save session id */
diff --git a/kexc25519s.c b/kexc25519s.c
index 4e77622..0800a7a 100644
--- a/kexc25519s.c
+++ b/kexc25519s.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexc25519s.c,v 1.10 2015/12/04 16:41:28 markus Exp $ */
+/* $OpenBSD: kexc25519s.c,v 1.11 2017/05/31 04:19:28 djm Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2010 Damien Miller.  All rights reserved.
@@ -41,7 +41,7 @@
 #include "sshbuf.h"
 #include "ssherr.h"
 
-static int input_kex_c25519_init(int, u_int32_t, void *);
+static int input_kex_c25519_init(int, u_int32_t, struct ssh *);
 
 int
 kexc25519_server(struct ssh *ssh)
@@ -52,9 +52,8 @@
 }
 
 static int
-input_kex_c25519_init(int type, u_int32_t seq, void *ctxt)
+input_kex_c25519_init(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	struct sshkey *server_host_private, *server_host_public;
 	struct sshbuf *shared_secret = NULL;
diff --git a/kexdhc.c b/kexdhc.c
index ad3975f..9a9f1ea 100644
--- a/kexdhc.c
+++ b/kexdhc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexdhc.c,v 1.19 2016/05/02 10:26:04 djm Exp $ */
+/* $OpenBSD: kexdhc.c,v 1.22 2018/02/07 02:06:51 jsing Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  *
@@ -49,7 +49,7 @@
 #include "ssherr.h"
 #include "sshbuf.h"
 
-static int input_kex_dh(int, u_int32_t, void *);
+static int input_kex_dh(int, u_int32_t, struct ssh *);
 
 int
 kexdh_client(struct ssh *ssh)
@@ -100,9 +100,8 @@
 }
 
 static int
-input_kex_dh(int type, u_int32_t seq, void *ctxt)
+input_kex_dh(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	BIGNUM *dh_server_pub = NULL, *shared_secret = NULL;
 	struct sshkey *server_host_key = NULL;
@@ -184,7 +183,7 @@
 		goto out;
 
 	if ((r = sshkey_verify(server_host_key, signature, slen, hash, hashlen,
-	    ssh->compat)) != 0)
+	    kex->hostkey_alg, ssh->compat)) != 0)
 		goto out;
 
 	/* save session id */
@@ -204,14 +203,12 @@
 	explicit_bzero(hash, sizeof(hash));
 	DH_free(kex->dh);
 	kex->dh = NULL;
-	if (dh_server_pub)
-		BN_clear_free(dh_server_pub);
+	BN_clear_free(dh_server_pub);
 	if (kbuf) {
 		explicit_bzero(kbuf, klen);
 		free(kbuf);
 	}
-	if (shared_secret)
-		BN_clear_free(shared_secret);
+	BN_clear_free(shared_secret);
 	sshkey_free(server_host_key);
 	free(server_host_key_blob);
 	free(signature);
diff --git a/kexdhs.c b/kexdhs.c
index 108f664..5dfca0a 100644
--- a/kexdhs.c
+++ b/kexdhs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexdhs.c,v 1.24 2016/05/02 10:26:04 djm Exp $ */
+/* $OpenBSD: kexdhs.c,v 1.27 2018/04/10 00:10:49 djm Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  *
@@ -49,7 +49,7 @@
 #include "ssherr.h"
 #include "sshbuf.h"
 
-static int input_kex_dh_init(int, u_int32_t, void *);
+static int input_kex_dh_init(int, u_int32_t, struct ssh *);
 
 int
 kexdh_server(struct ssh *ssh)
@@ -91,9 +91,8 @@
 }
 
 int
-input_kex_dh_init(int type, u_int32_t seq, void *ctxt)
+input_kex_dh_init(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	BIGNUM *shared_secret = NULL, *dh_client_pub = NULL;
 	struct sshkey *server_host_public, *server_host_private;
@@ -195,7 +194,7 @@
 
 	/* destroy_sensitive_data(); */
 
-	/* send server hostkey, DH pubkey 'f' and singed H */
+	/* send server hostkey, DH pubkey 'f' and signed H */
 	if ((r = sshpkt_start(ssh, SSH2_MSG_KEXDH_REPLY)) != 0 ||
 	    (r = sshpkt_put_string(ssh, server_host_key_blob, sbloblen)) != 0 ||
 	    (r = sshpkt_put_bignum2(ssh, kex->dh->pub_key)) != 0 ||	/* f */
@@ -209,14 +208,12 @@
 	explicit_bzero(hash, sizeof(hash));
 	DH_free(kex->dh);
 	kex->dh = NULL;
-	if (dh_client_pub)
-		BN_clear_free(dh_client_pub);
+	BN_clear_free(dh_client_pub);
 	if (kbuf) {
 		explicit_bzero(kbuf, klen);
 		free(kbuf);
 	}
-	if (shared_secret)
-		BN_clear_free(shared_secret);
+	BN_clear_free(shared_secret);
 	free(server_host_key_blob);
 	free(signature);
 	return r;
diff --git a/kexecdhc.c b/kexecdhc.c
index 90220ce..ac146a3 100644
--- a/kexecdhc.c
+++ b/kexecdhc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexecdhc.c,v 1.10 2015/01/26 06:10:03 djm Exp $ */
+/* $OpenBSD: kexecdhc.c,v 1.13 2018/02/07 02:06:51 jsing Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2010 Damien Miller.  All rights reserved.
@@ -49,7 +49,7 @@
 #include "ssherr.h"
 #include "sshbuf.h"
 
-static int input_kex_ecdh_reply(int, u_int32_t, void *);
+static int input_kex_ecdh_reply(int, u_int32_t, struct ssh *);
 
 int
 kexecdh_client(struct ssh *ssh)
@@ -89,15 +89,13 @@
 	ssh_dispatch_set(ssh, SSH2_MSG_KEX_ECDH_REPLY, &input_kex_ecdh_reply);
 	r = 0;
  out:
-	if (client_key)
-		EC_KEY_free(client_key);
+	EC_KEY_free(client_key);
 	return r;
 }
 
 static int
-input_kex_ecdh_reply(int type, u_int32_t seq, void *ctxt)
+input_kex_ecdh_reply(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	const EC_GROUP *group;
 	EC_POINT *server_public = NULL;
@@ -189,7 +187,7 @@
 		goto out;
 
 	if ((r = sshkey_verify(server_host_key, signature, slen, hash,
-	    hashlen, ssh->compat)) != 0)
+	    hashlen, kex->hostkey_alg, ssh->compat)) != 0)
 		goto out;
 
 	/* save session id */
@@ -207,18 +205,14 @@
 		r = kex_send_newkeys(ssh);
  out:
 	explicit_bzero(hash, sizeof(hash));
-	if (kex->ec_client_key) {
-		EC_KEY_free(kex->ec_client_key);
-		kex->ec_client_key = NULL;
-	}
-	if (server_public)
-		EC_POINT_clear_free(server_public);
+	EC_KEY_free(kex->ec_client_key);
+	kex->ec_client_key = NULL;
+	EC_POINT_clear_free(server_public);
 	if (kbuf) {
 		explicit_bzero(kbuf, klen);
 		free(kbuf);
 	}
-	if (shared_secret)
-		BN_clear_free(shared_secret);
+	BN_clear_free(shared_secret);
 	sshkey_free(server_host_key);
 	free(server_host_key_blob);
 	free(signature);
diff --git a/kexecdhs.c b/kexecdhs.c
index ccdbf70..af4f303 100644
--- a/kexecdhs.c
+++ b/kexecdhs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexecdhs.c,v 1.15 2015/12/04 16:41:28 markus Exp $ */
+/* $OpenBSD: kexecdhs.c,v 1.17 2018/02/07 02:06:51 jsing Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2010 Damien Miller.  All rights reserved.
@@ -47,7 +47,7 @@
 #include "ssherr.h"
 #include "sshbuf.h"
 
-static int input_kex_ecdh_init(int, u_int32_t, void *);
+static int input_kex_ecdh_init(int, u_int32_t, struct ssh *);
 
 int
 kexecdh_server(struct ssh *ssh)
@@ -58,9 +58,8 @@
 }
 
 static int
-input_kex_ecdh_init(int type, u_int32_t seq, void *ctxt)
+input_kex_ecdh_init(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	EC_POINT *client_public;
 	EC_KEY *server_key = NULL;
@@ -188,18 +187,14 @@
 		r = kex_send_newkeys(ssh);
  out:
 	explicit_bzero(hash, sizeof(hash));
-	if (kex->ec_client_key) {
-		EC_KEY_free(kex->ec_client_key);
-		kex->ec_client_key = NULL;
-	}
-	if (server_key)
-		EC_KEY_free(server_key);
+	EC_KEY_free(kex->ec_client_key);
+	kex->ec_client_key = NULL;
+	EC_KEY_free(server_key);
 	if (kbuf) {
 		explicit_bzero(kbuf, klen);
 		free(kbuf);
 	}
-	if (shared_secret)
-		BN_clear_free(shared_secret);
+	BN_clear_free(shared_secret);
 	free(server_host_key_blob);
 	free(signature);
 	return r;
diff --git a/kexgexc.c b/kexgexc.c
index ad0d1c8..762a9a3 100644
--- a/kexgexc.c
+++ b/kexgexc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexgexc.c,v 1.23 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: kexgexc.c,v 1.27 2018/02/07 02:06:51 jsing Exp $ */
 /*
  * Copyright (c) 2000 Niels Provos.  All rights reserved.
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
@@ -51,8 +51,8 @@
 #include "sshbuf.h"
 #include "misc.h"
 
-static int input_kex_dh_gex_group(int, u_int32_t, void *);
-static int input_kex_dh_gex_reply(int, u_int32_t, void *);
+static int input_kex_dh_gex_group(int, u_int32_t, struct ssh *);
+static int input_kex_dh_gex_reply(int, u_int32_t, struct ssh *);
 
 int
 kexgex_client(struct ssh *ssh)
@@ -89,9 +89,8 @@
 }
 
 static int
-input_kex_dh_gex_group(int type, u_int32_t seq, void *ctxt)
+input_kex_dh_gex_group(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	BIGNUM *p = NULL, *g = NULL;
 	int r, bits;
@@ -135,17 +134,14 @@
 	ssh_dispatch_set(ssh, SSH2_MSG_KEX_DH_GEX_REPLY, &input_kex_dh_gex_reply);
 	r = 0;
 out:
-	if (p)
-		BN_clear_free(p);
-	if (g)
-		BN_clear_free(g);
+	BN_clear_free(p);
+	BN_clear_free(g);
 	return r;
 }
 
 static int
-input_kex_dh_gex_reply(int type, u_int32_t seq, void *ctxt)
+input_kex_dh_gex_reply(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	BIGNUM *dh_server_pub = NULL, *shared_secret = NULL;
 	struct sshkey *server_host_key = NULL;
@@ -165,10 +161,6 @@
 	    (r = sshkey_from_blob(server_host_key_blob, sbloblen,
 	    &server_host_key)) != 0)
 		goto out;
-	if (server_host_key->type != kex->hostkey_type) {
-		r = SSH_ERR_KEY_TYPE_MISMATCH;
-		goto out;
-	}
 	if (server_host_key->type != kex->hostkey_type ||
 	    (kex->hostkey_type == KEY_ECDSA &&
 	    server_host_key->ecdsa_nid != kex->hostkey_nid)) {
@@ -236,7 +228,7 @@
 		goto out;
 
 	if ((r = sshkey_verify(server_host_key, signature, slen, hash,
-	    hashlen, ssh->compat)) != 0)
+	    hashlen, kex->hostkey_alg, ssh->compat)) != 0)
 		goto out;
 
 	/* save session id */
@@ -256,14 +248,12 @@
 	explicit_bzero(hash, sizeof(hash));
 	DH_free(kex->dh);
 	kex->dh = NULL;
-	if (dh_server_pub)
-		BN_clear_free(dh_server_pub);
+	BN_clear_free(dh_server_pub);
 	if (kbuf) {
 		explicit_bzero(kbuf, klen);
 		free(kbuf);
 	}
-	if (shared_secret)
-		BN_clear_free(shared_secret);
+	BN_clear_free(shared_secret);
 	sshkey_free(server_host_key);
 	free(server_host_key_blob);
 	free(signature);
diff --git a/kexgexs.c b/kexgexs.c
index 4496035..f6983fd 100644
--- a/kexgexs.c
+++ b/kexgexs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexgexs.c,v 1.30 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: kexgexs.c,v 1.33 2018/04/10 00:10:49 djm Exp $ */
 /*
  * Copyright (c) 2000 Niels Provos.  All rights reserved.
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
@@ -54,8 +54,8 @@
 #include "sshbuf.h"
 #include "misc.h"
 
-static int input_kex_dh_gex_request(int, u_int32_t, void *);
-static int input_kex_dh_gex_init(int, u_int32_t, void *);
+static int input_kex_dh_gex_request(int, u_int32_t, struct ssh *);
+static int input_kex_dh_gex_init(int, u_int32_t, struct ssh *);
 
 int
 kexgex_server(struct ssh *ssh)
@@ -67,9 +67,8 @@
 }
 
 static int
-input_kex_dh_gex_request(int type, u_int32_t seq, void *ctxt)
+input_kex_dh_gex_request(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	int r;
 	u_int min = 0, max = 0, nbits = 0;
@@ -120,9 +119,8 @@
 }
 
 static int
-input_kex_dh_gex_init(int type, u_int32_t seq, void *ctxt)
+input_kex_dh_gex_init(int type, u_int32_t seq, struct ssh *ssh)
 {
-	struct ssh *ssh = ctxt;
 	struct kex *kex = ssh->kex;
 	BIGNUM *shared_secret = NULL, *dh_client_pub = NULL;
 	struct sshkey *server_host_public, *server_host_private;
@@ -226,7 +224,7 @@
 
 	/* destroy_sensitive_data(); */
 
-	/* send server hostkey, DH pubkey 'f' and singed H */
+	/* send server hostkey, DH pubkey 'f' and signed H */
 	if ((r = sshpkt_start(ssh, SSH2_MSG_KEX_DH_GEX_REPLY)) != 0 ||
 	    (r = sshpkt_put_string(ssh, server_host_key_blob, sbloblen)) != 0 ||
 	    (r = sshpkt_put_bignum2(ssh, kex->dh->pub_key)) != 0 ||     /* f */
@@ -239,14 +237,12 @@
  out:
 	DH_free(kex->dh);
 	kex->dh = NULL;
-	if (dh_client_pub)
-		BN_clear_free(dh_client_pub);
+	BN_clear_free(dh_client_pub);
 	if (kbuf) {
 		explicit_bzero(kbuf, klen);
 		free(kbuf);
 	}
-	if (shared_secret)
-		BN_clear_free(shared_secret);
+	BN_clear_free(shared_secret);
 	free(server_host_key_blob);
 	free(signature);
 	return r;
diff --git a/key.c b/key.c
deleted file mode 100644
index 93f4ccb..0000000
--- a/key.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/* $OpenBSD: key.c,v 1.130 2016/05/02 09:36:42 djm Exp $ */
-/*
- * placed in the public domain
- */
-
-#include "includes.h"
-
-#include <sys/types.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <limits.h>
-
-#define SSH_KEY_NO_DEFINE
-#include "key.h"
-
-#include "compat.h"
-#include "sshkey.h"
-#include "ssherr.h"
-#include "log.h"
-#include "authfile.h"
-
-void
-key_add_private(Key *k)
-{
-	int r;
-
-	if ((r = sshkey_add_private(k)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-}
-
-Key *
-key_new_private(int type)
-{
-	Key *ret = NULL;
-
-	if ((ret = sshkey_new_private(type)) == NULL)
-		fatal("%s: failed", __func__);
-	return ret;
-}
-
-int
-key_read(Key *ret, char **cpp)
-{
-	return sshkey_read(ret, cpp) == 0 ? 1 : -1;
-}
-
-int
-key_write(const Key *key, FILE *f)
-{
-	return sshkey_write(key, f) == 0 ? 1 : 0;
-}
-
-Key *
-key_generate(int type, u_int bits)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_generate(type, bits, &ret)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-	return ret;
-}
-
-void
-key_cert_copy(const Key *from_key, Key *to_key)
-{
-	int r;
-
-	if ((r = sshkey_cert_copy(from_key, to_key)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-}
-
-Key *
-key_from_private(const Key *k)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_from_private(k, &ret)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-	return ret;
-}
-
-static void
-fatal_on_fatal_errors(int r, const char *func, int extra_fatal)
-{
-	if (r == SSH_ERR_INTERNAL_ERROR ||
-	    r == SSH_ERR_ALLOC_FAIL ||
-	    (extra_fatal != 0 && r == extra_fatal))
-		fatal("%s: %s", func, ssh_err(r));
-}
-
-Key *
-key_from_blob(const u_char *blob, u_int blen)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_from_blob(blob, blen, &ret)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return NULL;
-	}
-	return ret;
-}
-
-int
-key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
-{
-	u_char *blob;
-	size_t blen;
-	int r;
-
-	if (blobp != NULL)
-		*blobp = NULL;
-	if (lenp != NULL)
-		*lenp = 0;
-	if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return 0;
-	}
-	if (blen > INT_MAX)
-		fatal("%s: giant len %zu", __func__, blen);
-	if (blobp != NULL)
-		*blobp = blob;
-	if (lenp != NULL)
-		*lenp = blen;
-	return blen;
-}
-
-int
-key_sign(const Key *key, u_char **sigp, u_int *lenp,
-    const u_char *data, u_int datalen, const char *alg)
-{
-	int r;
-	u_char *sig;
-	size_t siglen;
-
-	if (sigp != NULL)
-		*sigp = NULL;
-	if (lenp != NULL)
-		*lenp = 0;
-	if ((r = sshkey_sign(key, &sig, &siglen,
-	    data, datalen, alg, datafellows)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return -1;
-	}
-	if (siglen > INT_MAX)
-		fatal("%s: giant len %zu", __func__, siglen);
-	if (sigp != NULL)
-		*sigp = sig;
-	if (lenp != NULL)
-		*lenp = siglen;
-	return 0;
-}
-
-int
-key_verify(const Key *key, const u_char *signature, u_int signaturelen,
-    const u_char *data, u_int datalen)
-{
-	int r;
-
-	if ((r = sshkey_verify(key, signature, signaturelen,
-	    data, datalen, datafellows)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return r == SSH_ERR_SIGNATURE_INVALID ? 0 : -1;
-	}
-	return 1;
-}
-
-Key *
-key_demote(const Key *k)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_demote(k, &ret)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-	return ret;
-}
-
-int
-key_to_certified(Key *k)
-{
-	int r;
-
-	if ((r = sshkey_to_certified(k)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return -1;
-	}
-	return 0;
-}
-
-int
-key_drop_cert(Key *k)
-{
-	int r;
-
-	if ((r = sshkey_drop_cert(k)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return -1;
-	}
-	return 0;
-}
-
-int
-key_certify(Key *k, Key *ca)
-{
-	int r;
-
-	if ((r = sshkey_certify(k, ca, NULL)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return -1;
-	}
-	return 0;
-}
-
-int
-key_cert_check_authority(const Key *k, int want_host, int require_principal,
-    const char *name, const char **reason)
-{
-	int r;
-
-	if ((r = sshkey_cert_check_authority(k, want_host, require_principal,
-	    name, reason)) != 0) {
-		fatal_on_fatal_errors(r, __func__, 0);
-		error("%s: %s", __func__, ssh_err(r));
-		return -1;
-	}
-	return 0;
-}
-
-#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
-int
-key_ec_validate_public(const EC_GROUP *group, const EC_POINT *public)
-{
-	int r;
-
-	if ((r = sshkey_ec_validate_public(group, public)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		error("%s: %s", __func__, ssh_err(r));
-		return -1;
-	}
-	return 0;
-}
-
-int
-key_ec_validate_private(const EC_KEY *key)
-{
-	int r;
-
-	if ((r = sshkey_ec_validate_private(key)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		error("%s: %s", __func__, ssh_err(r));
-		return -1;
-	}
-	return 0;
-}
-#endif /* WITH_OPENSSL */
-
-void
-key_private_serialize(const Key *key, struct sshbuf *b)
-{
-	int r;
-
-	if ((r = sshkey_private_serialize(key, b)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-}
-
-Key *
-key_private_deserialize(struct sshbuf *blob)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_private_deserialize(blob, &ret)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		error("%s: %s", __func__, ssh_err(r));
-		return NULL;
-	}
-	return ret;
-}
-
-/* authfile.c */
-
-int
-key_save_private(Key *key, const char *filename, const char *passphrase,
-    const char *comment, int force_new_format, const char *new_format_cipher,
-    int new_format_rounds)
-{
-	int r;
-
-	if ((r = sshkey_save_private(key, filename, passphrase, comment,
-	    force_new_format, new_format_cipher, new_format_rounds)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		error("%s: %s", __func__, ssh_err(r));
-		return 0;
-	}
-	return 1;
-}
-
-int
-key_load_file(int fd, const char *filename, struct sshbuf *blob)
-{
-	int r;
-
-	if ((r = sshkey_load_file(fd, blob)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		error("%s: %s", __func__, ssh_err(r));
-		return 0;
-	}
-	return 1;
-}
-
-Key *
-key_load_cert(const char *filename)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_load_cert(filename, &ret)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		/* Old authfile.c ignored all file errors. */
-		if (r == SSH_ERR_SYSTEM_ERROR)
-			debug("%s: %s", __func__, ssh_err(r));
-		else
-			error("%s: %s", __func__, ssh_err(r));
-		return NULL;
-	}
-	return ret;
-
-}
-
-Key *
-key_load_public(const char *filename, char **commentp)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_load_public(filename, &ret, commentp)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		/* Old authfile.c ignored all file errors. */
-		if (r == SSH_ERR_SYSTEM_ERROR)
-			debug("%s: %s", __func__, ssh_err(r));
-		else
-			error("%s: %s", __func__, ssh_err(r));
-		return NULL;
-	}
-	return ret;
-}
-
-Key *
-key_load_private(const char *path, const char *passphrase,
-    char **commentp)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_load_private(path, passphrase, &ret, commentp)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		/* Old authfile.c ignored all file errors. */
-		if (r == SSH_ERR_SYSTEM_ERROR ||
-		    r == SSH_ERR_KEY_WRONG_PASSPHRASE)
-			debug("%s: %s", __func__, ssh_err(r));
-		else
-			error("%s: %s", __func__, ssh_err(r));
-		return NULL;
-	}
-	return ret;
-}
-
-Key *
-key_load_private_cert(int type, const char *filename, const char *passphrase,
-    int *perm_ok)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_load_private_cert(type, filename, passphrase,
-	    &ret, perm_ok)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		/* Old authfile.c ignored all file errors. */
-		if (r == SSH_ERR_SYSTEM_ERROR ||
-		    r == SSH_ERR_KEY_WRONG_PASSPHRASE)
-			debug("%s: %s", __func__, ssh_err(r));
-		else
-			error("%s: %s", __func__, ssh_err(r));
-		return NULL;
-	}
-	return ret;
-}
-
-Key *
-key_load_private_type(int type, const char *filename, const char *passphrase,
-    char **commentp, int *perm_ok)
-{
-	int r;
-	Key *ret = NULL;
-
-	if ((r = sshkey_load_private_type(type, filename, passphrase,
-	    &ret, commentp, perm_ok)) != 0) {
-		fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
-		/* Old authfile.c ignored all file errors. */
-		if (r == SSH_ERR_SYSTEM_ERROR ||
-		    (r == SSH_ERR_KEY_WRONG_PASSPHRASE))
-			debug("%s: %s", __func__, ssh_err(r));
-		else
-			error("%s: %s", __func__, ssh_err(r));
-		return NULL;
-	}
-	return ret;
-}
-
-int
-key_perm_ok(int fd, const char *filename)
-{
-	return sshkey_perm_ok(fd, filename) == 0 ? 1 : 0;
-}
-
diff --git a/key.h b/key.h
deleted file mode 100644
index 2e501a9..0000000
--- a/key.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* $OpenBSD: key.h,v 1.50 2016/09/12 23:31:27 djm Exp $ */
-
-/*
- * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef KEY_H
-#define KEY_H
-
-#include "sshkey.h"
-
-typedef struct sshkey Key;
-
-#define types sshkey_types
-#define fp_type sshkey_fp_type
-#define fp_rep sshkey_fp_rep
-
-#ifndef SSH_KEY_NO_DEFINE
-#define key_new			sshkey_new
-#define key_free		sshkey_free
-#define key_equal_public	sshkey_equal_public
-#define key_equal		sshkey_equal
-#define key_type		sshkey_type
-#define key_cert_type		sshkey_cert_type
-#define key_ssh_name		sshkey_ssh_name
-#define key_ssh_name_plain	sshkey_ssh_name_plain
-#define key_type_from_name	sshkey_type_from_name
-#define key_ecdsa_nid_from_name	sshkey_ecdsa_nid_from_name
-#define key_type_is_cert	sshkey_type_is_cert
-#define key_size		sshkey_size
-#define key_ecdsa_bits_to_nid	sshkey_ecdsa_bits_to_nid
-#define key_ecdsa_key_to_nid	sshkey_ecdsa_key_to_nid
-#define key_is_cert		sshkey_is_cert
-#define key_type_plain		sshkey_type_plain
-#define key_curve_name_to_nid	sshkey_curve_name_to_nid
-#define key_curve_nid_to_bits	sshkey_curve_nid_to_bits
-#define key_curve_nid_to_name	sshkey_curve_nid_to_name
-#define key_ec_nid_to_hash_alg	sshkey_ec_nid_to_hash_alg
-#define key_dump_ec_point	sshkey_dump_ec_point
-#define key_dump_ec_key		sshkey_dump_ec_key
-#endif
-
-void	 key_add_private(Key *);
-Key	*key_new_private(int);
-void	 key_free(Key *);
-Key	*key_demote(const Key *);
-int	 key_write(const Key *, FILE *);
-int	 key_read(Key *, char **);
-
-Key	*key_generate(int, u_int);
-Key	*key_from_private(const Key *);
-int	 key_to_certified(Key *);
-int	 key_drop_cert(Key *);
-int	 key_certify(Key *, Key *);
-void	 key_cert_copy(const Key *, Key *);
-int	 key_cert_check_authority(const Key *, int, int, const char *,
-	    const char **);
-
-#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
-int	 key_ec_validate_public(const EC_GROUP *, const EC_POINT *);
-int	 key_ec_validate_private(const EC_KEY *);
-#endif /* defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) */
-
-Key	*key_from_blob(const u_char *, u_int);
-int	 key_to_blob(const Key *, u_char **, u_int *);
-
-int	 key_sign(const Key *, u_char **, u_int *, const u_char *, u_int,
-    const char *);
-int	 key_verify(const Key *, const u_char *, u_int, const u_char *, u_int);
-
-void     key_private_serialize(const Key *, struct sshbuf *);
-Key	*key_private_deserialize(struct sshbuf *);
-
-/* authfile.c */
-int	 key_save_private(Key *, const char *, const char *, const char *,
-    int, const char *, int);
-int	 key_load_file(int, const char *, struct sshbuf *);
-Key	*key_load_cert(const char *);
-Key	*key_load_public(const char *, char **);
-Key	*key_load_private(const char *, const char *, char **);
-Key	*key_load_private_cert(int, const char *, const char *, int *);
-Key	*key_load_private_type(int, const char *, const char *, char **, int *);
-int	 key_perm_ok(int, const char *);
-
-#endif
diff --git a/krl.c b/krl.c
index e271a19..3791532 100644
--- a/krl.c
+++ b/krl.c
@@ -14,7 +14,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $OpenBSD: krl.c,v 1.38 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: krl.c,v 1.41 2017/12/18 02:25:15 djm Exp $ */
 
 #include "includes.h"
 
@@ -1014,7 +1014,7 @@
 		}
 		/* Check signature over entire KRL up to this point */
 		if ((r = sshkey_verify(key, blob, blen,
-		    sshbuf_ptr(buf), sig_off, 0)) != 0)
+		    sshbuf_ptr(buf), sig_off, NULL, 0)) != 0)
 			goto out;
 		/* Check if this key has already signed this KRL */
 		for (i = 0; i < nca_used; i++) {
@@ -1026,7 +1026,7 @@
 			}
 		}
 		/* Record keys used to sign the KRL */
-		tmp_ca_used = reallocarray(ca_used, nca_used + 1,
+		tmp_ca_used = recallocarray(ca_used, nca_used, nca_used + 1,
 		    sizeof(*ca_used));
 		if (tmp_ca_used == NULL) {
 			r = SSH_ERR_ALLOC_FAIL;
@@ -1089,7 +1089,7 @@
 			break;
 		case KRL_SECTION_SIGNATURE:
 			/* Handled above, but still need to stay in synch */
-			sshbuf_reset(sect);
+			sshbuf_free(sect);
 			sect = NULL;
 			if ((r = sshbuf_skip_string(copy)) != 0)
 				goto out;
@@ -1288,7 +1288,8 @@
 	debug2("%s: checking KRL %s", __func__, path);
 	r = ssh_krl_check_key(krl, key);
  out:
-	close(fd);
+	if (fd != -1)
+		close(fd);
 	sshbuf_free(krlbuf);
 	ssh_krl_free(krl);
 	if (r != 0)
diff --git a/log.c b/log.c
index 2b59c42..d9c2d13 100644
--- a/log.c
+++ b/log.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: log.c,v 1.48 2016/07/15 05:01:58 dtucker Exp $ */
+/* $OpenBSD: log.c,v 1.51 2018/07/27 12:03:17 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -105,6 +105,12 @@
 	{ NULL,		SYSLOG_LEVEL_NOT_SET }
 };
 
+LogLevel
+log_level_get(void)
+{
+	return log_level;
+}
+
 SyslogFacility
 log_facility_number(char *name)
 {
@@ -256,18 +262,7 @@
 
 	argv0 = av0;
 
-	switch (level) {
-	case SYSLOG_LEVEL_QUIET:
-	case SYSLOG_LEVEL_FATAL:
-	case SYSLOG_LEVEL_ERROR:
-	case SYSLOG_LEVEL_INFO:
-	case SYSLOG_LEVEL_VERBOSE:
-	case SYSLOG_LEVEL_DEBUG1:
-	case SYSLOG_LEVEL_DEBUG2:
-	case SYSLOG_LEVEL_DEBUG3:
-		log_level = level;
-		break;
-	default:
+	if (log_change_level(level) != 0) {
 		fprintf(stderr, "Unrecognized internal syslog level code %d\n",
 		    (int) level);
 		exit(1);
@@ -340,13 +335,27 @@
 #endif
 }
 
-void
+int
 log_change_level(LogLevel new_log_level)
 {
 	/* no-op if log_init has not been called */
 	if (argv0 == NULL)
-		return;
-	log_init(argv0, new_log_level, log_facility, log_on_stderr);
+		return 0;
+
+	switch (new_log_level) {
+	case SYSLOG_LEVEL_QUIET:
+	case SYSLOG_LEVEL_FATAL:
+	case SYSLOG_LEVEL_ERROR:
+	case SYSLOG_LEVEL_INFO:
+	case SYSLOG_LEVEL_VERBOSE:
+	case SYSLOG_LEVEL_DEBUG1:
+	case SYSLOG_LEVEL_DEBUG2:
+	case SYSLOG_LEVEL_DEBUG3:
+		log_level = new_log_level;
+		return 0;
+	default:
+		return -1;
+	}
 }
 
 int
@@ -453,7 +462,8 @@
 		tmp_handler(level, fmtbuf, log_handler_ctx);
 		log_handler = tmp_handler;
 	} else if (log_on_stderr) {
-		snprintf(msgbuf, sizeof msgbuf, "%s\r\n", fmtbuf);
+		snprintf(msgbuf, sizeof msgbuf, "%.*s\r\n",
+		    (int)sizeof msgbuf - 3, fmtbuf);
 		(void)write(log_stderr_fd, msgbuf, strlen(msgbuf));
 	} else {
 #if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT)
diff --git a/log.h b/log.h
index 434b7c8..ef7bea7 100644
--- a/log.h
+++ b/log.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: log.h,v 1.21 2016/07/15 05:01:58 dtucker Exp $ */
+/* $OpenBSD: log.h,v 1.23 2018/07/27 12:03:17 markus Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -49,7 +49,8 @@
 typedef void (log_handler_fn)(LogLevel, const char *, void *);
 
 void     log_init(char *, LogLevel, SyslogFacility, int);
-void     log_change_level(LogLevel);
+LogLevel log_level_get(void);
+int      log_change_level(LogLevel);
 int      log_is_on_stderr(void);
 void     log_redirect_stderr_to(const char *);
 
diff --git a/loginrec.c b/loginrec.c
index 788553e..9a427de 100644
--- a/loginrec.c
+++ b/loginrec.c
@@ -168,7 +168,7 @@
 #include <unistd.h>
 
 #include "xmalloc.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "ssh.h"
 #include "loginrec.h"
@@ -177,7 +177,8 @@
 #include "packet.h"
 #include "canohost.h"
 #include "auth.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 
 #ifdef HAVE_UTIL_H
 # include <util.h>
@@ -210,7 +211,7 @@
 int wtmp_get_entry(struct logininfo *li);
 int wtmpx_get_entry(struct logininfo *li);
 
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
 
 /* pick the shortest string */
 #define MIN_SIZEOF(s1,s2) (sizeof(s1) < sizeof(s2) ? sizeof(s1) : sizeof(s2))
@@ -663,15 +664,9 @@
 	switch (li->type) {
 	case LTYPE_LOGIN:
 		ut->ut_type = USER_PROCESS;
-#ifdef _UNICOS
-		cray_set_tmpdir(ut);
-#endif
 		break;
 	case LTYPE_LOGOUT:
 		ut->ut_type = DEAD_PROCESS;
-#ifdef _UNICOS
-		cray_retain_utmp(ut, li->pid);
-#endif
 		break;
 	}
 # endif
diff --git a/mac.c b/mac.c
index 5ba7fae..51dc11d 100644
--- a/mac.c
+++ b/mac.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mac.c,v 1.33 2016/07/08 03:44:42 djm Exp $ */
+/* $OpenBSD: mac.c,v 1.34 2017/05/08 22:57:38 djm Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  *
@@ -64,10 +64,6 @@
 #endif
 	{ "hmac-md5",				SSH_DIGEST, SSH_DIGEST_MD5, 0, 0, 0, 0 },
 	{ "hmac-md5-96",			SSH_DIGEST, SSH_DIGEST_MD5, 96, 0, 0, 0 },
-#ifdef HAVE_EVP_RIPEMD160
-	{ "hmac-ripemd160",			SSH_DIGEST, SSH_DIGEST_RIPEMD160, 0, 0, 0, 0 },
-	{ "hmac-ripemd160@openssh.com",		SSH_DIGEST, SSH_DIGEST_RIPEMD160, 0, 0, 0, 0 },
-#endif
 	{ "umac-64@openssh.com",		SSH_UMAC, 0, 0, 128, 64, 0 },
 	{ "umac-128@openssh.com",		SSH_UMAC128, 0, 0, 128, 128, 0 },
 
@@ -80,9 +76,6 @@
 #endif
 	{ "hmac-md5-etm@openssh.com",		SSH_DIGEST, SSH_DIGEST_MD5, 0, 0, 0, 1 },
 	{ "hmac-md5-96-etm@openssh.com",	SSH_DIGEST, SSH_DIGEST_MD5, 96, 0, 0, 1 },
-#ifdef HAVE_EVP_RIPEMD160
-	{ "hmac-ripemd160-etm@openssh.com",	SSH_DIGEST, SSH_DIGEST_RIPEMD160, 0, 0, 0, 1 },
-#endif
 	{ "umac-64-etm@openssh.com",		SSH_UMAC, 0, 0, 128, 64, 1 },
 	{ "umac-128-etm@openssh.com",		SSH_UMAC128, 0, 0, 128, 128, 1 },
 
diff --git a/match.c b/match.c
index ca93cb0..bb3e95f 100644
--- a/match.c
+++ b/match.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: match.c,v 1.35 2017/02/15 23:38:31 jsg Exp $ */
+/* $OpenBSD: match.c,v 1.38 2018/07/04 13:49:31 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -42,9 +42,11 @@
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 
 #include "xmalloc.h"
 #include "match.h"
+#include "misc.h"
 
 /*
  * Returns true if the given string matches the pattern (which may contain ?
@@ -145,7 +147,7 @@
 		if (subi >= sizeof(sub) - 1)
 			return 0;
 
-		/* If the subpattern was terminated by a comma, skip the comma. */
+		/* If the subpattern was terminated by a comma, then skip it. */
 		if (i < len && pattern[i] == ',')
 			i++;
 
@@ -177,7 +179,13 @@
 int
 match_hostname(const char *host, const char *pattern)
 {
-	return match_pattern_list(host, pattern, 1);
+	char *hostcopy = xstrdup(host);
+	int r;
+
+	lowercase(hostcopy);
+	r = match_pattern_list(hostcopy, pattern, 1);
+	free(hostcopy);
+	return r;
 }
 
 /*
@@ -286,16 +294,20 @@
 }
 
 /*
- * Filters a comma-separated list of strings, excluding any entry matching
- * the 'filter' pattern list. Caller must free returned string.
+ * Filter proposal using pattern-list filter.
+ * "blacklist" determines sense of filter:
+ * non-zero indicates that items matching filter should be excluded.
+ * zero indicates that only items matching filter should be included.
+ * returns NULL on allocation error, otherwise caller must free result.
  */
-char *
-match_filter_list(const char *proposal, const char *filter)
+static char *
+filter_list(const char *proposal, const char *filter, int blacklist)
 {
 	size_t len = strlen(proposal) + 1;
 	char *fix_prop = malloc(len);
 	char *orig_prop = strdup(proposal);
 	char *cp, *tmp;
+	int r;
 
 	if (fix_prop == NULL || orig_prop == NULL) {
 		free(orig_prop);
@@ -306,7 +318,8 @@
 	tmp = orig_prop;
 	*fix_prop = '\0';
 	while ((cp = strsep(&tmp, ",")) != NULL) {
-		if (match_pattern_list(cp, filter, 0) != 1) {
+		r = match_pattern_list(cp, filter, 0);
+		if ((blacklist && r != 1) || (!blacklist && r == 1)) {
 			if (*fix_prop != '\0')
 				strlcat(fix_prop, ",", len);
 			strlcat(fix_prop, cp, len);
@@ -316,3 +329,22 @@
 	return fix_prop;
 }
 
+/*
+ * Filters a comma-separated list of strings, excluding any entry matching
+ * the 'filter' pattern list. Caller must free returned string.
+ */
+char *
+match_filter_blacklist(const char *proposal, const char *filter)
+{
+	return filter_list(proposal, filter, 1);
+}
+
+/*
+ * Filters a comma-separated list of strings, including only entries matching
+ * the 'filter' pattern list. Caller must free returned string.
+ */
+char *
+match_filter_whitelist(const char *proposal, const char *filter)
+{
+	return filter_list(proposal, filter, 0);
+}
diff --git a/match.h b/match.h
index 937ba04..852b1a5 100644
--- a/match.h
+++ b/match.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: match.h,v 1.17 2017/02/03 23:01:19 djm Exp $ */
+/* $OpenBSD: match.h,v 1.18 2018/07/04 13:49:31 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -20,7 +20,8 @@
 int	 match_host_and_ip(const char *, const char *, const char *);
 int	 match_user(const char *, const char *, const char *, const char *);
 char	*match_list(const char *, const char *, u_int *);
-char	*match_filter_list(const char *, const char *);
+char	*match_filter_blacklist(const char *, const char *);
+char	*match_filter_whitelist(const char *, const char *);
 
 /* addrmatch.c */
 int	 addr_match_list(const char *, const char *);
diff --git a/md-sha256.c b/md-sha256.c
deleted file mode 100644
index 8c1b3b9..0000000
--- a/md-sha256.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* $OpenBSD: md-sha256.c,v 1.5 2006/08/03 03:34:42 deraadt Exp $ */
-/*
- * Copyright (c) 2005 Damien Miller <djm@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* EVP wrapper for SHA256 */
-
-#include "includes.h"
-
-#include <sys/types.h>
-#include <openssl/opensslv.h>
-
-#if !defined(HAVE_EVP_SHA256) && (OPENSSL_VERSION_NUMBER >= 0x00907000L)
-
-#include <string.h>
-#include <openssl/evp.h>
-#ifdef HAVE_SHA256_UPDATE
-# ifdef HAVE_SHA2_H
-#  include <sha2.h>
-# elif defined(HAVE_CRYPTO_SHA2_H)
-#  include <crypto/sha2.h>
-# endif
-#endif
-
-const EVP_MD *evp_ssh_sha256(void);
-
-static int
-ssh_sha256_init(EVP_MD_CTX *ctxt)
-{
-	SHA256_Init(ctxt->md_data);
-	return (1);
-}
-
-static int
-ssh_sha256_update(EVP_MD_CTX *ctxt, const void *data, unsigned long len)
-{
-	SHA256_Update(ctxt->md_data, data, len);
-	return (1);
-}
-
-static int
-ssh_sha256_final(EVP_MD_CTX *ctxt, unsigned char *digest)
-{
-	SHA256_Final(digest, ctxt->md_data);
-	return (1);
-}
-
-static int
-ssh_sha256_cleanup(EVP_MD_CTX *ctxt)
-{
-	memset(ctxt->md_data, 0, sizeof(SHA256_CTX));
-	return (1);
-}
-
-const EVP_MD *
-evp_ssh_sha256(void)
-{
-	static EVP_MD ssh_sha256;
-
-	memset(&ssh_sha256, 0, sizeof(ssh_sha256));
-	ssh_sha256.type = NID_undef;
-	ssh_sha256.md_size = SHA256_DIGEST_LENGTH;
-	ssh_sha256.init = ssh_sha256_init;
-	ssh_sha256.update = ssh_sha256_update;
-	ssh_sha256.final = ssh_sha256_final;
-	ssh_sha256.cleanup = ssh_sha256_cleanup;
-	ssh_sha256.block_size = SHA256_BLOCK_LENGTH;
-	ssh_sha256.ctx_size = sizeof(SHA256_CTX);
-
-	return (&ssh_sha256);
-}
-
-#endif /* !defined(HAVE_EVP_SHA256) && (OPENSSL_VERSION_NUMBER >= 0x00907000L) */
-
diff --git a/md5crypt.c b/md5crypt.c
index 22ef989..52cf295 100644
--- a/md5crypt.c
+++ b/md5crypt.c
@@ -50,7 +50,7 @@
 char *
 md5_crypt(const char *pw, const char *salt)
 {
-	static char passwd[120], salt_copy[9], *p;
+	static char passwd[120], salt_copy[9];
 	static const char *sp, *ep;
 	unsigned char final[16];
 	int sl, pl, i, j;
@@ -139,8 +139,6 @@
 		MD5_Final(final, &ctx1);
 	}
 
-	p = passwd + strlen(passwd);
-
 	l = (final[ 0]<<16) | (final[ 6]<<8) | final[12];
 	strlcat(passwd, to64(l, 4), sizeof(passwd));
 	l = (final[ 1]<<16) | (final[ 7]<<8) | final[13];
diff --git a/mdoc2man.awk b/mdoc2man.awk
index 3e87254..d393ae6 100644
--- a/mdoc2man.awk
+++ b/mdoc2man.awk
@@ -1,7 +1,5 @@
 #!/usr/bin/awk
 #
-# $Id: mdoc2man.awk,v 1.9 2009/10/24 00:52:42 dtucker Exp $
-#
 # Version history:
 #  v4+ Adapted for OpenSSH Portable (see cvs Id and history)
 #  v3, I put the program under a proper license
diff --git a/misc.c b/misc.c
index 65c9222..ae4d29b 100644
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.107 2016/11/30 00:28:31 dtucker Exp $ */
+/* $OpenBSD: misc.c,v 1.131 2018/07/27 05:13:02 dtucker Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  * Copyright (c) 2005,2006 Damien Miller.  All rights reserved.
@@ -29,10 +29,16 @@
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #include <sys/time.h>
+#include <sys/wait.h>
 #include <sys/un.h>
 
 #include <limits.h>
+#ifdef HAVE_LIBGEN_H
+# include <libgen.h>
+#endif
+#include <signal.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -61,6 +67,9 @@
 #include "misc.h"
 #include "log.h"
 #include "ssh.h"
+#include "sshbuf.h"
+#include "ssherr.h"
+#include "platform.h"
 
 /* remove newline at end of string */
 char *
@@ -157,13 +166,80 @@
 		error("setsockopt TCP_NODELAY: %.100s", strerror(errno));
 }
 
+/* Allow local port reuse in TIME_WAIT */
+int
+set_reuseaddr(int fd)
+{
+	int on = 1;
+
+	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
+		error("setsockopt SO_REUSEADDR fd %d: %s", fd, strerror(errno));
+		return -1;
+	}
+	return 0;
+}
+
+/* Get/set routing domain */
+char *
+get_rdomain(int fd)
+{
+#if defined(HAVE_SYS_GET_RDOMAIN)
+	return sys_get_rdomain(fd);
+#elif defined(__OpenBSD__)
+	int rtable;
+	char *ret;
+	socklen_t len = sizeof(rtable);
+
+	if (getsockopt(fd, SOL_SOCKET, SO_RTABLE, &rtable, &len) == -1) {
+		error("Failed to get routing domain for fd %d: %s",
+		    fd, strerror(errno));
+		return NULL;
+	}
+	xasprintf(&ret, "%d", rtable);
+	return ret;
+#else /* defined(__OpenBSD__) */
+	return NULL;
+#endif
+}
+
+int
+set_rdomain(int fd, const char *name)
+{
+#if defined(HAVE_SYS_SET_RDOMAIN)
+	return sys_set_rdomain(fd, name);
+#elif defined(__OpenBSD__)
+	int rtable;
+	const char *errstr;
+
+	if (name == NULL)
+		return 0; /* default table */
+
+	rtable = (int)strtonum(name, 0, 255, &errstr);
+	if (errstr != NULL) {
+		/* Shouldn't happen */
+		error("Invalid routing domain \"%s\": %s", name, errstr);
+		return -1;
+	}
+	if (setsockopt(fd, SOL_SOCKET, SO_RTABLE,
+	    &rtable, sizeof(rtable)) == -1) {
+		error("Failed to set routing domain %d on fd %d: %s",
+		    rtable, fd, strerror(errno));
+		return -1;
+	}
+	return 0;
+#else /* defined(__OpenBSD__) */
+	error("Setting routing domain is not supported on this platform");
+	return -1;
+#endif
+}
+
 /* Characters considered whitespace in strsep calls. */
 #define WHITESPACE " \t\r\n"
 #define QUOTE	"\""
 
 /* return next token in configuration line */
-char *
-strdelim(char **s)
+static char *
+strdelim_internal(char **s, int split_equals)
 {
 	char *old;
 	int wspace = 0;
@@ -173,7 +249,8 @@
 
 	old = *s;
 
-	*s = strpbrk(*s, WHITESPACE QUOTE "=");
+	*s = strpbrk(*s,
+	    split_equals ? WHITESPACE QUOTE "=" : WHITESPACE QUOTE);
 	if (*s == NULL)
 		return (old);
 
@@ -190,18 +267,37 @@
 	}
 
 	/* Allow only one '=' to be skipped */
-	if (*s[0] == '=')
+	if (split_equals && *s[0] == '=')
 		wspace = 1;
 	*s[0] = '\0';
 
 	/* Skip any extra whitespace after first token */
 	*s += strspn(*s + 1, WHITESPACE) + 1;
-	if (*s[0] == '=' && !wspace)
+	if (split_equals && *s[0] == '=' && !wspace)
 		*s += strspn(*s + 1, WHITESPACE) + 1;
 
 	return (old);
 }
 
+/*
+ * Return next token in configuration line; splts on whitespace or a
+ * single '=' character.
+ */
+char *
+strdelim(char **s)
+{
+	return strdelim_internal(s, 1);
+}
+
+/*
+ * Return next token in configuration line; splts on whitespace only.
+ */
+char *
+strdelimw(char **s)
+{
+	return strdelim_internal(s, 0);
+}
+
 struct passwd *
 pwcopy(struct passwd *pw)
 {
@@ -306,7 +402,7 @@
 long
 convtime(const char *s)
 {
-	long total, secs;
+	long total, secs, multiplier = 1;
 	const char *p;
 	char *endp;
 
@@ -333,23 +429,28 @@
 			break;
 		case 'm':
 		case 'M':
-			secs *= MINUTES;
+			multiplier = MINUTES;
 			break;
 		case 'h':
 		case 'H':
-			secs *= HOURS;
+			multiplier = HOURS;
 			break;
 		case 'd':
 		case 'D':
-			secs *= DAYS;
+			multiplier = DAYS;
 			break;
 		case 'w':
 		case 'W':
-			secs *= WEEKS;
+			multiplier = WEEKS;
 			break;
 		default:
 			return -1;
 		}
+		if (secs >= LONG_MAX / multiplier)
+			return -1;
+		secs *= multiplier;
+		if  (total >= LONG_MAX - secs)
+			return -1;
 		total += secs;
 		if (total < 0)
 			return -1;
@@ -380,11 +481,12 @@
  * Search for next delimiter between hostnames/addresses and ports.
  * Argument may be modified (for termination).
  * Returns *cp if parsing succeeds.
- * *cp is set to the start of the next delimiter, if one was found.
+ * *cp is set to the start of the next field, if one was found.
+ * The delimiter char, if present, is stored in delim.
  * If this is the last field, *cp is set to NULL.
  */
-char *
-hpdelim(char **cp)
+static char *
+hpdelim2(char **cp, char *delim)
 {
 	char *s, *old;
 
@@ -407,6 +509,8 @@
 
 	case ':':
 	case '/':
+		if (delim != NULL)
+			*delim = *s;
 		*s = '\0';	/* terminate */
 		*cp = s + 1;
 		break;
@@ -419,6 +523,12 @@
 }
 
 char *
+hpdelim(char **cp)
+{
+	return hpdelim2(cp, NULL);
+}
+
+char *
 cleanhostname(char *host)
 {
 	if (*host == '[' && host[strlen(host) - 1] == ']') {
@@ -452,6 +562,75 @@
 }
 
 /*
+ * Parse a [user@]host:[path] string.
+ * Caller must free returned user, host and path.
+ * Any of the pointer return arguments may be NULL (useful for syntax checking).
+ * If user was not specified then *userp will be set to NULL.
+ * If host was not specified then *hostp will be set to NULL.
+ * If path was not specified then *pathp will be set to ".".
+ * Returns 0 on success, -1 on failure.
+ */
+int
+parse_user_host_path(const char *s, char **userp, char **hostp, char **pathp)
+{
+	char *user = NULL, *host = NULL, *path = NULL;
+	char *sdup, *tmp;
+	int ret = -1;
+
+	if (userp != NULL)
+		*userp = NULL;
+	if (hostp != NULL)
+		*hostp = NULL;
+	if (pathp != NULL)
+		*pathp = NULL;
+
+	sdup = xstrdup(s);
+
+	/* Check for remote syntax: [user@]host:[path] */
+	if ((tmp = colon(sdup)) == NULL)
+		goto out;
+
+	/* Extract optional path */
+	*tmp++ = '\0';
+	if (*tmp == '\0')
+		tmp = ".";
+	path = xstrdup(tmp);
+
+	/* Extract optional user and mandatory host */
+	tmp = strrchr(sdup, '@');
+	if (tmp != NULL) {
+		*tmp++ = '\0';
+		host = xstrdup(cleanhostname(tmp));
+		if (*sdup != '\0')
+			user = xstrdup(sdup);
+	} else {
+		host = xstrdup(cleanhostname(sdup));
+		user = NULL;
+	}
+
+	/* Success */
+	if (userp != NULL) {
+		*userp = user;
+		user = NULL;
+	}
+	if (hostp != NULL) {
+		*hostp = host;
+		host = NULL;
+	}
+	if (pathp != NULL) {
+		*pathp = path;
+		path = NULL;
+	}
+	ret = 0;
+out:
+	free(sdup);
+	free(user);
+	free(host);
+	free(path);
+	return ret;
+}
+
+/*
  * Parse a [user@]host[:port] string.
  * Caller must free returned user and host.
  * Any of the pointer return arguments may be NULL (useful for syntax checking).
@@ -476,7 +655,7 @@
 	if ((sdup = tmp = strdup(s)) == NULL)
 		return -1;
 	/* Extract optional username */
-	if ((cp = strchr(tmp, '@')) != NULL) {
+	if ((cp = strrchr(tmp, '@')) != NULL) {
 		*cp = '\0';
 		if (*tmp == '\0')
 			goto out;
@@ -512,6 +691,168 @@
 	return ret;
 }
 
+/*
+ * Converts a two-byte hex string to decimal.
+ * Returns the decimal value or -1 for invalid input.
+ */
+static int
+hexchar(const char *s)
+{
+	unsigned char result[2];
+	int i;
+
+	for (i = 0; i < 2; i++) {
+		if (s[i] >= '0' && s[i] <= '9')
+			result[i] = (unsigned char)(s[i] - '0');
+		else if (s[i] >= 'a' && s[i] <= 'f')
+			result[i] = (unsigned char)(s[i] - 'a') + 10;
+		else if (s[i] >= 'A' && s[i] <= 'F')
+			result[i] = (unsigned char)(s[i] - 'A') + 10;
+		else
+			return -1;
+	}
+	return (result[0] << 4) | result[1];
+}
+
+/*
+ * Decode an url-encoded string.
+ * Returns a newly allocated string on success or NULL on failure.
+ */
+static char *
+urldecode(const char *src)
+{
+	char *ret, *dst;
+	int ch;
+
+	ret = xmalloc(strlen(src) + 1);
+	for (dst = ret; *src != '\0'; src++) {
+		switch (*src) {
+		case '+':
+			*dst++ = ' ';
+			break;
+		case '%':
+			if (!isxdigit((unsigned char)src[1]) ||
+			    !isxdigit((unsigned char)src[2]) ||
+			    (ch = hexchar(src + 1)) == -1) {
+				free(ret);
+				return NULL;
+			}
+			*dst++ = ch;
+			src += 2;
+			break;
+		default:
+			*dst++ = *src;
+			break;
+		}
+	}
+	*dst = '\0';
+
+	return ret;
+}
+
+/*
+ * Parse an (scp|ssh|sftp)://[user@]host[:port][/path] URI.
+ * See https://tools.ietf.org/html/draft-ietf-secsh-scp-sftp-ssh-uri-04
+ * Either user or path may be url-encoded (but not host or port).
+ * Caller must free returned user, host and path.
+ * Any of the pointer return arguments may be NULL (useful for syntax checking)
+ * but the scheme must always be specified.
+ * If user was not specified then *userp will be set to NULL.
+ * If port was not specified then *portp will be -1.
+ * If path was not specified then *pathp will be set to NULL.
+ * Returns 0 on success, 1 if non-uri/wrong scheme, -1 on error/invalid uri.
+ */
+int
+parse_uri(const char *scheme, const char *uri, char **userp, char **hostp,
+    int *portp, char **pathp)
+{
+	char *uridup, *cp, *tmp, ch;
+	char *user = NULL, *host = NULL, *path = NULL;
+	int port = -1, ret = -1;
+	size_t len;
+
+	len = strlen(scheme);
+	if (strncmp(uri, scheme, len) != 0 || strncmp(uri + len, "://", 3) != 0)
+		return 1;
+	uri += len + 3;
+
+	if (userp != NULL)
+		*userp = NULL;
+	if (hostp != NULL)
+		*hostp = NULL;
+	if (portp != NULL)
+		*portp = -1;
+	if (pathp != NULL)
+		*pathp = NULL;
+
+	uridup = tmp = xstrdup(uri);
+
+	/* Extract optional ssh-info (username + connection params) */
+	if ((cp = strchr(tmp, '@')) != NULL) {
+		char *delim;
+
+		*cp = '\0';
+		/* Extract username and connection params */
+		if ((delim = strchr(tmp, ';')) != NULL) {
+			/* Just ignore connection params for now */
+			*delim = '\0';
+		}
+		if (*tmp == '\0') {
+			/* Empty username */
+			goto out;
+		}
+		if ((user = urldecode(tmp)) == NULL)
+			goto out;
+		tmp = cp + 1;
+	}
+
+	/* Extract mandatory hostname */
+	if ((cp = hpdelim2(&tmp, &ch)) == NULL || *cp == '\0')
+		goto out;
+	host = xstrdup(cleanhostname(cp));
+	if (!valid_domain(host, 0, NULL))
+		goto out;
+
+	if (tmp != NULL && *tmp != '\0') {
+		if (ch == ':') {
+			/* Convert and verify port. */
+			if ((cp = strchr(tmp, '/')) != NULL)
+				*cp = '\0';
+			if ((port = a2port(tmp)) <= 0)
+				goto out;
+			tmp = cp ? cp + 1 : NULL;
+		}
+		if (tmp != NULL && *tmp != '\0') {
+			/* Extract optional path */
+			if ((path = urldecode(tmp)) == NULL)
+				goto out;
+		}
+	}
+
+	/* Success */
+	if (userp != NULL) {
+		*userp = user;
+		user = NULL;
+	}
+	if (hostp != NULL) {
+		*hostp = host;
+		host = NULL;
+	}
+	if (portp != NULL)
+		*portp = port;
+	if (pathp != NULL) {
+		*pathp = path;
+		path = NULL;
+	}
+	ret = 0;
+ out:
+	free(uridup);
+	free(user);
+	free(host);
+	free(path);
+	return ret;
+}
+
 /* function to assist building execv() arguments */
 void
 addargs(arglist *args, char *fmt, ...)
@@ -534,7 +875,7 @@
 	} else if (args->num+2 >= nalloc)
 		nalloc *= 2;
 
-	args->list = xreallocarray(args->list, nalloc, sizeof(char *));
+	args->list = xrecallocarray(args->list, args->nalloc, nalloc, sizeof(char *));
 	args->nalloc = nalloc;
 	args->list[args->num++] = cp;
 	args->list[args->num] = NULL;
@@ -683,42 +1024,20 @@
 #undef EXPAND_MAX_KEYS
 }
 
-/*
- * Read an entire line from a public key file into a static buffer, discarding
- * lines that exceed the buffer size.  Returns 0 on success, -1 on failure.
- */
 int
-read_keyfile_line(FILE *f, const char *filename, char *buf, size_t bufsz,
-   u_long *lineno)
-{
-	while (fgets(buf, bufsz, f) != NULL) {
-		if (buf[0] == '\0')
-			continue;
-		(*lineno)++;
-		if (buf[strlen(buf) - 1] == '\n' || feof(f)) {
-			return 0;
-		} else {
-			debug("%s: %s line %lu exceeds size limit", __func__,
-			    filename, *lineno);
-			/* discard remainder of line */
-			while (fgetc(f) != '\n' && !feof(f))
-				;	/* nothing */
-		}
-	}
-	return -1;
-}
-
-int
-tun_open(int tun, int mode)
+tun_open(int tun, int mode, char **ifname)
 {
 #if defined(CUSTOM_SYS_TUN_OPEN)
-	return (sys_tun_open(tun, mode));
+	return (sys_tun_open(tun, mode, ifname));
 #elif defined(SSH_TUN_OPENBSD)
 	struct ifreq ifr;
 	char name[100];
 	int fd = -1, sock;
 	const char *tunbase = "tun";
 
+	if (ifname != NULL)
+		*ifname = NULL;
+
 	if (mode == SSH_TUNMODE_ETHERNET)
 		tunbase = "tap";
 
@@ -765,6 +1084,9 @@
 		}
 	}
 
+	if (ifname != NULL)
+		*ifname = xstrdup(ifr.ifr_name);
+
 	close(sock);
 	return fd;
 
@@ -931,8 +1253,8 @@
 {
 	struct timeval diff, finish;
 
-	gettimeofday(&finish, NULL);
-	timersub(&finish, start, &diff);	
+	monotime_tv(&finish);
+	timersub(&finish, start, &diff);
 	*ms -= (diff.tv_sec * 1000) + (diff.tv_usec / 1000);
 }
 
@@ -945,54 +1267,63 @@
 	tv->tv_usec = (ms % 1000) * 1000;
 }
 
-time_t
-monotime(void)
+void
+monotime_ts(struct timespec *ts)
 {
-#if defined(HAVE_CLOCK_GETTIME) && \
-    (defined(CLOCK_MONOTONIC) || defined(CLOCK_BOOTTIME))
-	struct timespec ts;
+	struct timeval tv;
+#if defined(HAVE_CLOCK_GETTIME) && (defined(CLOCK_BOOTTIME) || \
+    defined(CLOCK_MONOTONIC) || defined(CLOCK_REALTIME))
 	static int gettime_failed = 0;
 
 	if (!gettime_failed) {
-#if defined(CLOCK_BOOTTIME)
-		if (clock_gettime(CLOCK_BOOTTIME, &ts) == 0)
-			return (ts.tv_sec);
-#endif
-#if defined(CLOCK_MONOTONIC)
-		if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
-			return (ts.tv_sec);
-#endif
+# ifdef CLOCK_BOOTTIME
+		if (clock_gettime(CLOCK_BOOTTIME, ts) == 0)
+			return;
+# endif /* CLOCK_BOOTTIME */
+# ifdef CLOCK_MONOTONIC
+		if (clock_gettime(CLOCK_MONOTONIC, ts) == 0)
+			return;
+# endif /* CLOCK_MONOTONIC */
+# ifdef CLOCK_REALTIME
+		/* Not monotonic, but we're almost out of options here. */
+		if (clock_gettime(CLOCK_REALTIME, ts) == 0)
+			return;
+# endif /* CLOCK_REALTIME */
 		debug3("clock_gettime: %s", strerror(errno));
 		gettime_failed = 1;
 	}
-#endif /* HAVE_CLOCK_GETTIME && (CLOCK_MONOTONIC || CLOCK_BOOTTIME */
+#endif /* HAVE_CLOCK_GETTIME && (BOOTTIME || MONOTONIC || REALTIME) */
+	gettimeofday(&tv, NULL);
+	ts->tv_sec = tv.tv_sec;
+	ts->tv_nsec = (long)tv.tv_usec * 1000;
+}
 
-	return time(NULL);
+void
+monotime_tv(struct timeval *tv)
+{
+	struct timespec ts;
+
+	monotime_ts(&ts);
+	tv->tv_sec = ts.tv_sec;
+	tv->tv_usec = ts.tv_nsec / 1000;
+}
+
+time_t
+monotime(void)
+{
+	struct timespec ts;
+
+	monotime_ts(&ts);
+	return ts.tv_sec;
 }
 
 double
 monotime_double(void)
 {
-#if defined(HAVE_CLOCK_GETTIME) && \
-    (defined(CLOCK_MONOTONIC) || defined(CLOCK_BOOTTIME))
 	struct timespec ts;
-	static int gettime_failed = 0;
 
-	if (!gettime_failed) {
-#if defined(CLOCK_BOOTTIME)
-		if (clock_gettime(CLOCK_BOOTTIME, &ts) == 0)
-			return (ts.tv_sec + (double)ts.tv_nsec / 1000000000);
-#endif
-#if defined(CLOCK_MONOTONIC)
-		if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
-			return (ts.tv_sec + (double)ts.tv_nsec / 1000000000);
-#endif
-		debug3("clock_gettime: %s", strerror(errno));
-		gettime_failed = 1;
-	}
-#endif /* HAVE_CLOCK_GETTIME && (CLOCK_MONOTONIC || CLOCK_BOOTTIME */
-
-	return (double)time(NULL);
+	monotime_ts(&ts);
+	return ts.tv_sec + ((double)ts.tv_nsec / 1000000000);
 }
 
 void
@@ -1014,7 +1345,7 @@
 	struct timespec ts, rm;
 
 	if (!timerisset(&bw->bwstart)) {
-		gettimeofday(&bw->bwstart, NULL);
+		monotime_tv(&bw->bwstart);
 		return;
 	}
 
@@ -1022,7 +1353,7 @@
 	if (bw->lamt < bw->thresh)
 		return;
 
-	gettimeofday(&bw->bwend, NULL);
+	monotime_tv(&bw->bwend);
 	timersub(&bw->bwend, &bw->bwstart, &bw->bwend);
 	if (!timerisset(&bw->bwend))
 		return;
@@ -1056,7 +1387,7 @@
 	}
 
 	bw->lamt = 0;
-	gettimeofday(&bw->bwstart, NULL);
+	monotime_tv(&bw->bwstart);
 }
 
 /* Make a template filename for mk[sd]temp() */
@@ -1080,6 +1411,7 @@
 	const char *name;
 	int value;
 } ipqos[] = {
+	{ "none", INT_MAX },		/* can't use 0 here; that's CS0 */
 	{ "af11", IPTOS_DSCP_AF11 },
 	{ "af12", IPTOS_DSCP_AF12 },
 	{ "af13", IPTOS_DSCP_AF13 },
@@ -1156,9 +1488,10 @@
 
 	memset(&sunaddr, 0, sizeof(sunaddr));
 	sunaddr.sun_family = AF_UNIX;
-	if (strlcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)) >= sizeof(sunaddr.sun_path)) {
-		error("%s: \"%s\" too long for Unix domain socket", __func__,
-		    path);
+	if (strlcpy(sunaddr.sun_path, path,
+	    sizeof(sunaddr.sun_path)) >= sizeof(sunaddr.sun_path)) {
+		error("%s: path \"%s\" too long for Unix domain socket",
+		    __func__, path);
 		errno = ENAMETOOLONG;
 		return -1;
 	}
@@ -1166,7 +1499,7 @@
 	sock = socket(PF_UNIX, SOCK_STREAM, 0);
 	if (sock < 0) {
 		saved_errno = errno;
-		error("socket: %.100s", strerror(errno));
+		error("%s: socket: %.100s", __func__, strerror(errno));
 		errno = saved_errno;
 		return -1;
 	}
@@ -1176,18 +1509,18 @@
 	}
 	if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) < 0) {
 		saved_errno = errno;
-		error("bind: %.100s", strerror(errno));
+		error("%s: cannot bind to path %s: %s",
+		    __func__, path, strerror(errno));
 		close(sock);
-		error("%s: cannot bind to path: %s", __func__, path);
 		errno = saved_errno;
 		return -1;
 	}
 	if (listen(sock, backlog) < 0) {
 		saved_errno = errno;
-		error("listen: %.100s", strerror(errno));
+		error("%s: cannot listen on path %s: %s",
+		    __func__, path, strerror(errno));
 		close(sock);
 		unlink(path);
-		error("%s: cannot listen on path: %s", __func__, path);
 		errno = saved_errno;
 		return -1;
 	}
@@ -1243,15 +1576,6 @@
 	return 1;
 }
 
-/* returns 1 if bind to specified port by specified user is permitted */
-int
-bind_permitted(int port, uid_t uid)
-{
-	if (port < IPPORT_RESERVED && uid != 0)
-		return 0;
-	return 1;
-}
-
 /* returns 1 if process is already daemonized, 0 otherwise */
 int
 daemonized(void)
@@ -1269,3 +1593,424 @@
 	debug3("already daemonized");
 	return 1;
 }
+
+
+/*
+ * Splits 's' into an argument vector. Handles quoted string and basic
+ * escape characters (\\, \", \'). Caller must free the argument vector
+ * and its members.
+ */
+int
+argv_split(const char *s, int *argcp, char ***argvp)
+{
+	int r = SSH_ERR_INTERNAL_ERROR;
+	int argc = 0, quote, i, j;
+	char *arg, **argv = xcalloc(1, sizeof(*argv));
+
+	*argvp = NULL;
+	*argcp = 0;
+
+	for (i = 0; s[i] != '\0'; i++) {
+		/* Skip leading whitespace */
+		if (s[i] == ' ' || s[i] == '\t')
+			continue;
+
+		/* Start of a token */
+		quote = 0;
+		if (s[i] == '\\' &&
+		    (s[i + 1] == '\'' || s[i + 1] == '\"' || s[i + 1] == '\\'))
+			i++;
+		else if (s[i] == '\'' || s[i] == '"')
+			quote = s[i++];
+
+		argv = xreallocarray(argv, (argc + 2), sizeof(*argv));
+		arg = argv[argc++] = xcalloc(1, strlen(s + i) + 1);
+		argv[argc] = NULL;
+
+		/* Copy the token in, removing escapes */
+		for (j = 0; s[i] != '\0'; i++) {
+			if (s[i] == '\\') {
+				if (s[i + 1] == '\'' ||
+				    s[i + 1] == '\"' ||
+				    s[i + 1] == '\\') {
+					i++; /* Skip '\' */
+					arg[j++] = s[i];
+				} else {
+					/* Unrecognised escape */
+					arg[j++] = s[i];
+				}
+			} else if (quote == 0 && (s[i] == ' ' || s[i] == '\t'))
+				break; /* done */
+			else if (quote != 0 && s[i] == quote)
+				break; /* done */
+			else
+				arg[j++] = s[i];
+		}
+		if (s[i] == '\0') {
+			if (quote != 0) {
+				/* Ran out of string looking for close quote */
+				r = SSH_ERR_INVALID_FORMAT;
+				goto out;
+			}
+			break;
+		}
+	}
+	/* Success */
+	*argcp = argc;
+	*argvp = argv;
+	argc = 0;
+	argv = NULL;
+	r = 0;
+ out:
+	if (argc != 0 && argv != NULL) {
+		for (i = 0; i < argc; i++)
+			free(argv[i]);
+		free(argv);
+	}
+	return r;
+}
+
+/*
+ * Reassemble an argument vector into a string, quoting and escaping as
+ * necessary. Caller must free returned string.
+ */
+char *
+argv_assemble(int argc, char **argv)
+{
+	int i, j, ws, r;
+	char c, *ret;
+	struct sshbuf *buf, *arg;
+
+	if ((buf = sshbuf_new()) == NULL || (arg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+
+	for (i = 0; i < argc; i++) {
+		ws = 0;
+		sshbuf_reset(arg);
+		for (j = 0; argv[i][j] != '\0'; j++) {
+			r = 0;
+			c = argv[i][j];
+			switch (c) {
+			case ' ':
+			case '\t':
+				ws = 1;
+				r = sshbuf_put_u8(arg, c);
+				break;
+			case '\\':
+			case '\'':
+			case '"':
+				if ((r = sshbuf_put_u8(arg, '\\')) != 0)
+					break;
+				/* FALLTHROUGH */
+			default:
+				r = sshbuf_put_u8(arg, c);
+				break;
+			}
+			if (r != 0)
+				fatal("%s: sshbuf_put_u8: %s",
+				    __func__, ssh_err(r));
+		}
+		if ((i != 0 && (r = sshbuf_put_u8(buf, ' ')) != 0) ||
+		    (ws != 0 && (r = sshbuf_put_u8(buf, '"')) != 0) ||
+		    (r = sshbuf_putb(buf, arg)) != 0 ||
+		    (ws != 0 && (r = sshbuf_put_u8(buf, '"')) != 0))
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
+	if ((ret = malloc(sshbuf_len(buf) + 1)) == NULL)
+		fatal("%s: malloc failed", __func__);
+	memcpy(ret, sshbuf_ptr(buf), sshbuf_len(buf));
+	ret[sshbuf_len(buf)] = '\0';
+	sshbuf_free(buf);
+	sshbuf_free(arg);
+	return ret;
+}
+
+/* Returns 0 if pid exited cleanly, non-zero otherwise */
+int
+exited_cleanly(pid_t pid, const char *tag, const char *cmd, int quiet)
+{
+	int status;
+
+	while (waitpid(pid, &status, 0) == -1) {
+		if (errno != EINTR) {
+			error("%s: waitpid: %s", tag, strerror(errno));
+			return -1;
+		}
+	}
+	if (WIFSIGNALED(status)) {
+		error("%s %s exited on signal %d", tag, cmd, WTERMSIG(status));
+		return -1;
+	} else if (WEXITSTATUS(status) != 0) {
+		do_log2(quiet ? SYSLOG_LEVEL_DEBUG1 : SYSLOG_LEVEL_INFO,
+		    "%s %s failed, status %d", tag, cmd, WEXITSTATUS(status));
+		return -1;
+	}
+	return 0;
+}
+
+/*
+ * Check a given path for security. This is defined as all components
+ * of the path to the file must be owned by either the owner of
+ * of the file or root and no directories must be group or world writable.
+ *
+ * XXX Should any specific check be done for sym links ?
+ *
+ * Takes a file name, its stat information (preferably from fstat() to
+ * avoid races), the uid of the expected owner, their home directory and an
+ * error buffer plus max size as arguments.
+ *
+ * Returns 0 on success and -1 on failure
+ */
+int
+safe_path(const char *name, struct stat *stp, const char *pw_dir,
+    uid_t uid, char *err, size_t errlen)
+{
+	char buf[PATH_MAX], homedir[PATH_MAX];
+	char *cp;
+	int comparehome = 0;
+	struct stat st;
+
+	if (realpath(name, buf) == NULL) {
+		snprintf(err, errlen, "realpath %s failed: %s", name,
+		    strerror(errno));
+		return -1;
+	}
+	if (pw_dir != NULL && realpath(pw_dir, homedir) != NULL)
+		comparehome = 1;
+
+	if (!S_ISREG(stp->st_mode)) {
+		snprintf(err, errlen, "%s is not a regular file", buf);
+		return -1;
+	}
+	if ((!platform_sys_dir_uid(stp->st_uid) && stp->st_uid != uid) ||
+	    (stp->st_mode & 022) != 0) {
+		snprintf(err, errlen, "bad ownership or modes for file %s",
+		    buf);
+		return -1;
+	}
+
+	/* for each component of the canonical path, walking upwards */
+	for (;;) {
+		if ((cp = dirname(buf)) == NULL) {
+			snprintf(err, errlen, "dirname() failed");
+			return -1;
+		}
+		strlcpy(buf, cp, sizeof(buf));
+
+		if (stat(buf, &st) < 0 ||
+		    (!platform_sys_dir_uid(st.st_uid) && st.st_uid != uid) ||
+		    (st.st_mode & 022) != 0) {
+			snprintf(err, errlen,
+			    "bad ownership or modes for directory %s", buf);
+			return -1;
+		}
+
+		/* If are past the homedir then we can stop */
+		if (comparehome && strcmp(homedir, buf) == 0)
+			break;
+
+		/*
+		 * dirname should always complete with a "/" path,
+		 * but we can be paranoid and check for "." too
+		 */
+		if ((strcmp("/", buf) == 0) || (strcmp(".", buf) == 0))
+			break;
+	}
+	return 0;
+}
+
+/*
+ * Version of safe_path() that accepts an open file descriptor to
+ * avoid races.
+ *
+ * Returns 0 on success and -1 on failure
+ */
+int
+safe_path_fd(int fd, const char *file, struct passwd *pw,
+    char *err, size_t errlen)
+{
+	struct stat st;
+
+	/* check the open file to avoid races */
+	if (fstat(fd, &st) < 0) {
+		snprintf(err, errlen, "cannot stat file %s: %s",
+		    file, strerror(errno));
+		return -1;
+	}
+	return safe_path(file, &st, pw->pw_dir, pw->pw_uid, err, errlen);
+}
+
+/*
+ * Sets the value of the given variable in the environment.  If the variable
+ * already exists, its value is overridden.
+ */
+void
+child_set_env(char ***envp, u_int *envsizep, const char *name,
+	const char *value)
+{
+	char **env;
+	u_int envsize;
+	u_int i, namelen;
+
+	if (strchr(name, '=') != NULL) {
+		error("Invalid environment variable \"%.100s\"", name);
+		return;
+	}
+
+	/*
+	 * If we're passed an uninitialized list, allocate a single null
+	 * entry before continuing.
+	 */
+	if (*envp == NULL && *envsizep == 0) {
+		*envp = xmalloc(sizeof(char *));
+		*envp[0] = NULL;
+		*envsizep = 1;
+	}
+
+	/*
+	 * Find the slot where the value should be stored.  If the variable
+	 * already exists, we reuse the slot; otherwise we append a new slot
+	 * at the end of the array, expanding if necessary.
+	 */
+	env = *envp;
+	namelen = strlen(name);
+	for (i = 0; env[i]; i++)
+		if (strncmp(env[i], name, namelen) == 0 && env[i][namelen] == '=')
+			break;
+	if (env[i]) {
+		/* Reuse the slot. */
+		free(env[i]);
+	} else {
+		/* New variable.  Expand if necessary. */
+		envsize = *envsizep;
+		if (i >= envsize - 1) {
+			if (envsize >= 1000)
+				fatal("child_set_env: too many env vars");
+			envsize += 50;
+			env = (*envp) = xreallocarray(env, envsize, sizeof(char *));
+			*envsizep = envsize;
+		}
+		/* Need to set the NULL pointer at end of array beyond the new slot. */
+		env[i + 1] = NULL;
+	}
+
+	/* Allocate space and format the variable in the appropriate slot. */
+	/* XXX xasprintf */
+	env[i] = xmalloc(strlen(name) + 1 + strlen(value) + 1);
+	snprintf(env[i], strlen(name) + 1 + strlen(value) + 1, "%s=%s", name, value);
+}
+
+/*
+ * Check and optionally lowercase a domain name, also removes trailing '.'
+ * Returns 1 on success and 0 on failure, storing an error message in errstr.
+ */
+int
+valid_domain(char *name, int makelower, const char **errstr)
+{
+	size_t i, l = strlen(name);
+	u_char c, last = '\0';
+	static char errbuf[256];
+
+	if (l == 0) {
+		strlcpy(errbuf, "empty domain name", sizeof(errbuf));
+		goto bad;
+	}
+	if (!isalpha((u_char)name[0]) && !isdigit((u_char)name[0])) {
+		snprintf(errbuf, sizeof(errbuf), "domain name \"%.100s\" "
+		    "starts with invalid character", name);
+		goto bad;
+	}
+	for (i = 0; i < l; i++) {
+		c = tolower((u_char)name[i]);
+		if (makelower)
+			name[i] = (char)c;
+		if (last == '.' && c == '.') {
+			snprintf(errbuf, sizeof(errbuf), "domain name "
+			    "\"%.100s\" contains consecutive separators", name);
+			goto bad;
+		}
+		if (c != '.' && c != '-' && !isalnum(c) &&
+		    c != '_') /* technically invalid, but common */ {
+			snprintf(errbuf, sizeof(errbuf), "domain name "
+			    "\"%.100s\" contains invalid characters", name);
+			goto bad;
+		}
+		last = c;
+	}
+	if (name[l - 1] == '.')
+		name[l - 1] = '\0';
+	if (errstr != NULL)
+		*errstr = NULL;
+	return 1;
+bad:
+	if (errstr != NULL)
+		*errstr = errbuf;
+	return 0;
+}
+
+const char *
+atoi_err(const char *nptr, int *val)
+{
+	const char *errstr = NULL;
+	long long num;
+
+	if (nptr == NULL || *nptr == '\0')
+		return "missing";
+	num = strtonum(nptr, 0, INT_MAX, &errstr);
+	if (errstr == NULL)
+		*val = (int)num;
+	return errstr;
+}
+
+int
+parse_absolute_time(const char *s, uint64_t *tp)
+{
+	struct tm tm;
+	time_t tt;
+	char buf[32], *fmt;
+
+	*tp = 0;
+
+	/*
+	 * POSIX strptime says "The application shall ensure that there
+	 * is white-space or other non-alphanumeric characters between
+	 * any two conversion specifications" so arrange things this way.
+	 */
+	switch (strlen(s)) {
+	case 8: /* YYYYMMDD */
+		fmt = "%Y-%m-%d";
+		snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2s", s, s + 4, s + 6);
+		break;
+	case 12: /* YYYYMMDDHHMM */
+		fmt = "%Y-%m-%dT%H:%M";
+		snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2sT%.2s:%.2s",
+		    s, s + 4, s + 6, s + 8, s + 10);
+		break;
+	case 14: /* YYYYMMDDHHMMSS */
+		fmt = "%Y-%m-%dT%H:%M:%S";
+		snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2sT%.2s:%.2s:%.2s",
+		    s, s + 4, s + 6, s + 8, s + 10, s + 12);
+		break;
+	default:
+		return SSH_ERR_INVALID_FORMAT;
+	}
+
+	memset(&tm, 0, sizeof(tm));
+	if (strptime(buf, fmt, &tm) == NULL)
+		return SSH_ERR_INVALID_FORMAT;
+	if ((tt = mktime(&tm)) < 0)
+		return SSH_ERR_INVALID_FORMAT;
+	/* success */
+	*tp = (uint64_t)tt;
+	return 0;
+}
+
+void
+format_absolute_time(uint64_t t, char *buf, size_t len)
+{
+	time_t tt = t > INT_MAX ? INT_MAX : t; /* XXX revisit in 2038 :P */
+	struct tm tm;
+
+	localtime_r(&tt, &tm);
+	strftime(buf, len, "%Y-%m-%dT%H:%M:%S", &tm);
+}
diff --git a/misc.h b/misc.h
index c242f90..6be289f 100644
--- a/misc.h
+++ b/misc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.h,v 1.61 2016/11/30 00:28:31 dtucker Exp $ */
+/* $OpenBSD: misc.h,v 1.74 2018/07/27 05:13:02 dtucker Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -16,6 +16,7 @@
 #define _MISC_H
 
 #include <sys/time.h>
+#include <sys/types.h>
 
 /* Data structure for representing a forwarding request. */
 struct Forward {
@@ -30,7 +31,6 @@
 };
 
 int forward_equals(const struct Forward *, const struct Forward *);
-int bind_permitted(int, uid_t);
 int daemonized(void);
 
 /* Common server and client forwarding options. */
@@ -44,16 +44,22 @@
 
 char	*chop(char *);
 char	*strdelim(char **);
+char	*strdelimw(char **);
 int	 set_nonblock(int);
 int	 unset_nonblock(int);
 void	 set_nodelay(int);
+int	 set_reuseaddr(int);
+char	*get_rdomain(int);
+int	 set_rdomain(int, const char *);
 int	 a2port(const char *);
 int	 a2tun(const char *, int *);
 char	*put_host_port(const char *, u_short);
 char	*hpdelim(char **);
 char	*cleanhostname(char *);
 char	*colon(char *);
+int	 parse_user_host_path(const char *, char **, char **, char **);
 int	 parse_user_host_port(const char *, char **, char **, int *);
+int	 parse_uri(const char *, const char *, char **, char **, int *, char **);
 long	 convtime(const char *);
 char	*tilde_expand_filename(const char *, uid_t);
 char	*percent_expand(const char *, ...) __attribute__((__sentinel__));
@@ -61,10 +67,16 @@
 void	 sanitise_stdfd(void);
 void	 ms_subtract_diff(struct timeval *, int *);
 void	 ms_to_timeval(struct timeval *, int);
+void	 monotime_ts(struct timespec *);
+void	 monotime_tv(struct timeval *);
 time_t	 monotime(void);
 double	 monotime_double(void);
 void	 lowercase(char *s);
 int	 unix_listener(const char *, int, int);
+int	 valid_domain(char *, int, const char **);
+const char *atoi_err(const char *, int *);
+int	 parse_absolute_time(const char *, uint64_t *);
+void	 format_absolute_time(uint64_t, char *, size_t);
 
 void	 sock_set_v6only(int);
 
@@ -83,7 +95,7 @@
 	     __attribute__((format(printf, 3, 4)));
 void	 freeargs(arglist *);
 
-int	 tun_open(int, int);
+int	 tun_open(int, int, char **);
 
 /* Common definitions for ssh tunnel device forwarding */
 #define SSH_TUNMODE_NO		0x00
@@ -132,6 +144,19 @@
 const char *iptos2str(int);
 void mktemp_proto(char *, size_t);
 
+void	 child_set_env(char ***envp, u_int *envsizep, const char *name,
+	     const char *value);
+
+int	 argv_split(const char *, int *, char ***);
+char	*argv_assemble(int, char **argv);
+int	 exited_cleanly(pid_t, const char *, const char *, int);
+
+struct stat;
+int	 safe_path(const char *, struct stat *, const char *, uid_t,
+	     char *, size_t);
+int	 safe_path_fd(int, const char *, struct passwd *,
+	     char *err, size_t errlen);
+
 /* readpass.c */
 
 #define RP_ECHO			0x0001
@@ -141,7 +166,6 @@
 
 char	*read_passphrase(const char *, int);
 int	 ask_permission(const char *, ...) __attribute__((format(printf, 1, 2)));
-int	 read_keyfile_line(FILE *, const char *, char *, size_t, u_long *);
 
 #define MINIMUM(a, b)	(((a) < (b)) ? (a) : (b))
 #define MAXIMUM(a, b)	(((a) > (b)) ? (a) : (b))
diff --git a/mkinstalldirs b/mkinstalldirs
index 47d5f43..399f409 100755
--- a/mkinstalldirs
+++ b/mkinstalldirs
@@ -4,8 +4,6 @@
 # Created: 1993-05-16
 # Public domain
 
-# $Id: mkinstalldirs,v 1.2 2003/11/21 12:48:55 djm Exp $
-
 errstatus=0
 
 for file
diff --git a/moduli b/moduli
index 00b5a69..780b2b9 100644
--- a/moduli
+++ b/moduli
@@ -1,431 +1,438 @@
-#    $OpenBSD: moduli,v 1.18 2016/08/11 01:42:11 dtucker Exp $
+#    $OpenBSD: moduli,v 1.21 2018/04/03 02:14:08 dtucker Exp $
 # Time Type Tests Tries Size Generator Modulus
-20160301052556 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D19F4647
-20160301052601 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D1A5C13B
-20160301052612 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D1B7A3EF
-20160301052620 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D1C4C33B
-20160301052628 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D1CFFACB
-20160301052645 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D1F31D8B
-20160301052703 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D218C293
-20160301052723 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D24116E3
-20160301052732 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D25321F3
-20160301052741 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D260D8E3
-20160301052748 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D26CD3D3
-20160301052756 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D2791F7B
-20160301052823 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D2B71133
-20160301052827 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D2BABBA3
-20160301052832 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D2BFC957
-20160301052931 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D3514117
-20160301053017 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D3BF91F7
-20160301053037 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D3E9113F
-20160301053101 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D41BFA83
-20160301053129 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D45A369F
-20160301053217 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D4CB8683
-20160301053222 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D4D01463
-20160301053251 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D50F62C3
-20160301053309 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D5351887
-20160301053333 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D568358B
-20160301053350 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D58AA31F
-20160301053359 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D5991AF3
-20160301053438 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D5F65E07
-20160301053523 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D65F37D3
-20160301053556 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D6AB7E73
-20160301053608 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D6C131CB
-20160301053631 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D6F18A93
-20160301053647 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D7132B7F
-20160301053724 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D76995EB
-20160301053743 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D793D27B
-20160301053757 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D7AE856B
-20160301053820 2 6 100 2047 5 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D7E1810F
-20160301053828 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D7EC09EB
-20160301053831 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D7ECC2FB
-20160301053958 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D8B829CB
-20160301054042 2 6 100 2047 2 DA57B18976E9C55CEAC3BFFF70419A1550258EA7359400BD4FAC8F4203B73E0BC54D62C0A2D9AA9B543FACA0290514EA426DE6FEF897CB858243511DCE5170420C799D888DCFDC4502FF49B66F34E75C00E98A55408A791FF5CFEA7C288F8E6664226A6A90BE237D2E40C207B5AD0CAEDFDA4946E63AEA351A09EF462515FED4098694241CD07E2CB7727B39B8B1B9467D72DFB908D8169F5DB3CD5A6BEBE1344C585A882508B760402E86EB9B5548A7B98635ECFCDC02FF62B29C53847142FC598ADC66F622F6E9F73BDF02B3D795C0DF23D00E5A3A7748F3E1D5B06F46D4568CE3F4CC57E67D4C36DF5C12800620698C727CC5F5BCACF3B7E17E37D91CFCF3
-20160301054134 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251903103B
-20160301054139 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF2519072B8B
-20160301054157 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF25192F631F
-20160301054207 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF25193F9E7F
-20160301054213 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF2519475A1F
-20160301054301 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF2519BA6807
-20160301054320 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF2519E2FA7F
-20160301054340 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251A0CD913
-20160301054413 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251A5B8A43
-20160301054511 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251AE66597
-20160301054527 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251B03A57F
-20160301054544 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251B276FBB
-20160301054548 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251B2915B3
-20160301054621 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251B79A4BB
-20160301054714 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251BF77377
-20160301054737 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251C28D853
-20160301054819 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251C8C959B
-20160301054844 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251CC0A39B
-20160301055002 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251D7C0A9F
-20160301055021 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251DA0A72F
-20160301055024 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251DA1003F
-20160301055029 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251DA4B607
-20160301055034 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251DA82003
-20160301055101 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251DE323BB
-20160301055123 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251E13DB33
-20160301055136 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251E2A2203
-20160301055141 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251E2F180B
-20160301055208 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251E6B2E8B
-20160301055248 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251ECCA61B
-20160301055312 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251EFFD5C7
-20160301055319 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251F08AD6B
-20160301055413 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251F881A4B
-20160301055420 2 6 100 2047 5 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251F8FC967
-20160301055438 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251FB8102B
-20160301055505 2 6 100 2047 2 F030C513D5C6694FB09539ECF9D8290608A96280EDDEB74FD66DD43CACE3A5BFD6BC4F02EF38E44F68296DA50091214D9E6C518D715D76E19CCCA0578886B93ADA36E8AFDC23B311DA04EB8AC2FF31F3B87BD27C283519DF9CFCAA9D4EF822ECD2AD5593D3819399CEF3FAF0B786071496A9BD94164F739A2D1E0DEBB798BAEF0540B4388D3762523B68E100D6EE231DD95BEB4F4472E9E2236A24E0891DF5A19222A6C69D531C9E73DEF6ADAC84D61BC4EEA36E2A9FD64902461BFAF9BF81D699E141EE77A03996DC4586D3487A0E6189696C1D67F91E91595EB584AD1DF9EF5FC64160EAC3F2D88B4FB0E20A7925FE133D71EF9E1DD018101AAF251FF16983
-20160301061411 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26C5D83833
-20160301061835 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26C6AAA907
-20160301062447 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26C7D2DF17
-20160301062535 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26C7F0856B
-20160301062652 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26C8266573
-20160301062708 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26C82B4297
-20160301063801 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CA342897
-20160301063920 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CA6B6B53
-20160301064001 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CA83D25B
-20160301064133 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CAC6E0AF
-20160301064312 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CB0B8B2F
-20160301064624 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CB9E9EBB
-20160301064954 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CC41F773
-20160301065030 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CC56680F
-20160301065134 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CC82B2B3
-20160301065432 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CD0A0833
-20160301065614 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CD54CA17
-20160301070010 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CE0A7B73
-20160301070046 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CE21045B
-20160301070141 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CE4560CB
-20160301070334 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CE9951EF
-20160301070607 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CF0C830B
-20160301070911 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CF96B75B
-20160301070931 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26CF9EB207
-20160301071405 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D07614DB
-20160301071648 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D0F1177B
-20160301071915 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D15E484F
-20160301071932 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D16371F3
-20160301072032 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D18BD843
-20160301072158 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D1C7632B
-20160301072445 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D2450187
-20160301072709 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D2B15CFB
-20160301073130 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D37B3327
-20160301073142 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D37C7FA3
-20160301073822 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D4B57B13
-20160301074016 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D50A615F
-20160301074134 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D5419827
-20160301074208 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D554AA2F
-20160301074359 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D5A29FEB
-20160301074457 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D5C6DA83
-20160301074620 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D601594B
-20160301074846 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D66D7E6B
-20160301074917 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D67D64E7
-20160301075053 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D6C27B8B
-20160301075132 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D6DB9C33
-20160301075225 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D6FE9337
-20160301075252 2 6 100 3071 5 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D70AF577
-20160301075345 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D72CB613
-20160301075358 2 6 100 3071 2 E2871F8AF82B8E1038DDACF268D3690580ED64FC99F13D64B8322F1F6F19B0860BD4CB74BD2FF72ADF1090B0506E77743EA2C3102093C10A5045A17F92E403AE24B4E9276F9999A4AAD7DF5F2C03EB72B6BB303FE894149BFD670A13ADEDEFBD726A12A7F32919BC4FFFC8FA3E2E73645B432EB894D6906D1E6E8CD5C8BB882953EAA0306508205B6BC0B99177C81E9E9192D8185185CE82CF310AD42A24DB83039A4F10D1C55E7EA7D4C020BD12947A25732829D1AC6100ED9DA3F4D834D8EB28875F37B399C5AE21D6A122950A41680857CEB6A25158A108E8E0338047A2DD979AB97E9F84ABA18FB1DD43FD630F494CEACF0F7FFEF38BC14968B0FDF4942927D0169B46E84D52356EB1B7D04EFCDF2239AEA21A63B6F64E83AC18F81EB6EAEF03328B830860C184B4434B39FA6AE31C751FB5BA1AEA1BD8D41457D9AE58C6EFD230493454BA3C5EB791E74CAB907D0AF1173FFB99D78953660B23127550350A9A09B0116099087A04B56078C274874507ED92ECD2D98A7F064C26D72F088B
-20160301080151 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F1FA94507
-20160301080332 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F1FF62A2F
-20160301080512 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F203E0E3F
-20160301080759 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F20BE897F
-20160301081008 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F211E8DAB
-20160301081510 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F220FBEBB
-20160301081725 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F22727C13
-20160301082213 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2352279F
-20160301083400 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F25905AEF
-20160301083955 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F26AB557B
-20160301084035 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F26C1D647
-20160301084145 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F26F0E75B
-20160301084827 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F282FE7DB
-20160301084906 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2847CBF7
-20160301085226 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F28E1E963
-20160301085254 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F28EF835B
-20160301085737 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F29D012DB
-20160301085933 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2A259503
-20160301090045 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2A569E5F
-20160301090201 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2A89EEB7
-20160301090441 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2B037B2F
-20160301090534 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2B2559FB
-20160301090628 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2B484193
-20160301092125 2 6 100 3071 5 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2E1E1337
-20160301092513 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2ECC261B
-20160301093051 2 6 100 3071 2 F5B3EB8BEBA51E3899E7F8C7E202FBB132EF5731B3C2AC07945AEDA6A77A194E69538E08ABB8BBC3FC5AC2D3F66E582AA280D1832065E63F462AE71CD69CB3523656358545BF625F0F0BA9A8902D2A09484BE915E4AB809B8C767F84AADC75744E07F691893DA5DCCCD3FE8A7140858A9CF09A52E3A8F1050913A592B5750BC54682523B6920F626D87A717D6680B4EE430317DDF7B36458D479ADF6855FE46D865D02F8161D8BD8F4D0F330EE27B28AA40D48B6EA8E183223FCBC4E9C4F1F615DE750A5F8BE130EE46DC23970AD5A3CB93F5822A53084553A3B27A72ADD55958935D98B06D6398B00A718EA6BCE075DD6708F714002AF5A75C67D087DB8308B6FCEC775DBE8415F57CCD39C13496F0782D4834C03241D1B2EFE5CD07D702BD489DE25DAF08CA1DE5FDA5962A8CC6E0283B992640B8706B076531844CF66D26BEC2DD5A0BCDABE6A048BA55F8C25621E8CAA55F2D9E011896DEA823CF9FFBC76143FF7F4653C3BBDC34138A482A150A221E2CA2BE774B7BD22B2481F2FD6418B
-20160301101954 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29E60ED3CB
-20160301104238 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29E7F21B53
-20160301105433 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29E8EA1923
-20160301110823 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29EA099523
-20160301111806 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29EAD0379B
-20160301112515 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29EB5F9FF7
-20160301112655 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29EB7A3C73
-20160301113152 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29EBD8A1AF
-20160301114603 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29ED0421CF
-20160301115854 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29EE10BE07
-20160301122138 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29EFED1757
-20160301124138 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F18BB82B
-20160301124341 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F1AE9F93
-20160301130540 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F378431B
-20160301132038 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F4B041CB
-20160301132156 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F4C33A3B
-20160301133248 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F59F1817
-20160301135039 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F70D3707
-20160301135200 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F720CFD3
-20160301135955 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F7BFD4BF
-20160301141625 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29F9118567
-20160301143329 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FA446E3B
-20160301143411 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FA4A5D73
-20160301143511 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FA57571B
-20160301145341 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FBCEC3DB
-20160301150532 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FCBAFB3B
-20160301150756 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FCE5B5B3
-20160301151026 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FD119B83
-20160301152435 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FE2CAD43
-20160301152638 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FE504DD3
-20160301153829 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FF425A73
-20160301154015 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FF5FBCDB
-20160301154135 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FF725ADF
-20160301154325 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F29FF9005B3
-20160301155218 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F2A00430653
-20160301160626 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F2A01612A43
-20160301160831 2 6 100 4095 5 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F2A01842FE7
-20160301161542 2 6 100 4095 2 EF7840BC7248E3E12D223BD86584358750562F5FCB298632E269C7F4347DC441CEBCBAF5B8AD25C3A3EE85A97FC342EF2B320425ACE6A816200E4A46596E6D911E8E5940E4ED1F64275D1A2A1E2DC8A34E26026A8DD9D20AF2E36B2BEB467168E516F1DF9145DBA60CE4BE46B34E918D36F581B2860BEBD153A09BF5B51348137CEB0BFA43FDEF5398C538CB9854BED966017DC918E4EA26E0E1A283AEA90F41B2D27CBC34E6AA64FE7E370D532BE4A0DB2E77958CA6E570DEDA817FB91351B65E227BAF96383323820AC5CF785CD686E99398773DF19C1E33D7199A5104337AD3C8CF78FE1AF5D8A4A2B8C092E1FD2688F2829E006C050257DC4C16576AB12AC01AE40F35785586902058735024E0CF90B1DD3B547647AC6F98A70BE3CA9EF80E9A1E408D29FDBE7935625B9AB863891D6D30A54903DD23933303055B8E864751CEB7A153A841D2E1CD3C5943C7F6F1BB2836ED387BE4FB3075363317A1E813965497F5CC621A72B1CF5B50813B418F391FB7C4530B6C19416B4A942063012798536BBF853166697747F39827832A3D135ABFB03BF15990787F64D25E629ED1A6009BADF5447730445ACF2684715A84ECBC4B3A1E2C93E3EFCF4D9373E1355740776F66353576D7359C69EAE48FCFB06CA7536F4B132BFCE6DB2FDBD687B24E7A0AD1EBCBF887A7258C24D8AC9BB86BF847D9AC980919AD9BAF3F2A020ED50B
-20160301165149 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE54C87A80B
-20160301165241 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE54C91EA2B
-20160301165750 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE54CFA74E3
-20160301173839 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE5504AEAFB
-20160301174247 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE5509AF4D7
-20160301174504 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE550BFB1D7
-20160301180608 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE5526F5F0F
-20160301181854 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55377C36B
-20160301182221 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE553B4B8F3
-20160301183911 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55510470B
-20160301184110 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE555338897
-20160301184426 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55571A23F
-20160301190148 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE556DEB983
-20160301192446 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE558BD1523
-20160301193428 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE559875F5F
-20160301193505 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE5598BF0AB
-20160301194148 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55A0E82C3
-20160301195020 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55AB8837B
-20160301195917 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55B6C5AB3
-20160301200332 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55BBC661B
-20160301201317 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55C7D9887
-20160301201523 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55CA30A3B
-20160301202029 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55D044403
-20160301203514 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55E324A43
-20160301203700 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55E4D607B
-20160301204309 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55EC519A7
-20160301205135 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55F6BDE23
-20160301205244 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55F7B0B23
-20160301205520 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55FA81627
-20160301205558 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE55FACF2AF
-20160301213318 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE562B75737
-20160301214847 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE563F5D2EB
-20160301215746 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE564AA7C23
-20160301220025 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE564DC00EB
-20160301222154 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE5669AE6CF
-20160301223932 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE567FEFC33
-20160301225302 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE569139497
-20160301225705 2 6 100 4095 5 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE5695E7AB7
-20160301230308 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE569D3D2B3
-20160301230751 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE56A2CD9CB
-20160301231012 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE56A537EDB
-20160301231655 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE56AD78EE3
-20160301232437 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE56B7299EB
-20160301232518 2 6 100 4095 2 E268D4796069A7E90EC81DC69831656A982D57FD2C1E7810FD32855F3A67C150F52C2B45EC5C1183DE82AE98202BCD0CA7D1CD0A4D15AE296B23B6FCC0BD171005C939D9D1D75DEA733A6B4F3DA9A96759881B7482ABC3CF967763F261D0D6BEDDEE374F138597B347A57A4E21F8F801CD8F8A33FB3638FE0CE021E052AD5CE00E23E3A6644C844E8F79749384DBD4AC2D46B7804D797174F4BF19F92D8710B18BAE576F69449EA91681A92B0E8E95EECB47CCB0720DA611EF8686A09A7DB37726E1357EA9A1CFB7B2DB04529147BD30F96515123A7B5540890860D45C7C033DC0FAF079A0A7825C6A6DFD9B87189F2EEFBE5F68BA9B1DDA8E3BF26ECA3A8A261BF5C67E2A01C8E4BDFAA1C221950596216C69468493E424DBBCEFB8BCCF0A83C773123087F355A15EE7515BC3C6536FFCA05B50F8FB7F3A57103DDB6FA82E2B902991086E2EA9284CB09FEC7A4184EBA09A700930188711313FD16C27B338BA4BA55736E0C7B4C6E731933BD9FD7DDC80BC3A23676FF871FE3E21945BFC83B22C3992E2219F75A6C7AD05F66F2D09B8C805C2E1FFBEDBE5115FD9FB023B58B37FAFEA2CDE16C52A54BD7090C03438EF19F04D8FC630055FC96AFEA891B8CDF6016A6E101A9C27C1E6A5A3B81DC785B6E8808EF59414B58C1CBC5E3E1428DA520F1AA2E8BF6A6554F2DCA1CE30972E13BED33D2744621C763D387AE56B78E563
-20160302001351 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF880CFD33
-20160302060207 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF915C8E67
-20160302080221 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF9484D603
-20160302085858 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF95FD5243
-20160302110323 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF99425D23
-20160302115537 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF9AA4530F
-20160302121026 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF9AFF17B3
-20160302125303 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF9C1752FB
-20160302132855 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF9D055A3B
-20160302145027 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDF9F210C3B
-20160302160128 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFA0F799CF
-20160302164318 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFA205C49B
-20160302193543 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFA66F725B
-20160302223446 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFAB045BFF
-20160302230706 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFABD44B9F
-20160303005014 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFAE7817DB
-20160303013053 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFAF76805B
-20160303031806 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFB234F5BB
-20160303034446 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFB2DCD713
-20160303042131 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFB3CABEBB
-20160303052710 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFB569F28F
-20160303064237 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFB744D6A7
-20160303074318 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFB8C38E87
-20160303091435 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFBB0B707F
-20160303111232 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFBE003643
-20160303112343 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFBE40A0B3
-20160303113550 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFBE87B0BF
-20160303120708 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFBF49A92B
-20160303122005 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFBF954093
-20160303134821 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFC1C0AD17
-20160303183137 2 6 100 6143 5 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFC8B45457
-20160303204451 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFCBFBCF5B
-20160303210530 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFCC756893
-20160303224116 2 6 100 6143 2 D9752DD196C5E138B7F542FD56561455DDBDF05DCC107F8A5C8F393529CEBAE3CECA54E85766015CBFE1856D830D7A20385951C0941FF754570F697951C77F6FC064C28B708E8A691BDA8C6C1921C7559288EE8A024EB50D923EFF9F143E76B053D2B5FF1779C1CDC0E5856BBE4396928E605009866CFD212C68183120D5A7EA14BD3878690406069F8BC9AED334AEB6C25FD4CD9421F860893256B1A7741F729982BC109E3B6DF4D86CCFCDC1EBAB2EB13836E7988CB9F32F3EC5120E6B2DD74FF13E456A1A01E313E00A728D2ED690A656DACB1C71C6BADCA959CD944EBA762FC8B0B3CEF237386ED3D4FC6983A8F950B956DC76C09B6AAE22B5B8501B73B6E685FA40AA56139A8C02F6E0B7836E3F08EB5F9D4EC83A8BDA394FC5DA24D2CF078AE7491E3856A18FCA2C68BF9BC82ABCDE494CDFB31F82E5FE8C20D7832412F478BFC67A2B4B2CF5F266DDF53CB62372957861B95FFD2C82C46E48ACD75CAEC30E8453C8A24020ABB6143665441179478D8E33E505C2E34C1EA8F22205CA8FB31A48209BCF10ACD56B6B0060DE1836A4C9EF3C062C552C1BC8528D262FF0A2BEB56626C69A8CC7BA24F65FC39768212BB7C41BFFEDDAFD1A1528F6258F2ABC102F693425FDDF20D9EC9601FBFDC6FCD43E551C082A8A1373A1CB5E83BCD8175D9B60662D03ED5894D3EF4325180633C33FA1DD0964CC0CAEDE403146E7A5B8ED74FC6AB359EE1909A45A445429B17C04658E7F4F31F84DD194FDFBF3EF345C1B4EF2563E16351808FE4262B52D0C8AA748DF502FEF3A92C9F6A6A03BDE903DD1392177265313C08E767B003614AC6C6BFC501AAC24737BB3C8CC0160D81FC3BC6244974E1D83D15E676976F92999AEE25A66E7FE124A94D52A902E035FA5F866833D7AD3387BE2423095930671D8588E49510AEC9430ED1F03A02F3160124D893833D44FA4B51FED9044AE5B4136105466D5CD711FDFC37690183BA1D4930347148433D76B98A857EF4962FE0F48A16F20454555411EC778B248529F50503C4E0D62A122EEF42CA6BEFC7B3517CCB75A293AF2532E29FC2889DFDFCEC94F0B
-20160304002011 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F213AE3B5BB
-20160304013213 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F213CCC818F
-20160304014837 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F213D3357F7
-20160304050100 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F21426DAC33
-20160304070516 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2145B0AFE3
-20160304085926 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2148A9E96B
-20160304092251 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F21493F5C9B
-20160304092815 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F21495C2BA3
-20160304115839 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F214D4FED23
-20160304122842 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F214E130FAF
-20160304143749 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F215161823F
-20160304160139 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2153888D53
-20160304160440 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F215394B933
-20160304162214 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F215400CF9B
-20160304212008 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F215BACC633
-20160304221341 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F215D065E4F
-20160304221614 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F215D0E8A6F
-20160305022340 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F216368CBBB
-20160305044620 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F216709F6C7
-20160305053801 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2168484233
-20160305060125 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2168D0E0E7
-20160305081042 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F216C1797FB
-20160305094218 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F216E608403
-20160305095044 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F216E8BAD0F
-20160305095440 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F216E9B001F
-20160305111737 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2170A72F1B
-20160305152313 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2176C19D53
-20160305152947 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2176E37BCB
-20160305154608 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F217744E9E3
-20160305161226 2 6 100 6143 5 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2177E547CF
-20160305173357 2 6 100 6143 2 FC87210E608B51094653AB8D5963CAEF1C053FBDBBEDF91B83BBD945C79B4F67E96E8FA2C32DD50643434724257CC86C29F3CA2D266A719934B4D350E933D37153610C332F148D4B22D7D790A2A83995B0600254F640BD5E48B7D97D1BCEE76515FE078CE062EFB08529A5670F773DF514EC5392403D50C33577AFCDDE7D90224AEED69799AE17968CADDBFDC81A6E10B1CDE4A0D3F41C4B82CE346E0621973BE07918EAD36D7C67BCF2984D0F78BCD1E540847CA4DC90D909845862D4F699ABFA17F5749554774BC2C59443265CE386C655055202009B32590EB0FD85F203E63425342E756AB57F5BA14BD2E283B617A230E11A955442F0C1F53AF4F08DFD1D2606DD5DD04486C40A0E6D2DB2B390D664A97D32ED7868A6AAC5F2E534B7C880EE0F6834EC100D547B823547443D02980F1EBB2EBB6D57E9368BC70C440BB5406220630583D59AB11C489B0B0B8591A7F9FF322BFD4B9FE0672800A402F9734652EF151B44180D4EA7A713C66873A245691AAF295272BFF02979772EC48D65CF34540F38EDF2B95BDF8E7A88062866A8F5471F29993E1D4A4F1638A447D237964907CA1090C0CE1D4FDD79277219F9E1CE63E3E95BAFF8017639969710AE8520769B09C318BDD8A0CB3560DDC3A6281E1816EF16D942980934B6B381D44FD19311FDE8457113B6F8FBC9101EC20F6F216712BC17A63A753F0724BA90EA9A4766FF93BBA39020CC72E0B33CB6CC3C3D87A13CB86BA9C1A9B9086DBD905F62B29782E5AAD4C27704913415E583A0EF1F2586C612DCA66CA31FD1F797752EC984E543616C7575ADC6BDAB9788F82C9258DF1E58777440BDAD5D93A2CBEAC466D6BE37CC4307CA0534B00B6EBEE4C3958BC587117E8E26D13E36B1D4A9D0F7DB2F00E9568EB21F6530EF635650C51DC9D04B788439BE01ACBF5501D673896A170037E0048882DCF5A09F7605AEFEA5615A534B5CAE77D46B00E27CAC0C7685AA235EBC0941B056FCE7737E3BD6597EF0C5774D1535F294645B12025F17474F9066DA7DFD867B72E3706FAEECD892C05D92494D7A3BEE52080BAC6FCA8F2179D3586B
-20160305235825 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B0B4DFC33
-20160306022229 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B0D65D0DB
-20160306093737 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B13D7D927
-20160306094452 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B13E933BB
-20160306160337 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B1971D123
-20160306224032 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B1F3B6DAB
-20160306225345 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B1F6160BF
-20160306233854 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B2005324F
-20160307010902 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B214E9673
-20160307051433 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B24C9A09F
-20160307062817 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B25CA759B
-20160307113227 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B2A201EFB
-20160307123109 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B2AEC017F
-20160307185147 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B3059D223
-20160308031623 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B3779276B
-20160308074434 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B3B36AF7F
-20160308080500 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B3B735E1B
-20160308090559 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B3C46A863
-20160308204809 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B45F50A43
-20160308220844 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B47098FDB
-20160309000534 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B4893E51B
-20160309035855 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B4B9D5AF3
-20160309042540 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B4BEF4FBB
-20160309152136 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B54B515AB
-20160309192852 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B57FBEBF7
-20160310013359 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B5CE29283
-20160310035549 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B5EB8EE13
-20160310075706 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B61EA384F
-20160310173812 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B6993761B
-20160310190029 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B6A9FDA07
-20160310193821 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B6B156863
-20160311033330 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B714D2463
-20160311043906 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B7225A617
-20160311054129 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B72E8A083
-20160311060123 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B7320D78F
-20160311060829 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B732F58C3
-20160311071819 2 6 100 7679 2 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B740FC84B
-20160311081031 2 6 100 7679 5 CDE6C545B0D2F4A803F7AA7269ADA925DA60EAE55764AE38A7C61738B71DA67096F9E2CABF9B30B2E33E1FE97BFE4CE54B53041F2B2A0DAEF6135B6FB4990BE5C32AA56F223B6FDA4599B58517C6B78EA50C8E17CBB37865B5DB8AB5AB0F9A30B27AD76B11F758F10643A569346816280CE9368A159957E161B5E877CBD33D838B725F3CBAA53F6BC1B8F0062B9ED6D756CBB077B92A0A010636B4B92D570C8E0E3BA5553A92B7F1BF41C7AF7354849491B1C63886EE4A52DDBCF24444D5EA1636F883C1B5482E5ECBCA45BB5C741E9A302554B218DEC84908A75D6A2FB12CD96B1C6046A27FCBEDF260AA445C90A156DC17A1147861792E81840E71D0C8DA6BFC54BE0AA2409B7B23807FC07EF4B2B88B6AA9755809D084448E20D06890B4F299F4A38653F34BB52F38E06E4BC7AECD019E6E06FE39238F661726D7FD4AF8F5CFD49177CE8F8D324C99A00D4FF37B5CE5845106893B0AB4600F0A47BC5C3A536969498548EB86BC2ADB0155F9D2F94B02E7198CCE6E03D091191F63F7CD9AF5F2781D32C105A5DD8425090F90FD2099FE37630A69DB179A7161A226B0CD24C93C087B3AC90EF711C2358DC39EA53C0B9BEAF30851B9DCC5BCE27B4595D391DB68336FF330D3A1E90358A2CB1B35765C6F629D737EF13D6565390D25F3DC8E5A17FDDAF740568659F064CC5DB9F4A3A6CA3BA027A58CD18880F4941CC9B372BDB9B3398FBC357B7672EFEA922537846A4F4B7F393B927786A30DEEC3E5234CFB2D9CE459D1CB2140DE33052CF325BF81C4AA80928FB4906B6700F9CC2628747894CDF90FE2C2F07303F435CFD182F661B19E802092BEDB3E22C275A9AB635DD60A442E2E3D6B61CB204898EB0F0D888CE8903FA8521B9EF18046904F63B66C70B2C503CD1E2A2EEF203274D59D5A86F1B2758B9DDC9F97708841322C99BE9A47524A8BE01D7152B9ACF12C0181BB8C1884DD03FF26FA916FD95A4325DAC03139C80F7931F24694AFDDC150848579C28276BC4DA72400277F560A1E9701186148B5ADADDA2BCC8F7ED47A999DC77C3D6C7E20AD7F3C0A4DFAD3B8EEA0C0C402A28B27B01EAE661CF48CB7A8E14FF0597612798D954B1AC078984BAC3353F2A9829E9F29D88562F5EF90DF5A5E81A97C4BC9565F2F915B43ECD333B189D3C774E18B397D3B6640D8F4902DE3A90BF4E2646302A4BE7341A40F83AEC49B7DC31C0B91CF4BF022EBC8623CDFAD234CECD39942649B386CC65EBED4676F6B0FBC015D2C300B252A7DE8DC6434270DF9918D48FF541CAFFEE9485166EFB82C4F4FB2FA109C6C16D475052E530B12FB81DF189F77C08A9DC2F6A4F37E38601B74B68FAF
-20160311170649 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9B171F787
-20160311195449 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9B3EAFC07
-20160312113901 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9C1FC4A03
-20160312141825 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9C45A6C9B
-20160312221956 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9CB35C95F
-20160313023234 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9CED021AB
-20160313062450 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9D2124DF7
-20160313135733 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9D880F89B
-20160314002320 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9E14CBED3
-20160314074608 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9E75C54D3
-20160314135741 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9EC7E3DAB
-20160314140815 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9EC9AC0E7
-20160314202745 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9F1BD98C3
-20160314223316 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9F36F08D3
-20160315005016 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9F54715BF
-20160315013952 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9F5E3A7F3
-20160315060542 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9F968A573
-20160315072619 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9FA7969D3
-20160315105849 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9FD4C31DB
-20160315120521 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9FE292087
-20160315121136 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073B9FE352FC3
-20160315152946 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA00CB151B
-20160315165331 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA01DFD347
-20160315184225 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA034D7527
-20160315214330 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA05A75E33
-20160316020204 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA0912D52F
-20160316065014 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA0CD7441F
-20160316121031 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA1102A093
-20160316165356 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA14B5C017
-20160316191831 2 6 100 7679 2 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA168B1623
-20160316230539 2 6 100 7679 5 EC435B7E292EBAAEC94B8E8A53ED9F3FF717BB820D4893F0BBE6589BD3AF344B765A6000950C6244B2E4262E7E500BF699AF0FF49605A15EB80C61429C9FB79F658C3E0F8DB516AF9703BCB5E84ABA314292808DC70D183C513609A6D345F5D8676256E25108EE70B210C0293B5C804CF21FD843D2F5F79F91F57CF2C2EFB7052CA5F73544F0568A68FA5583CA6EDD300817AAB25E650B0AB9523C6C60156726F4B5243A8BE580308BB6297E23785893119D49B2407D4D8DACD551D08A5F9BB32BD7965313EC6C9DDCD685A62F7AFC8E71DF10F9E1FA25EB3DCD41D7DBDEFE5DB565BAE0CB62F192AA573A126FB92C9638457E73EB4C007268142D9506B17D20A4D73B51E21983D9AC86F7ABBDCE9B9D10BE307642C49382E27B45ADB32E9FF7A2203F395C71EAF7656DF83F57E527CCA37A2BE9AFBA89FB718DB95CC041BF4025FF1CB5F463C8A09FD374AF3F143EE53FF4B369117BDBE0743335B1B5650B68C5B4F64E42D4CF0B329316F4FCD5E66F4A1359F2B29684961CA04EC5AC787FD4BF990F3FBE698D69FAF946DE12A4215392928E29ACF24F940AE4046C74BC6E799EE1D85BA8264C6C7DFF62A244CA2D05C4352870E0E8EF71F884AEFA4A4CA704B6C6607D2E59D36253350AF73C1FBE9C5D61A26A9024B715B45ECF1487D23970C5E405B46029403DD95B2F5672E61863E48CBB280300B2CF87C749F0ACC52940819688C819250B71E54397C8792AAB31655BCE19FAD3A7C59BD64904CC806304AEB6DC8B534081CD2EFD2808977FAC9BAB540EC153DD98D8B33984EC40BCFBC0C5D5B95AB3E183961DB2EE8883B174A3CFEC21CBE7F200FDD2879C1BA808B65A03B02793688FBB1F753333A23A4139766DD3ECD30742E55C25474D068CAB008BA6957CB014E4D46C4BF3084C8343D61231B6B997A8BCEE761D907E4323B92EED55575A38048D686B04F6614B7F931BF1F7D2CF35912E3472F424B11FEBA41F6D569B1A13002A33D5660844A896436AA4D8BC74B6951C75F883D747690B6AD3501B84C6C5B4E29C4153A98C0F2DF38CAFDF00E15CFE8DB0939E5611518DB4547CB2880B5F2D431526082D608384FA3BDD78B75157F25C7A2448249E635C20051C39577AE777C75E7B424CB647B76C9880E905E401DA09DE7A6A5F3E59376B24DCAC613C6EF263741FA15E83B64C78C03016FD34AB608D77100FD8733F130F63A0725B8E7CCD344F5E9A460D2F4F5BE139A6B57A3955A47726A02D6425EF8D1440709517F2DE1D8BB1D054BF69B77E44B4C4427F26EC6303F91CF197298214820264AFACBD355F08E278734BDBF1E116ADF6C1C03ADF5E73212A7073BA1974D157
-20160317204037 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F505984F7
-20160317232704 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F52635AA3
-20160318065706 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F57FAD16B
-20160318115527 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F5BAEDEAF
-20160318183751 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F608FC39F
-20160318220732 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F6315D9EB
-20160318231533 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F63E5739F
-20160319161235 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F7037DD73
-20160319230645 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F751E7BE3
-20160320013744 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F76DF3D47
-20160320040506 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F789CABBF
-20160321132428 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F8FC5A85B
-20160321160901 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F91961EDF
-20160321181311 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F92F8EDBB
-20160321224946 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F9615911F
-20160321230806 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F963FE5D3
-20160322064427 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F9B60592B
-20160322090339 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F9CE9AD5B
-20160322103202 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F9DDFC97B
-20160322120630 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F9EE9F43F
-20160322130823 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27F9F927B4B
-20160322151455 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FA0F6C9EB
-20160322151924 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FA0FAAD73
-20160323004347 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FA73E643F
-20160323011842 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FA794B363
-20160323041407 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FA98073AF
-20160323042341 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FA992813B
-20160324042502 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FB9535E6F
-20160324084810 2 6 100 8191 2 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FBC2024D3
-20160324112528 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FBDCE47F7
-20160324195325 2 6 100 8191 5 D8320CDE33443FD11E472910A82D580EF614A690CF5313E998A695702508351835AF6D1DF2FA7AF2F1B234CB85E4174D67D9A32B8CC58DAF6DCFD555275B1D038D5EAAC00E0396BFF8A3686F1BB5DADDEB3C5F12B02358C7A1249A01CB1AA2AB3FAC5FC95CB7D16A38DBCD11804212872394D9A2E2F2797A3062AC5AF0C0C57F5ABEF3608546608EC08F197CE2CCF0490875BE4BCF1BD35358AF5694217F2E3DE713800F3C4071622FDBAD20CAEBE2BA60C80DF012DA576EE24A753749C0BAD8707A2382B6E909FF0B8F4A304EEDB1BF04CA0747166981279FE69248AF0DD177702DA2DC709E301D7D6FE985A7D3F7A1678A9BEF306D6036F143806563C42ADFFD8D70595F0C60BA39F0D392CE7EF7CA57547DB2E35B0464FEC6F59F6095F93BD0A241589CAEE15E2226873D31876900E534999F1D2E23E7239FF679377580065A861D3E29FA7215979BDE039ED1FFED26CC2F5541C5CD907E81434EED0479D8737262CCB2807A70504088F23E72A3D949F37C2C8E957DC2FE64BB9CE028013270F42E022BA671F1670EBD20413453A3CF19F53A1A6BDE5D744E39BBF9377384AAF0FBAF475DD1067A2906244CB87F919159DDC71256A251F1BBA789B18D97602C9C1254A4443849C16E0CE2A7A0B6AA6F117788A92C1CB3F60E2C8E539840E3AF49B9248D3E1CAACB08B43146F07CC53D2573086ED062D108C9AC924F58265CCEF3731D39FE5D4F983EADD0E9F9D8B68D953AA9342B8604AFE7916E544D88870F2ED0AFC2CD0C47DD1E5F361004D97B5108D13CD127DEC8609FA2C65FF1714FD45F3B2B3809BAC06DFCA198B71B3929E2A7B62538E5B1B8B5024D8BB78438883911A6FCA870DB16F8F2DA46D9C611F785428A356B40C07B2B8A72E157E3497DE2982AAAE4D2D9F4368469A7AD4061AEE188DA4317D826721B9F9B1A361FECF0C725E0AB6F17C147D2C62A4D11989DB1503F85763FA3E4A49BAB6BDD05C95199158D421B115F40B124EE448803E07496DE7C2682D4AF433662978CFDCFAC88C9100C46CC16929A10E3082BCAD4444D59FE57717FB4BE8DE45F4D84716D204AC97CBA5A7824765636C571AD6780AAA7510E832EECC54D571A780F90BC6A1B54DE8CC83ECB797A9065CC9807CC99DD7638AFC500D05FD2EDEB795227CAA37EBBC04A37DF07762E0319F27B523282D11DEFD85A1DBA40C87EA1EA4D1B9B2A2FC34F9F5395AE51E3A994FE25C680022E5ABD19D11703C2CB6EEE1780F76FEA8601FAE9E27BC16F832BC16776609DC2B0E3D605E635258A95907A148D583B44E202BA4A48211DA3358B7B391B6F3AD0F84D9D7F97DFFA9D819C3D316A59173E8CA970240349A89E09F0A9B1A4B4C6FFCDD878A977BC9EB254318574C40C49D2DCE56FF803601E1752BE3824F94D0D66C1C5FDADCC9670BFC85C422811D27FC34000DF
-20160325054405 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD3C9827F7
-20160325073844 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD3DFD683B
-20160326035547 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD4D2BE973
-20160326072058 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD4FA14E4B
-20160326092507 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD511CC0FB
-20160326124028 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD537EA3E7
-20160326204702 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD595EF333
-20160327004038 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD5C324F5B
-20160327062851 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD606E1A47
-20160327081155 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD61A5005F
-20160327123555 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD64D2A70F
-20160327223323 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD6BD47A7B
-20160328011117 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD6DAD19BF
-20160328031621 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD6F1E5643
-20160328081352 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD7291B183
-20160328130100 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD75E7418B
-20160328200420 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD7AC63CBB
-20160328203420 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD7B12C7E3
-20160329051003 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD80FE5033
-20160329150013 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD87A1FCEB
-20160329205744 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD8BA2A65B
-20160330010039 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD8E545E13
-20160330064620 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD922B39AB
-20160330195544 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD9AE926F7
-20160330202118 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD9B2841A3
-20160331010824 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DD9E522A6F
-20160331155606 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DDA80BFF2B
-20160401003202 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DDADA756E7
-20160401083841 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DDB2E0BFC7
-20160401133333 2 6 100 8191 5 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DDB612067F
-20160401171656 2 6 100 8191 2 E8E5A3AF93DBD4FB99E4325B3B9308AE7731E7E27B532A2D0AF5306CB249EF6C63C7DFB66FC19B8E84A5672B378D77DD413933ACA7F62EABCD4012865D9336A47AD7E596B21EA5B6A2695C0F6C1C70D92CFF3CA18522B29993AA0A43A6849CEFFF53DF7E33C833B5B0037D8906528C80F98C2FC22F0C43B933795D153ECD05FC0D734F4EC61BBBD611F61CACA7CEC4FEF72A127074ACF73A11B1004A954C48D18E74B534E318069C5CE76C1D9BBB0326432B3C39F26058B6D6077B562CBE0DCA4E5B53F1CF9B80EB4F40DA6DAADF924DD2E7A689321F1558FFB55DA7B91009767791BDA252285D117D45A77FF044F467273CDEA8D4B5AC83DBF16DDB8F5FA4C1556129FFF4213D199DE4E0996BAA284FEC13A86A9F81E7FEAD84B4C59CC6DD641ADDE2E74DEAAD096E53F1F9509BF4A5405BAE67B7A1107E685D6CB934A422673ED632BD91BF84758C9B504DBFF7835E36B038C74400C983452CFEE72FACF76D3AE196BA44DF804657B92D6B646DA47910E53FAE8979C1DA9120C672CD4AAD18A7BDBA2AD397F7B0E01AA7AF4700F9A83EDBA90D25F74C1DCE0520BA9DE24636629D0140BB4BC6C2A703103E5A234BBB9154AEBA22D48F8EBC37368CCC68DC6BA310E2060EC37BCA2BF7DBD68F951BB23D7C018DB2CBC74752F5CED8ECA04EC743A8F4B503831DB09C387F6BD3A7DF1A25BCA452FFB852B134B67CCE4B0141E84B3D796BFDE7BFB2C34760C64200D40728560598B6FB965C0187495318A6EE97E6648F476939AE82F3D9D51761652672CFB3263385219E41D9A26ECFD975AB2005F67B9B6DB6D72ACE42C5079C2E11BEF3B2C0B334E9D4C2EFE518AD4BB8C0A9A995F99B4625D570E283D41EB4542BA37ADCEB772E45F77A72071874CBF8E9C2022DB9FAB62BB8BB11F72416193D10F4A493BDD9FB68A3BADF8130AE380D1987CD5ECCD6D9F5AD2F219D0076964D17F2232E5DAACB832D6E54A0CDAE72302C52604675053C5ED83680DB1D5A2FB9D4885B61E29465FDC016B9CE5DD93582A7221167E77C194C6E7A6D00E98A3E0FBE3987B1C5C1562AE878FC14AC7458003F949665D92F4F01B7A511C9C9126B79E32258AD5BFAB38B91B710AFDD222312DB543EA712C60CF8C8C0C9A7968A9AED867EA11E9718D25EF8A21F18A2F2B3FB28944F8E049705ADC399296AFBA30228CC7AF6D39F49689A16FF5FD64F09A2233970885EB76AEF2650D9A16CA594A3C67F0640095D10FB6E818BDC512F36446FB7277480BA1947D49A8AB5D78965DB16F2E50BFD09910DB0DD99654A32E07C86CF1601D618E7B9D2745C4CFC983E3D48FFE5A08AA471B29DD0E7BBE6DC1DE82FF8988E76835D0E03C177945886DC273C9C91B8B0950E7619490125AFC453772CB66D45D3CEBA3AFA919AE4AEF42D36AF7EDC4C5F030B5720C82FB229E9DDB86F198B
+20171129060817 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65210B1E863
+20171129060830 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65210C3D8AF
+20171129060835 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65210C56383
+20171129060853 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65210E2A407
+20171129060928 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652112864BB
+20171129060940 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652113A4B2F
+20171129061019 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652118756EB
+20171129061110 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65211ECF08B
+20171129061125 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521205BFC7
+20171129061139 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652121B156B
+20171129061144 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652121DB6C7
+20171129061155 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652122E3A4B
+20171129061219 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521258E75B
+20171129061248 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652128E21EB
+20171129061255 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521294FDC3
+20171129061331 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65212DB195B
+20171129061336 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65212DD4653
+20171129061427 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521341B5DF
+20171129061437 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652134DD68B
+20171129061446 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652135A0283
+20171129061500 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652136FF967
+20171129061601 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65213E379AF
+20171129061606 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65213E53213
+20171129061704 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521459419B
+20171129061720 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521471A4D7
+20171129061822 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65214F0057F
+20171129061829 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65214F60057
+20171129061843 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652150D5E63
+20171129061855 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65215200027
+20171129061901 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521525622F
+20171129061942 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521578C59F
+20171129061951 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521582692B
+20171129062008 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652159DB0EF
+20171129062015 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65215A1F453
+20171129062045 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65215DD99B7
+20171129062054 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65215E9E31F
+20171129062130 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652162FE18F
+20171129062138 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521639C1E7
+20171129062159 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652165F37BB
+20171129062221 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65216873C97
+20171129062228 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652168EBECB
+20171129062350 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521738FF13
+20171129062433 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652178ED13F
+20171129062446 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65217A15C2F
+20171129062541 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652181044FB
+20171129062603 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC6521837D78F
+20171129062624 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652185C9EDF
+20171129062634 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC652186C3473
+20171129062650 2 6 100 2047 5 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65218888AC7
+20171129062658 2 6 100 2047 2 F6A83AA30FCC5A1FED886CF60BFAD561F8558C07EC39F7972F8BD034F16AE485A25E223E609D18CBA60DFB74F85637DC6A55E38BA145746B5C2EFC007E1B36B0B179A7756B160A90E6C7AA8D42DC5EF9F96EB654D37EAA3BC2A96CA6F9F60A47E340873B6131B9013ACDB75EBB189B671B8D48BD60D36D2BD4B9D2F5FC828F9989F2E9FEDE3AF8E10343C458CAEC77EBCDD113C75D4F190EFA489835725FD7A0CB3E3A9C30DE03BC5D3991D53A86A25A3F3601171130DBE5F2E6F844F6AE9565261F9110A264A1C61EA0CDDF6DB06F28F9E3B70A482C849E5523932B4F2343E90AC140AC06AB027E293CE2B81BA61021B1B15DDCA48B721AED9AC65218915923
+20171129062719 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADAB68F23
+20171129062852 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADB8020BB
+20171129062857 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADB83D6A7
+20171129062904 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADB8A117B
+20171129062913 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADB95C4A7
+20171129063020 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADC1E13B7
+20171129063054 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADC606493
+20171129063136 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADCB2F54F
+20171129063229 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADD20E077
+20171129063237 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADD2BAEB3
+20171129063257 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADD51762F
+20171129063345 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADDB29C0B
+20171129063402 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADDD1340F
+20171129063440 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADE1D2F13
+20171129063453 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADE32DC9B
+20171129063513 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADE56C75F
+20171129063518 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADE5898EF
+20171129063545 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADE8E3FC7
+20171129063559 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADEA2F2AB
+20171129063613 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADEB8D03F
+20171129063626 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADECF0D4F
+20171129063639 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADEE3F9DB
+20171129063648 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADEECDD2B
+20171129063728 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADF3B2B1F
+20171129063831 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3ADFB933CB
+20171129063954 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE05FFACF
+20171129064044 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE0C83FEB
+20171129064109 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE0F81483
+20171129064127 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE1194DFB
+20171129064141 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE12EBF3B
+20171129064157 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE14B8657
+20171129064308 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE1DFF6A3
+20171129064313 2 6 100 2047 5 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE1E37B6F
+20171129064345 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE21EA40B
+20171129064404 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE23F19DB
+20171129064429 2 6 100 2047 2 FB10C8B63DDACEB1654E9B1BF39D2E5A65A310270D19FA63F4520A3B76AF3FB32C535647E803A830B96E950AAE9539547D53CA1373E7C059B5E8FC81A00E193B547C8F490B1428A4692EF9B4248E69498595D579D93CE2D867709AE84F6558381A51673E2BC55FC04B8655EDF3743980319C875C7B733996FE318A3EC6DBFEE79D596AF1A4AA7497575D8A2E378D86CC368073E9E11FFC83F85886D1FC8F1D32CC0021259D040063526D8ABF2F7E00D4B627AED022D63B84F7DB55EE10550FA9562A067EAAEE021D1893DC6DADCCADAE1C0AD8F350A20CB33DAD32035FE12CF7DD29A0BF35DD87228B512DF58C7A3DD5187E2E58FC39AC835F847A3AE26AA1A3
+20171129070339 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8656503B
+20171129070431 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8673A5D7
+20171129070444 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8674FE3B
+20171129070802 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D86F9B0D3
+20171129071143 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8790794F
+20171129072038 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D890948AB
+20171129072201 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D893CA93B
+20171129072633 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D89FA04BB
+20171129072704 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8A081C83
+20171129073026 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8A94313F
+20171129073736 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8BBF2F57
+20171129073811 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8BD07FFB
+20171129074006 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8C1A2AAF
+20171129074244 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8C85024B
+20171129074339 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8CA238BB
+20171129074739 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8D485DB3
+20171129074856 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8D771FB3
+20171129075003 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8D9E294F
+20171129075124 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D8DCE88FB
+20171129080839 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D90AB02AB
+20171129080910 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D90B81087
+20171129081213 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D91332803
+20171129081802 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D9223D76B
+20171129082038 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D928D0B97
+20171129082101 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D92957057
+20171129082300 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D92DF3C23
+20171129082841 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D93CA39BB
+20171129083100 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D94254653
+20171129083144 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D943C67CF
+20171129083314 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D9472895F
+20171129083902 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D955FDEA3
+20171129084024 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D9591B8D3
+20171129084309 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D96010007
+20171129084528 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D9659DC3B
+20171129084819 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D96CA1933
+20171129084937 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D96F8F0FF
+20171129085037 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D971A1D57
+20171129085105 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D97264D63
+20171129085212 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D974AC317
+20171129085529 2 6 100 3071 2 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D97CB27FB
+20171129085643 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D97F5D31F
+20171129085754 2 6 100 3071 5 FE72CDD6784FBAB0F7AA00E2F31A76435F8A02AC8B14A52C64CF4998EFEDADF9272FF9ADCF5AEDB6EEAE34A36C64833C8D63398A4906979A6B785139D9E7FE72FE8E3502B71B7780E8F4D74A520D3C8E5706EA428CCB746B673EC7472704203315FFDA7F3D5FCE56F6F441AA575B77748D6CB69DC1D7DB8531902CCB0E4D4817FBF4BCFE05120B60B7B99C62C578E6BDADE8E45B44DD67448F25F9118DA92DE375421E131781ED0895CACACB30C2D94D994B16215284CDE857A6C677C0E04A9B81E9D88076167EF3CB8041B65A1756850C2C667F2C6F5D6700F868A1518FD192B3C1915F19D119B2CF4588BD043ED3443982768B641FED8E2BF8E85BAC97A82808450DCCD35B5ED09E089AA04226A7710E20D5C00AED1CBAA176D93E1FEA308B4763F0FE9456E11F645A06D22A33EEA1931104605F280C7C5630548F3D35F6DBEDC8133FDC184F95D43B7D865EEF1E78A952BE3F098328A863447E2EBB726F3AB543F686CBD8BF8F9E780166758B495B7B75066E4B1987002422692D981F137F
+20171129085925 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851948CD513EF
+20171129090650 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851948E0DB457
+20171129090703 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851948E0E411B
+20171129091339 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851948F218A93
+20171129092140 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519490711E0F
+20171129092229 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194908BB287
+20171129092532 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519491098743
+20171129092609 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194911B52CF
+20171129092912 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519491979D17
+20171129093038 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519491CBE28B
+20171129093318 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519492326CF7
+20171129093513 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194927B907B
+20171129093638 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519492B0BBB7
+20171129094059 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519493646CBB
+20171129094240 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194939F7823
+20171129094307 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519493AB8EBB
+20171129094439 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519493E34B3F
+20171129094532 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519493FF8E7F
+20171129094653 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519494307873
+20171129094922 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519494921E2F
+20171129094940 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949496EE1B
+20171129095758 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519495F23CAF
+20171129100214 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194969CC5B7
+20171129101245 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519498540453
+20171129101539 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519498C81ACB
+20171129101618 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519498DC4FEB
+20171129101802 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194991CB3FB
+20171129102023 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194997603BB
+20171129102105 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD606275579785194998A9683
+20171129102314 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD60627557978519499DEC1C7
+20171129102700 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949A7663FF
+20171129102831 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949AADA95B
+20171129103048 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949B0592FB
+20171129103239 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949B4D9C73
+20171129103850 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949C57B5F7
+20171129104512 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949D60C7AB
+20171129105020 2 6 100 3071 2 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949E393D6B
+20171129105252 2 6 100 3071 5 E5B2496BAE5BB80230B69F3FCDC4E4D64BEFCD390B3D2F4A774F3ED4CBDB333B81930CBAF737164C13615CC0BE2EC320E34B8312ADCAA5D9644C0F054DD446C6299262BC184374B516DE3613628A8FB2606ECBCCE08BEE2ABE5D4B7B4CED22910635B723FFDC9381C8F87D0A471F935B62AF4CBEA3C329DF758BEE99F07C33AD6499CDCDDD64E3105F689C831D566296C978F27F0DB2F44389D9E0256790A0E4976FE38192C4BCB20FAF5853ED8AB04B16FFA478AB5945A3E98B12D014509039AB2F05629C48CA9E2272F71AE6AF07E7FBD92CD944A656731FB783E8EB38DF15630CA074D8CB41ECE91AA8A0D756690813C1DDFBE58CCCE7A50F4C83479C85B11908F80768F76F2FB8870B70F498F3235A044A80F32CE9AA9C613CD611D8CDD3CFD3F6A033F1764CD3029AD5435525D8BDD1B45100D61986BF8DBD8290AEC82FE15DBBBF00850AE58137383EEAFF9C9EDEDF8CCD42840E5D57C006F37AA3493FBA1E1719C7BDFC5EE22275A4D0415FD0DAB28E5CD6062755797851949E9CF297
+20171129114245 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC980424F9ADB
+20171129114850 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC98042BB88F3
+20171129121702 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC98044D9C36B
+20171129124238 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC98046CAF153
+20171129125253 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC980478C8AA3
+20171129130704 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC980489794E7
+20171129133140 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9804A64C06B
+20171129140253 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9804C68CB3F
+20171129144402 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9804F74F3CB
+20171129145354 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC980502DC987
+20171129150624 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805112DBB3
+20171129150654 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805113FE53
+20171129151512 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC98051AA1CA7
+20171129153640 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805342345F
+20171129160526 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC980555FD073
+20171129163211 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC980575A8F7B
+20171129165338 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC98058EDA363
+20171129171055 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC98059F788C7
+20171129171346 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805A15681B
+20171129171648 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805A3C890F
+20171129173802 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805B983947
+20171129174541 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805C1B745B
+20171129182644 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805EF8CFA7
+20171129183105 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805F423DD7
+20171129183151 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805F48127B
+20171129183501 2 6 100 4095 2 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC9805F7A0D7B
+20171129184425 2 6 100 4095 5 FADF655A8C18F13858C1C774D0060DD6FF25EAC29084E6A0A1E0D1218FD17F8800F697434FF377BC9ACB86AB48BDC139C51630956017D96CB0CC5C2D22604CABCBA881260B3A1F00A9F328DE35AC41638728AE65A1829F90AEE08237C971608AB5A7F3B50C53B3313FD68C774AAE29BCC1DA02BE0766D62DDE586169BAACB485CADC4F16EA0648E67D4D0F8DEFD9CCA4CC2B4000CD0C6372205F97C78F270F7E75A18DE0D3C8A3A1C1C606337BF6BEC94DD93D2646462E5F23AA4C292C00761D06FE220616A50C042A39351EBB2373EF21A35D5279D82E78B016A538B99CC166A148BABD91BCBE318A7987A5DA51B8B72D038F2D77668D48150A25ADC84018ADC7F36563E82D9DAA3B04593A989F9F05BBC0183DCE1BF6D6E2F9E4EFD5B52DF56B20AC035E36D57DFE521E9B3D256DE7F55C78837C0F5036DEC0581DF76CE7990A87F25113148BA1FF3502D82FC127B8134D3573BB8711B7891EF0C56B5C95037C9FBA6698219D63F5244A2E5D3479D0887CF5296900A23B344F3D804DF82712ABBD8A42218943957FA29966DBDB3A829959D08588FB670EEA4BF17605F928391B6BD36239CBE217CE278D2068D845F0B619CE726F2E9CA46ECA76180A90FFFFFA400D8F2956F3801FAADC49D9B05A786CA5D860A9B3AF3521842AB2C8C67CF7C9D966863B61AB2AA02970BD03F828980FEADEE067C4E7448FADC980601F06C7
+20171129190009 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED907E91691F
+20171129190047 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED907E94D7B3
+20171129191357 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED907F80F827
+20171129191536 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED907F970063
+20171129201007 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9083AC9B87
+20171129202520 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9084C8A5FF
+20171129202732 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9084EB4BAF
+20171129203556 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9085801D57
+20171129204816 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908664D7C3
+20171129205307 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9086BA916B
+20171129211738 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9088852733
+20171129212245 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9088DFD4A3
+20171129212444 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9088FEF233
+20171129213520 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9089C4756B
+20171129214659 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908A9732EF
+20171129215106 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908ADCE773
+20171129215630 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908B3A5BEF
+20171129220756 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908C0BB263
+20171129221730 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908CB5663B
+20171129223322 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908DDCC3A3
+20171129224236 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908E85C73B
+20171129224324 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908E8D9E2F
+20171129225233 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908F379CB3
+20171129225757 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED908F98DCDB
+20171129231535 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9090E1233F
+20171129232541 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED909198027B
+20171129233438 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED90923CF07B
+20171129233904 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED90928C0D7B
+20171129235019 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED90935B1963
+20171130000155 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED90942FB1FB
+20171130000803 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED90949B573B
+20171130003235 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED90966596E7
+20171130005040 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9097B63323
+20171130005620 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED909818E76F
+20171130012144 2 6 100 4095 5 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED9099F4FB5F
+20171130014001 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED909B4379EB
+20171130014931 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED909BF25ABB
+20171130015813 2 6 100 4095 2 D693DF66A6AA48BBECF942D3453355A19560938DE0A34C3E1158E5B9ECD70272CAE9686FAC4B6F64149C85607C158A67DB1C9B7FABD46379269492CB6B7E484D8AD4EA76D75EAD74F6A1E64D29206EC7BFF0630F3663C338039F8D10751AB8A177EEBB41E68434EAE03F7CA3761DE111900DC75F03209D8F6A92E178D94ADC7791D1BA55E7B6943A70D19957E348CA4B2407F89427D3B90979868732C69C221A3747ABCC7A9116D92237A1FDBE81E1ADDDA92F7FC0C15E7436B7C222E7759589919788B718B1F9F48356230B8F061F01FF21CD2DFEB2A1C744F8CBA3765364F1F417E105EDA7EB0ADBF1FD4CF4415B41CDA9BEF3CF6607A097EA2CFE32FA5376C01D1DF3B003FDEAE7571D0C54B5DED4DBBA2C753FB5ED889DD832085D75661CC762BBA28567CD080FB738B61C58ABF9962935C44322F1B96BEBEB594681CD2F20CA9F4D71C23D48E69725D37A4718924C4F145FBE0D841BE7C410A29C45810E240C319BADC04F990C4A84592FF925A73B6FE898F861B0E84D1146EB6856ADF066B11A0AE6915230F8A8E8234B33B5BAC1F3D1C3C05C8562DB51ACCAE2890C937F412D6E963C96965AA36350E8AB2901EE705B25407BC60711D9FC17E7885E5ED413ABBE2C207D55647F82C44367C13F489AD520A2A8FFA64C4F6EAF7AA816717F3019C6D240A4B9D788AFB73EA403523222D1E5940C47CAF304ED909C91146B
+20171130055239 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431DB8C972F
+20171130062757 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431DC5AB557
+20171130090503 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431E0222F57
+20171130104830 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431E2966E47
+20171130131919 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431E65A304B
+20171130151632 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431E9314BFB
+20171130154516 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431E9DF731F
+20171130170406 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431EBBC2FF3
+20171130200258 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431EFD0ED9B
+20171130222515 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431F32CBD03
+20171130230654 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431F4224A5B
+20171130235630 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431F549CCE3
+20171203125416 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431FC1A85BF
+20171203150512 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480431FF1C415F
+20171203162042 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF48043200E63AC7
+20171203162245 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF48043200EA5A8B
+20171203172127 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804320235B727
+20171203181636 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804320364E433
+20171203183124 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF48043203B31AB7
+20171203185109 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF48043204236403
+20171203190034 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804320453C2BF
+20171203192853 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF48043204F5D0C3
+20171203234953 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804320B184C73
+20171204012939 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804320D6A5B1F
+20171204015042 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804320DDD6F5B
+20171204040850 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480432110E46BF
+20171204060221 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF480432139A662F
+20171204093759 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF48043218861E53
+20171204110909 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804321AA18B6B
+20171204112744 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804321B0A25B3
+20171204113618 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804321B357127
+20171204120614 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804321BE218DB
+20171204122520 2 6 100 6143 2 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804321C47FCD3
+20171204125750 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804321CFEB977
+20171204133934 2 6 100 6143 5 F2F9DF4571769305CF3128D1F3B27E0B51064C0D70472B4B834907A11B6C76DAA091DDD058F56E7E5A1A144CBAD246C592ADB38DB36673E636E06043CF3776DE42B2A3C52B29A5378A538205F863CBCE489A9D26209B2679B7C10179193C7B50CC806D8FEA57F761D54F010EDBDCBC7624B989AD0C894E9ABA77744E164CB92A615919DA4E66C41F0D7DE03C2C8C89077E8E712CB867993110D1DAC8F8CC87AEC5F98E0A46D2DA94727D432D4406AE31F8FB2B9DAD9E882994E41FA2B46D364B416F05BE0D579DC31D0ABD89EBA6789835C4B4CE6B8F0E9C19E2B99BBB55211D9392F18A210686F487C38F6ED33CAFA7F2468B423CC7F36DE73655CE7B94D681409616C94E55B31AB6DC3422956DB8F00490A539D95F1BF4965340CB90B5BA03104F643F96B9ABDCB5D34920E4E675DBAB81C038C11AB28459E1F10F15EBE9C21BA47427C72C2960DD8763BFCE27D47C4A06B24EBD911DED8A0ADE710930F87132830B1B8E0675447A48E519FB18FD66D4012DE35E03533CB9C13B7D19823092F7F0D9C0E5C0EF7BCF9017817CEBB550168BB846E91AA5FFF1E44B7F42215890A26157EFA5647AF412924BFC0F6CD278261BA1F959AE90F165DB11AD56CEB5223AF8BCCD5760AAB2ED5F11C56B517FFBC96B178E46EF11E7A4E8209C1CA887218600B8B20FAA80AA0B00816969A0AE25807374C24566AC03F8DFB417D0C3E43AC9BDA056AD0562A28C9F7C5EEC7AC847699170668113DF07F22A875C40D570B8CCF09EE00D91B9841A7D10F1763EE48C0BABA0F76EAD940AB5FB376C685E2EF4A81717F8ACDA8ED205FB819E62598FB343451EE47D73B9541D9F8FB6DF4029FC8FCEC0F5B94258DB49B39717B0FEB5DB3BA8FB1D28F4FE0319F84111BE08E9D251791A0A1809B55C307B0D337923EDB8CA4F2018DE38A3B7AADDFB938D93C4F3F287DBFDD542D11C747A319AAA9CA8446EA4D5A3B8B91B48B850009A9353596F2352839D55FD45F442272123402D58C80411E5113C50E35D28EDAD3C7271E9ABB4E7152C70B306571433323661D4D12B2FAB10304F721B07FF4804321DF18F77
+20171204174709 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7517467E2B
+20171204175707 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE75177CF673
+20171204201457 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE751ADCB617
+20171205043550 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE752748419B
+20171205051645 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7528400323
+20171205062021 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7529BA43F7
+20171205073410 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE752B7A9EB3
+20171205074444 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE752BB3FF13
+20171205101150 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE752F440E8B
+20171205115054 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7531576573
+20171205121540 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7531E8F173
+20171205130945 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE75332BD36B
+20171205141051 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE753499FF7B
+20171205144900 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE75357B36FB
+20171205154530 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7536CFC643
+20171205175129 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE75398C8CC3
+20171205180055 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7539B7B69B
+20171205191334 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE753B4A4AD3
+20171205223915 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE754018391B
+20171206002554 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE75429F0B5F
+20171206024048 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7545C299D7
+20171206032820 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7546E1FE43
+20171206033917 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE75471CD4D7
+20171206045008 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7548C1EC97
+20171206052722 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7549823083
+20171206065709 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE754B6C9C7F
+20171206083216 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE754D96E15F
+20171206085625 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE754E17B6B7
+20171206134251 2 6 100 6143 2 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7554BF8FF3
+20171206161018 2 6 100 6143 5 EF730E8C844746DF23D55A6C9508EF59F158850FF4A3A24B3E29C95547FE16E3C3F7269D4096406935222EDC51BFDFE89B454D8C02F868FB297A1FBFEB61A5392779A6C51AF8F9068CC579276D045FF317D9B7540D9A39FA936004991CB06BA169012F75BAF0B8D6203470AF1BE5569341E462DF72FF4AFD9C24BCB7584C71C1766DFDD74FE13D98C176DC64979F4720C0A996226948C9DE5E1890C2E703168AB3B33D50C395F13CDE094300C4BB0ED86352950C238DDEB1A8412A2409B6C487F9CBBB110A754A7B4985CF55DE4FC5137CDF13F9B0E10768DF0A28D6628DFEC684A25439E5C943718E4E4CFC89A3DCE1B747F77A0CE08B98AC92705E8DD3A6EDD18FAEA2FBB4988C3CC947C8206DD67CF44BEF69B617E781E93501877F81E4CC2263DB0B5EEEFFF3FCFCD2AB6E34B724D755A9D5025C978AA679D806318EF9F81787D3C69FB2D25B0382A3A96F44216791D41CCC3DF04EBD19B84858F0935C1C774F4685C8114EBCA8C71946C35CB42B82AD56541E3B4AB0A47E0AD8FCF9073BCFB801EA84DDF5DF4426578561BC737C2469B34F275502BC0BD7AB018506FD8DD6A9477F1588C2F76FD82B2AD3740E7F161632C66B961737EB70E9B44F362F73C1F874F7C06C5370297E975D25E004D6090BD119915694AFB57427DDE7F50C81B9A1812E10FA39A01E2F2FF18C96FADEA62BF08FAB027A31D84E4C0267AF7E880B5A0608683542E9895DB15FA1ADA9F1D28569C8E27662CE912CD1869227F542C1F228C6A2226D4AC24673994AA453BF21A1961D17C7E29B297E8AF7A71C4E2957A603900A3B4947B7B59A70767EB9106C043A48EEFAC3CCDC0F78F559CDBE64328E3C21D33D30E6AAFF638761F988CD99C59ECBAC4276ACE22062F6903B4B78B45917829AAA0CF11D04272EB44385A3479AD7B6E3E94126CC35AE082A73AAE991670C5145576789B43055B5F9D457523B16032CC65B679BD5AA08657D719EAC3D0345812BFA599249E4719AA2DF1507916FA735535781F053C4CB92D28007CC8D621E571E957AED705C2D11724E6D4A3BE268FDCCA230A1BE9EDE7558211DF7
+20171206195122 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634801E6B61B
+20171206235707 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A6348054D6277
+20171207033003 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634808323A27
+20171207054441 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634809E6C2F7
+20171207104116 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63480D5E19B3
+20171207110410 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63480DA1758F
+20171207170628 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634812866F03
+20171207183951 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634813B1BBCF
+20171207212011 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634815D9070F
+20171208005123 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A6348189250C7
+20171208011303 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634818D35CE3
+20171208021235 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63481996D303
+20171208133603 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634822901357
+20171208151649 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634823DEBFBB
+20171208175501 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634825D190FB
+20171208193058 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634826F30FB7
+20171209011341 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63482B5BD51B
+20171209030814 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63482CD52277
+20171209040411 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63482D874DDB
+20171209121718 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634833C845DB
+20171209182655 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A6348386E2CD7
+20171209190603 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634838DD3487
+20171209234111 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63483C59DD8B
+20171210084529 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A6348432B34CB
+20171210100748 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63484426B89F
+20171211113225 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634856D74BDF
+20171211183528 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63485BE7C88F
+20171211220143 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63485E59F1D3
+20171212002701 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A634860299B67
+20171212043247 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A6348632526BF
+20171212143825 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63486A53EDEF
+20171212144749 2 6 100 7679 2 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63486A6818FB
+20171212180038 2 6 100 7679 5 CF96EF3064F3389AC4D7DA6813F67988F77979BB89C86E3A82B8FBE165D96646B6665C28FE7F5D1742E288AF6A47CEAD57277CF7B7902B8B7F899CB512DDF0EDEC293B152ABA4085290AE8BF93AF988437B549319AF0E18E39805C80A4714E4108DC29DDF708365B8FAC1F220784A8AA89F4C04176DFCEFC652988A6F878937AF8FEFF6A45672DB27EC215CDCBB9C530BDC2F1F357DC69073AA6B3670B988F271386E1B2F72635AA83420CF2A393338D1C4E2B502C11CA2098481EA292ACD7A7BFF84945E9CC04B47B1967F09CC7A4BE5AAA749583318E561E5504F28472B0AEF60B854142AACFE6017786E8B5FB674C79D68B7B44842F18E2075B8679A99D43892847B09A0CADFBED479942F599A1666D96EEED85A222431F8637D6FB73F5E08465417DAAA47BD31BDCE2262E06E0B7E5BF6FA9703890997C275CE11CA52A92D0F4889F370164D4EFA8C461E2F3BBABA54F8A1DD165C3D5344DF572B67EF92DC3E8EF66926B673AD59FB5CE5FF5ECED31535CC347374D846F0373EDD82DEFAF4DEEF238A1ABFF44FDC2D9511E8AE69349B69749DD6D2AD5A2A95F579B3A0D232FAB4A915568409150F184F1F58114354235084F9B104F9DA8EC13D34AB93BD61620CC0B93118FF2299B80856CE2A40792F58E37990677E1C4A662D619F835DA5537873CDF05DCDB369AEB2E6159E351E9140DDD5E4FB57EAAD9CB5A41EAC61CD1E95D983832D0E8D35EEFF88E699A33A4AB0FC82B8A1B38F527933108FCC6533C9DE3AFCAE396246399DB878A9D500905A707B3C1F3F490E327A5C219151E7077C9E456F3DD046F6FAC8C3F98CC90FC558E87A7CB654320DA2B48F41BE0D8498A98DF562EE0A33FF61AF92E90DABA5323CF416C7E3B5E0A5190A36442F08AEE80B4886C407A689A81293D7CF6D7F88C112F7D166D4AE27147BCDC4C91E2880F5A4065B0AC7480BCDB9A0BCB790FDDF0370DF819986DA21FE700E15D449F5C0849B70C8A84569F205D74141F87B73D2EE3BB4D7A88F2DC90272219E39B5456F5CE8F0DA1E40E98C1B968112DC3664663B3C2A2B1402657CC0529AD6CED5BD2A177F9ED6FDA41378C8ADA6F33615516CFE0077E9426424F06DF517A5117F2882FFE3144245623DF8DDEF9869E5F6D328884018885209EA24F7F617837E7751D56EF3201D3FD607706B889728591E7C822ED97FF0B9DC111D5D0142387D88CB799345EF48235922632D6610F9E1C7AAAB6368EC0D4A76185686FCDA99499DC1B7F08C8A1BDDEF3F803CF168D818CEAC1F8B79E70C49E37B3E19B0096D1B6C2D4BF73DBF503401AE4EFCF9DEB8AC4A9C39E140CA9086E9927274E2A63486CA4B787
+20171213010731 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F5561319BBF
+20171213020125 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F5561E7621B
+20171213022044 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F556220C81B
+20171213024903 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55627C3CE7
+20171213030139 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F5562A0B013
+20171213055041 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F5564BC168F
+20171213060909 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F5564E9CBA3
+20171213072312 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F5565D64617
+20171214093125 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F557B083E83
+20171214095927 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F557B5C6367
+20171214222602 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F5585408053
+20171214233609 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55862A758B
+20171215214134 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F559742D26B
+20171216043116 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F559C858AD7
+20171216061211 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F559DBA299F
+20171216061646 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F559DBFD57B
+20171216094255 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55A0524813
+20171216110833 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55A15D5D1F
+20171216171002 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55A5EC1993
+20171216211154 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55A8EA2ED7
+20171217022713 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55ACD2DE8F
+20171217032242 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55AD80002F
+20171217074522 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55B0B564D7
+20171217095738 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55B254E7FB
+20171217120716 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55B3EDC9EB
+20171217153508 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55B680123B
+20171217162942 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55B727103B
+20171218014406 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55BDE7E6A3
+20171218033011 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55BF2DBDBB
+20171218052822 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55C08EEBC7
+20171218071736 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55C1D36F8B
+20171218072625 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55C1E549DB
+20171218081603 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55C2747B77
+20171218163834 2 6 100 7679 5 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55C883ECE7
+20171218165317 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55C8AA3DD3
+20171218195505 2 6 100 7679 2 DC810DED621062F0CB271F50E716119CBA30A56C758377BD69D70043B8C9ACA2E7EFA9896D324B18FB1A550BDB994533A67258C7EB28B23D1AFB6D3FE0C5C8AD961F2BFAE67E57978F749D3F33A0D9AEAFD817FD663E60298D0DF73E4B27A85B6799D929240EC6C4C59E0D98E0A7875F3FCC3E29394083D1344F78DC70B5E23C108A03B7B81121BEDD2093262B7E32C7AB695AD545D3A99F410199DDD9759FE1EE8502180206841B3C74CB6A939B38707309B421A75FFEC30C977F91A9F9F3C9F65EF2EA6251E72F8A65C7753815C188320E91B079EDFB9F1D480F529B67075B57523C44895DE2427D32D3935EAC5F46659C5F723C9BB006862EF143A77C384560EB5474F8D034FC8059F6D7BCD9EBD17D2740741FB4025CF87FFE3DAAFF72C8D9D10E1F779AEC56D3C6340426E2D980EAA07C46F2E720D1B8206D2A29162C6CA877FA89C0876DA70FF3A773BDEE1BB5831EFB58A9191430B0DE46EA4F484642F257AC176B74A91A02594D00D2FD30BE4927DED30C4389245EC5ECA93B1B08AFBB86B8012394F8CB874DC092498A2F9B44E27804C039632A192C8329F0DF25B196E6AB5E07FB3732B94990A2F0490FB07D9E33B0AA2830EDB572D7C7968A193B83FF869F65ABEDEC65EB03EA6DF0CD6C077DE627FD3583AFDA1754E655BE7ECF7A2BEAA422E516B26194FAEFEE6F535439B413325E1263E7E797DE9D717540A96AF360F8EE1FD4B190A513E83AEF6BCAB5A245F4A4F129F5F8AED11A558FE968A0CF2E254438384D0EE91BEE99A39696821DBA585144FA65484897CFC517FCE1D1512F792C6996063585F640AC9480220ED1FF3EDC1D7E55344977F71692D6F5DB091821A3F9612B65138848B874A93A71A74039337BF291938B0A8ACA2141BE969DCE4322A276C86C5A8E369EF6717158B46EBE48F8F9BC4F2E46203AC21CDD9F0ED1989F7D964D46D7DA63444C9CADA82AF53E38873A5D3F68868CA4F65748210716658F2A841B3890E773A2623A59073F14A0F2F1B0893FDBE5BA72FC9609DB8E8A56A322E2B4178CE7B2022D741BD256303D926B48D5239B354F611C52B475C62351854D6E27C89231E7E7972C19C7D6F5BEB07D1A1FF827348DA862F422047A2DB7B591AE497578A4BA95CBECFB503F5DC04C0C6A946FFB515F2F0BDC4332F2674706F7C1908B681D8EE3667777092C06DC9CF00F98143F4A1350FCBAEBB5157A5473D33F51778987B35B1D48249A491EE8F8778DE6DC29131F708642884BED0B0D159E1EFE428D18D3631F13A593323F1659FE9E1A708115D2F131DCC3808CE016036FF1D0D9193CBEB2CD1C49F9973E0BCB09A2A9394E2F55CABFB253
+20171219124324 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203ABF9DA753
+20171220012557 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203AC87B0257
+20171220113159 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203ACF6BF797
+20171220172848 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203AD382D913
+20171220184955 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203AD4620FCF
+20171220232754 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203AD788C3AF
+20171221050933 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203ADADA05AF
+20171221135413 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203AE091EA4F
+20171221220649 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203AE5EFB017
+20171223020323 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203AF8256AAB
+20171223193520 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B035D92A3
+20171223214753 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B04C1A663
+20171224021554 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B078E9D33
+20171224034823 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B087DB16B
+20171224121415 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B0DB70677
+20171224130232 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B0E3090C7
+20171224135245 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B0EAF8073
+20171224212046 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B133C2B4F
+20171224212702 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B13441743
+20171225003349 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B152CE5AB
+20171225004348 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B153F6807
+20171225041057 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B176011EF
+20171225091911 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B1A71C743
+20171225162026 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B1EB91123
+20171225192243 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B20715EBB
+20171225215524 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B21F31B1B
+20171226063458 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B272E398F
+20171226064036 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B27337437
+20171226213456 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B302C487F
+20171227055343 2 6 100 8191 5 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B35235327
+20171227125423 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B393B67F3
+20171227150248 2 6 100 8191 2 EE490FB8716A6562BB33AA7C81BBFDCF2BC4C7257F68FC888B014D4D06FF9501EDEC5B4B462DBA35A9C6E541F218CB4A44F6F9FC88F4B4CC522803FA78E320467D89DC594A89B9718278C390023E9A367EDC39614216835EC52511F0ABAD50A37B742603D8ECA51491AC9A0F61B8A0AE8C09831869F2BF140277A0DA761C57856191FB3D6BCA46D51AC32A52FA6012B8AF5531F1E361751EC530B502B9001CAD88C0E921D4F809CA97C06278C0503B17BAE6B082168C34AB558BAC649EC3A69D2D136804E89B4FC952AF03C5056A6CA50D130934CBA7FA852BB950328E6BA2BFCF86C7319C96E5AC7172B03A000D678E4734BF756645816DCFA5710D65F77B994C1D12000502CC31478258694CFEE378707F7111E7337A0EBBD8EA3E91459AEB73B310DEE37464DF317FB6BBBD6A4DB32B505F7F6D0D5A6C8BE439514BAA032CB41864647F64F18B414BA2A2BF7AEF787D1F84B2EFDF5935857C9A6167CA426109FEBA69EE58FEF126F3F98FBC46570EF50DD3F502044DBD580E5DCFD214DA8788B7104D4A77C4006AC153E704B395F061118D5898155A7BC758C13D6D9B381F40B1998FFBB520D78110956D7E01EB07F2AA4CE132C3CDE594E3FEF45F2FD2C6B8B2C75B8C232DEC3C82BDF494E846D8AD466F8F234FE2698C90B203C989F9EBE77DF2126CE4C765E19BCBC628F6B70FFEE9214B88E27CF989939EF396D513BDD2CA737EDB8C6845E5883D283445F3FB8F662F0CFC29F405A592C8C0D68575361B09BA4D1398D61B552D239F897D84B8D46A6E1B113D76AE9BABA8D5617B3ACC1A8F4AFBA8597BA96CF872A5AE48BE79A44771937D01D0EF76C99C1C99C7EE94DBDFE3FBA41B69DEC9F4B1858E3D4F488CAEA52692C9334ADB39A8FEDC815A1E4D7057AE7CF4BD2A67B02141F98306D4A67C759414F03AE3A9D2C0F1090B29C8833E3500ED05FF6175D29408D8DB6D0651AFC77142FA7F44114274C0575B4F2EAF27714B56F450DE6F02423B4BEDC090E91ECD92F5DF5B9D053E095149B069FB60D51BB700A188EABD493773B7BEBA99CA21E981BF14188926E5F2DB6348B8E85AE4E2D498F116C9A240567F71B9D86B8173A42BA29100F02322DE24241DF8333F7A7A2A8C71513B734BC7E35D25F469B27F9B0883E1B62E1C4FC60FC6EB4A1E9B1AD1DD26A8D64D27944577E8ABE51EA225B0FFE27B5592D6EA5FBAA81BE6E3657FBBE67D359D0D18622545E8C1093D542F31FEBD00E0C687BB66D6F4E8F3FA0AD435F303F1108CE3604FF199E5DBF7E7309EBECA4ADB0F2AED26B87E7B50C23F0AA8370EEABFEEF273B64EFAD3167D78689907C500FAB9AC160968BA738AC40B23F50BEAD01C6343D7B7190034C79FFDD250938A84E499D5583F5213287F495DF9008DB8A9A51DFEA454A8215683A53A6A5CE5BFDA0D827704203B3A81A89B
+20171227165129 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C3FF14E17B
+20171227193939 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C400F55F3F
+20171228032103 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4065CE64B
+20171228115824 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C40C43BAB7
+20171228124603 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C40CCD6483
+20171228164850 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C40F99437B
+20171228210323 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4126F1FDB
+20171229030717 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4169A7847
+20171229061209 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4189CEBF3
+20171229071940 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C419560A6F
+20171229082351 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C41A003293
+20171229091948 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C41A97B0B3
+20171229152509 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C41EA78513
+20171229193934 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4216FDF1B
+20171230082815 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C429E6D743
+20171230095722 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C42ADAFEC3
+20171231000503 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4341E820B
+20171231123324 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C43C20726B
+20171231133810 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C43CC9B38F
+20180101034650 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C445D1D6AF
+20180102021859 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C453E3A923
+20180102095212 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4589223B3
+20180102194603 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C45EA32E73
+20180102224522 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4606F2AEB
+20180103002357 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4617220D3
+20180103011455 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C461EEC227
+20180103044126 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4640ADAFF
+20180103102958 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C4678F8743
+20180103153131 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C46AA4F9DF
+20180103175311 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C46C14249B
+20180103210214 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C46DF36E37
+20180103214256 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C46E5524BB
+20180103224847 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C46EF5AD73
+20180104072036 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C473F7759B
+20180104112937 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C47658C257
+20180104122132 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C476D82313
+20180104192013 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C47AEEE017
+20180104234458 2 6 100 8191 2 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C47D812CC3
+20180105001530 2 6 100 8191 5 F461D7B72CCE12BB489DFEBB0D3252492FB894ADE7EEFCA4FCEAE71B2078652882837E3DDE311BA08D03316DDE3C3C844C34F37E7536601A57C95E1D191CC3B603E15D0E27D99ECC6B7781424F1D40E39FFF25D3F99C207359AD00CB7A68DC0937FDC38F24EF6C095DA60D92F977FBE8674D9885C4F147D6B6114F1CAF9F56327EF2A9CF30C5A26F46E19FAFACF357EC4E9119FB4AC34FF97FE5CDA2D578E00DF294AC88305AA8C9CFA074F35A211DD176486BBFDF04269B47C1EECAA0FAD95F6A5D829770F73DE8AF9D45928E4BF4C71412821419E2AFB2DA29FAA42557CB595B75433FDF015E42853C784AC8A15857D494900319D36B3A6672B885B686D6498D50A7843D381D240A77C053853FBFC670687678EA7AA909F9D82D2363ABD4851E3D20CE16632E0B1522AAB5DB8BB53AA1EE8CDFE86A494D1C2405C5AAE058D1990C91607D8043A74453AFB650110CA784BA307E531B153537B2C0A888D75229CC1D3CD27B0D7A6BEE20E82B7EB912D9F36BC8630990003DE2494DE017CB9D0EDBA7F0785927E79A76DA00707ADA18B9EBC57930E36E76737A7BA31F8F36F11D8CEDDCE28A411EEB34CE5D5235E88F66089F59CD921A84789512947DFDC8247A68353D05BEAFA6E450D7211D8BABE3C4C63685E9FA7742BD6309F3D72B9BE5E1B84E534596A81DAF1F5483C001FED71A9C7E432A28E52E43D9A0D4D4607B5E3459C7D424925C34311958344EBB86AF4E02675F8701BD55AACE3DDF48980E1977EE44275BEEE341C090820A63FD317595D7A0CCD00609B49E4AAF8C744F2FEA35A806B9B79C519CCDCE59F225FA243FD1AD0C8DBAFA17291CCA0C0C4DAB68060205F72978A5879093A132BE80C061D33348D94A8C79AE86F637701FC44E795B0F15D4610E0B269DEC7B24F717A7284A521759894AE475E7E35472ABC8C82DADE518628FF0DD37B48D94D48C18BF686F509AE5A5C35CC7BC33861673166B743FE10EB6508D36B29D1C798210E3D1840418A67214F9DB6FAF60BB42329226517C202436F735C1D326B49E1A37FF80BA4599A55898A48A2967647EA5E48B88F8034C7BBE9AFC1CD8DCC986495AB7070346E83479BC23925D418A68C7D72B4BCC106FEE74532F70F3CA019C68D419E944C34A69DAC2CDA1155F4FCDEC53CFB3AED1FE07C58FD20D673CE274AC89AEB3D72C36C2D81B42A5F9A61A83FB748749FDA5598C5A519A3026B1475F61CA5DE7A77BE86C2DC6EBAA6F756D5C15AF0F0844C05F233A0468148956C0BA80ACDCB7850FE0CBE75DB675AB712ADBF0934765919A697F4C4345E2AD63B159664FE0DB201683C8DFBBDB1EFE3B580C11809AC815C1863929E60B7A0819D255C8EE7AA582C33E0153EB685E830627829C141DF8B5C599D9DDD25CB3EFAD7C4369A470D3AE3CF4CD0CDCB185A402F7C3E395C47DC6C2E7
diff --git a/moduli.c b/moduli.c
index e983b07..233cba8 100644
--- a/moduli.c
+++ b/moduli.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: moduli.c,v 1.31 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: moduli.c,v 1.32 2017/12/08 03:45:52 deraadt Exp $ */
 /*
  * Copyright 1994 Phil Karn <karn@qualcomm.com>
  * Copyright 1996-1998, 2003 William Allen Simpson <wsimpson@greendragon.com>
@@ -412,8 +412,8 @@
 
 	time(&time_stop);
 
-	logit("%.24s Sieved with %u small primes in %ld seconds",
-	    ctime(&time_stop), largetries, (long) (time_stop - time_start));
+	logit("%.24s Sieved with %u small primes in %lld seconds",
+	    ctime(&time_stop), largetries, (long long)(time_stop - time_start));
 
 	for (j = r = 0; j < largebits; j++) {
 		if (BIT_TEST(LargeSieve, j))
diff --git a/monitor.c b/monitor.c
index 96d22b7..d4b4b04 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor.c,v 1.167 2017/02/03 23:05:57 djm Exp $ */
+/* $OpenBSD: monitor.c,v 1.186 2018/07/20 03:46:34 djm Exp $ */
 /*
  * Copyright 2002 Niels Provos <provos@citi.umich.edu>
  * Copyright 2002 Markus Friedl <markus@openbsd.org>
@@ -56,10 +56,6 @@
 # endif
 #endif
 
-#ifdef SKEY
-#include <skey.h>
-#endif
-
 #ifdef WITH_OPENSSL
 #include <openssl/dh.h>
 #endif
@@ -68,21 +64,14 @@
 #include "atomicio.h"
 #include "xmalloc.h"
 #include "ssh.h"
-#include "key.h"
-#include "buffer.h"
+#include "sshkey.h"
+#include "sshbuf.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "cipher.h"
 #include "kex.h"
 #include "dh.h"
 #include "auth-pam.h"
-#ifdef TARGET_OS_MAC	/* XXX Broken krb5 headers on Mac */
-#undef TARGET_OS_MAC
-#include "zlib.h"
-#define TARGET_OS_MAC 1
-#else
-#include "zlib.h"
-#endif
 #include "packet.h"
 #include "auth-options.h"
 #include "sshpty.h"
@@ -113,55 +102,52 @@
 extern ServerOptions options;
 extern u_int utmp_len;
 extern u_char session_id[];
-extern Buffer auth_debug;
-extern int auth_debug_init;
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
+extern struct sshauthopt *auth_opts; /* XXX move to permanent ssh->authctxt? */
 
 /* State exported from the child */
 static struct sshbuf *child_state;
 
 /* Functions on the monitor that answer unprivileged requests */
 
-int mm_answer_moduli(int, Buffer *);
-int mm_answer_sign(int, Buffer *);
-int mm_answer_pwnamallow(int, Buffer *);
-int mm_answer_auth2_read_banner(int, Buffer *);
-int mm_answer_authserv(int, Buffer *);
-int mm_answer_authpassword(int, Buffer *);
-int mm_answer_bsdauthquery(int, Buffer *);
-int mm_answer_bsdauthrespond(int, Buffer *);
-int mm_answer_skeyquery(int, Buffer *);
-int mm_answer_skeyrespond(int, Buffer *);
-int mm_answer_keyallowed(int, Buffer *);
-int mm_answer_keyverify(int, Buffer *);
-int mm_answer_pty(int, Buffer *);
-int mm_answer_pty_cleanup(int, Buffer *);
-int mm_answer_term(int, Buffer *);
-int mm_answer_rsa_keyallowed(int, Buffer *);
-int mm_answer_rsa_challenge(int, Buffer *);
-int mm_answer_rsa_response(int, Buffer *);
-int mm_answer_sesskey(int, Buffer *);
-int mm_answer_sessid(int, Buffer *);
+int mm_answer_moduli(int, struct sshbuf *);
+int mm_answer_sign(int, struct sshbuf *);
+int mm_answer_pwnamallow(int, struct sshbuf *);
+int mm_answer_auth2_read_banner(int, struct sshbuf *);
+int mm_answer_authserv(int, struct sshbuf *);
+int mm_answer_authpassword(int, struct sshbuf *);
+int mm_answer_bsdauthquery(int, struct sshbuf *);
+int mm_answer_bsdauthrespond(int, struct sshbuf *);
+int mm_answer_keyallowed(int, struct sshbuf *);
+int mm_answer_keyverify(int, struct sshbuf *);
+int mm_answer_pty(int, struct sshbuf *);
+int mm_answer_pty_cleanup(int, struct sshbuf *);
+int mm_answer_term(int, struct sshbuf *);
+int mm_answer_rsa_keyallowed(int, struct sshbuf *);
+int mm_answer_rsa_challenge(int, struct sshbuf *);
+int mm_answer_rsa_response(int, struct sshbuf *);
+int mm_answer_sesskey(int, struct sshbuf *);
+int mm_answer_sessid(int, struct sshbuf *);
 
 #ifdef USE_PAM
-int mm_answer_pam_start(int, Buffer *);
-int mm_answer_pam_account(int, Buffer *);
-int mm_answer_pam_init_ctx(int, Buffer *);
-int mm_answer_pam_query(int, Buffer *);
-int mm_answer_pam_respond(int, Buffer *);
-int mm_answer_pam_free_ctx(int, Buffer *);
+int mm_answer_pam_start(int, struct sshbuf *);
+int mm_answer_pam_account(int, struct sshbuf *);
+int mm_answer_pam_init_ctx(int, struct sshbuf *);
+int mm_answer_pam_query(int, struct sshbuf *);
+int mm_answer_pam_respond(int, struct sshbuf *);
+int mm_answer_pam_free_ctx(int, struct sshbuf *);
 #endif
 
 #ifdef GSSAPI
-int mm_answer_gss_setup_ctx(int, Buffer *);
-int mm_answer_gss_accept_ctx(int, Buffer *);
-int mm_answer_gss_userok(int, Buffer *);
-int mm_answer_gss_checkmic(int, Buffer *);
+int mm_answer_gss_setup_ctx(int, struct sshbuf *);
+int mm_answer_gss_accept_ctx(int, struct sshbuf *);
+int mm_answer_gss_userok(int, struct sshbuf *);
+int mm_answer_gss_checkmic(int, struct sshbuf *);
 #endif
 
 #ifdef SSH_AUDIT_EVENTS
-int mm_answer_audit_event(int, Buffer *);
-int mm_answer_audit_command(int, Buffer *);
+int mm_answer_audit_event(int, struct sshbuf *);
+int mm_answer_audit_command(int, struct sshbuf *);
 #endif
 
 static int monitor_read_log(struct monitor *);
@@ -170,8 +156,9 @@
 
 /* local state for key verify */
 static u_char *key_blob = NULL;
-static u_int key_bloblen = 0;
+static size_t key_bloblen = 0;
 static int key_blobtype = MM_NOKEY;
+static struct sshauthopt *key_opts = NULL;
 static char *hostbased_cuser = NULL;
 static char *hostbased_chost = NULL;
 static char *auth_method = "unknown";
@@ -183,7 +170,7 @@
 struct mon_table {
 	enum monitor_reqtype type;
 	int flags;
-	int (*f)(int, Buffer *);
+	int (*f)(int, struct sshbuf *);
 };
 
 #define MON_ISAUTH	0x0004	/* Required for Authentication */
@@ -219,10 +206,6 @@
     {MONITOR_REQ_BSDAUTHQUERY, MON_ISAUTH, mm_answer_bsdauthquery},
     {MONITOR_REQ_BSDAUTHRESPOND, MON_AUTH, mm_answer_bsdauthrespond},
 #endif
-#ifdef SKEY
-    {MONITOR_REQ_SKEYQUERY, MON_ISAUTH, mm_answer_skeyquery},
-    {MONITOR_REQ_SKEYRESPOND, MON_AUTH, mm_answer_skeyrespond},
-#endif
     {MONITOR_REQ_KEYALLOWED, MON_ISAUTH, mm_answer_keyallowed},
     {MONITOR_REQ_KEYVERIFY, MON_AUTH, mm_answer_keyverify},
 #ifdef GSSAPI
@@ -252,7 +235,6 @@
 struct mon_table *mon_dispatch;
 
 /* Specifies if a certain message is allowed at the moment */
-
 static void
 monitor_permit(struct mon_table *ent, enum monitor_reqtype type, int permit)
 {
@@ -289,14 +271,17 @@
 
 	debug3("preauth child monitor started");
 
-	close(pmonitor->m_recvfd);
-	close(pmonitor->m_log_sendfd);
+	if (pmonitor->m_recvfd >= 0)
+		close(pmonitor->m_recvfd);
+	if (pmonitor->m_log_sendfd >= 0)
+		close(pmonitor->m_log_sendfd);
 	pmonitor->m_log_sendfd = pmonitor->m_recvfd = -1;
 
 	authctxt = _authctxt;
 	memset(authctxt, 0, sizeof(*authctxt));
+	ssh->authctxt = authctxt;
 
-	authctxt->loginmsg = &loginmsg;
+	authctxt->loginmsg = loginmsg;
 
 	mon_dispatch = mon_dispatch_proto20;
 	/* Permit requests for moduli and signatures */
@@ -308,6 +293,8 @@
 		partial = 0;
 		auth_method = "unknown";
 		auth_submethod = NULL;
+		auth2_authctxt_reset_info(authctxt);
+
 		authenticated = (monitor_read(pmonitor, mon_dispatch, &ent) == 1);
 
 		/* Special handling for multiple required authentications */
@@ -327,18 +314,21 @@
 				fatal("%s: unexpected authentication from %d",
 				    __func__, ent->type);
 			if (authctxt->pw->pw_uid == 0 &&
-			    !auth_root_allowed(auth_method))
+			    !auth_root_allowed(ssh, auth_method))
 				authenticated = 0;
 #ifdef USE_PAM
 			/* PAM needs to perform account checks after auth */
 			if (options.use_pam && authenticated) {
-				Buffer m;
+				struct sshbuf *m;
 
-				buffer_init(&m);
+				if ((m = sshbuf_new()) == NULL)
+					fatal("%s: sshbuf_new failed",
+					    __func__);
 				mm_request_receive_expect(pmonitor->m_sendfd,
-				    MONITOR_REQ_PAM_ACCOUNT, &m);
-				authenticated = mm_answer_pam_account(pmonitor->m_sendfd, &m);
-				buffer_free(&m);
+				    MONITOR_REQ_PAM_ACCOUNT, m);
+				authenticated = mm_answer_pam_account(
+				    pmonitor->m_sendfd, m);
+				sshbuf_free(m);
 			}
 #endif
 		}
@@ -347,6 +337,10 @@
 			    auth_method, auth_submethod);
 			if (!partial && !authenticated)
 				authctxt->failures++;
+			if (authenticated || partial) {
+				auth2_update_session_info(authctxt,
+				    auth_method, auth_submethod);
+			}
 		}
 	}
 
@@ -357,6 +351,7 @@
 
 	debug("%s: %s has been authenticated by privileged process",
 	    __func__, authctxt->user);
+	ssh->authctxt = NULL;
 	ssh_packet_set_log_preamble(ssh, "user %s", authctxt->user);
 
 	mm_get_keystate(pmonitor);
@@ -365,8 +360,10 @@
 	while (pmonitor->m_log_recvfd != -1 && monitor_read_log(pmonitor) == 0)
 		;
 
-	close(pmonitor->m_sendfd);
-	close(pmonitor->m_log_recvfd);
+	if (pmonitor->m_recvfd >= 0)
+		close(pmonitor->m_recvfd);
+	if (pmonitor->m_log_sendfd >= 0)
+		close(pmonitor->m_log_sendfd);
 	pmonitor->m_sendfd = pmonitor->m_log_recvfd = -1;
 }
 
@@ -403,7 +400,7 @@
 	monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1);
 	monitor_permit(mon_dispatch, MONITOR_REQ_TERM, 1);
 
-	if (!no_pty_flag) {
+	if (auth_opts->permit_pty_flag) {
 		monitor_permit(mon_dispatch, MONITOR_REQ_PTY, 1);
 		monitor_permit(mon_dispatch, MONITOR_REQ_PTYCLEANUP, 1);
 	}
@@ -415,18 +412,21 @@
 static int
 monitor_read_log(struct monitor *pmonitor)
 {
-	Buffer logmsg;
+	struct sshbuf *logmsg;
 	u_int len, level;
 	char *msg;
+	u_char *p;
+	int r;
 
-	buffer_init(&logmsg);
+	if ((logmsg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
 
 	/* Read length */
-	buffer_append_space(&logmsg, 4);
-	if (atomicio(read, pmonitor->m_log_recvfd,
-	    buffer_ptr(&logmsg), buffer_len(&logmsg)) != buffer_len(&logmsg)) {
+	if ((r = sshbuf_reserve(logmsg, 4, &p)) != 0)
+		fatal("%s: reserve: %s", __func__, ssh_err(r));
+	if (atomicio(read, pmonitor->m_log_recvfd, p, 4) != 4) {
 		if (errno == EPIPE) {
-			buffer_free(&logmsg);
+			sshbuf_free(logmsg);
 			debug("%s: child log fd closed", __func__);
 			close(pmonitor->m_log_recvfd);
 			pmonitor->m_log_recvfd = -1;
@@ -434,26 +434,28 @@
 		}
 		fatal("%s: log fd read: %s", __func__, strerror(errno));
 	}
-	len = buffer_get_int(&logmsg);
+	if ((r = sshbuf_get_u32(logmsg, &len)) != 0)
+		fatal("%s: get len: %s", __func__, ssh_err(r));
 	if (len <= 4 || len > 8192)
 		fatal("%s: invalid log message length %u", __func__, len);
 
 	/* Read severity, message */
-	buffer_clear(&logmsg);
-	buffer_append_space(&logmsg, len);
-	if (atomicio(read, pmonitor->m_log_recvfd,
-	    buffer_ptr(&logmsg), buffer_len(&logmsg)) != buffer_len(&logmsg))
+	sshbuf_reset(logmsg);
+	if ((r = sshbuf_reserve(logmsg, len, &p)) != 0)
+		fatal("%s: reserve: %s", __func__, ssh_err(r));
+	if (atomicio(read, pmonitor->m_log_recvfd, p, len) != len)
 		fatal("%s: log fd read: %s", __func__, strerror(errno));
+	if ((r = sshbuf_get_u32(logmsg, &level)) != 0 ||
+	    (r = sshbuf_get_cstring(logmsg, &msg, NULL)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
 
 	/* Log it */
-	level = buffer_get_int(&logmsg);
-	msg = buffer_get_string(&logmsg, NULL);
 	if (log_level_name(level) == NULL)
 		fatal("%s: invalid log level %u (corrupted message?)",
 		    __func__, level);
 	do_log2(level, "%s [preauth]", msg);
 
-	buffer_free(&logmsg);
+	sshbuf_free(logmsg);
 	free(msg);
 
 	return 0;
@@ -463,8 +465,8 @@
 monitor_read(struct monitor *pmonitor, struct mon_table *ent,
     struct mon_table **pent)
 {
-	Buffer m;
-	int ret;
+	struct sshbuf *m;
+	int r, ret;
 	u_char type;
 	struct pollfd pfd[2];
 
@@ -491,10 +493,12 @@
 			break;  /* Continues below */
 	}
 
-	buffer_init(&m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
 
-	mm_request_receive(pmonitor->m_sendfd, &m);
-	type = buffer_get_char(&m);
+	mm_request_receive(pmonitor->m_sendfd, m);
+	if ((r = sshbuf_get_u8(m, &type)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
 
 	debug3("%s: checking request %d", __func__, type);
 
@@ -508,8 +512,8 @@
 		if (!(ent->flags & MON_PERMIT))
 			fatal("%s: unpermitted request %d", __func__,
 			    type);
-		ret = (*ent->f)(pmonitor->m_sendfd, &m);
-		buffer_free(&m);
+		ret = (*ent->f)(pmonitor->m_sendfd, m);
+		sshbuf_free(m);
 
 		/* The child may use this request only once, disable it */
 		if (ent->flags & MON_ONCE) {
@@ -548,23 +552,27 @@
 	free(key_blob);
 	free(hostbased_cuser);
 	free(hostbased_chost);
+	sshauthopt_free(key_opts);
 	key_blob = NULL;
 	key_bloblen = 0;
 	key_blobtype = MM_NOKEY;
+	key_opts = NULL;
 	hostbased_cuser = NULL;
 	hostbased_chost = NULL;
 }
 
 #ifdef WITH_OPENSSL
 int
-mm_answer_moduli(int sock, Buffer *m)
+mm_answer_moduli(int sock, struct sshbuf *m)
 {
 	DH *dh;
-	int min, want, max;
+	int r;
+	u_int min, want, max;
 
-	min = buffer_get_int(m);
-	want = buffer_get_int(m);
-	max = buffer_get_int(m);
+	if ((r = sshbuf_get_u32(m, &min)) != 0 ||
+	    (r = sshbuf_get_u32(m, &want)) != 0 ||
+	    (r = sshbuf_get_u32(m, &max)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	debug3("%s: got parameters: %d %d %d",
 	    __func__, min, want, max);
@@ -573,17 +581,19 @@
 		fatal("%s: bad parameters: %d %d %d",
 		    __func__, min, want, max);
 
-	buffer_clear(m);
+	sshbuf_reset(m);
 
 	dh = choose_dh(min, want, max);
 	if (dh == NULL) {
-		buffer_put_char(m, 0);
+		if ((r = sshbuf_put_u8(m, 0)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		return (0);
 	} else {
 		/* Send first bignum */
-		buffer_put_char(m, 1);
-		buffer_put_bignum2(m, dh->p);
-		buffer_put_bignum2(m, dh->g);
+		if ((r = sshbuf_put_u8(m, 1)) != 0 ||
+		    (r = sshbuf_put_bignum2(m, dh->p)) != 0 ||
+		    (r = sshbuf_put_bignum2(m, dh->g)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 		DH_free(dh);
 	}
@@ -593,7 +603,7 @@
 #endif
 
 int
-mm_answer_sign(int sock, Buffer *m)
+mm_answer_sign(int sock, struct sshbuf *m)
 {
 	struct ssh *ssh = active_state; 	/* XXX */
 	extern int auth_sock;			/* XXX move to state struct? */
@@ -603,14 +613,15 @@
 	char *alg = NULL;
 	size_t datlen, siglen, alglen;
 	int r, is_proof = 0;
-	u_int keyid;
+	u_int keyid, compat;
 	const char proof_req[] = "hostkeys-prove-00@openssh.com";
 
 	debug3("%s", __func__);
 
 	if ((r = sshbuf_get_u32(m, &keyid)) != 0 ||
 	    (r = sshbuf_get_string(m, &p, &datlen)) != 0 ||
-	    (r = sshbuf_get_cstring(m, &alg, &alglen)) != 0)
+	    (r = sshbuf_get_cstring(m, &alg, &alglen)) != 0 ||
+	    (r = sshbuf_get_u32(m, &compat)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (keyid > INT_MAX)
 		fatal("%s: invalid key ID", __func__);
@@ -660,13 +671,13 @@
 
 	if ((key = get_hostkey_by_index(keyid)) != NULL) {
 		if ((r = sshkey_sign(key, &signature, &siglen, p, datlen, alg,
-		    datafellows)) != 0)
+		    compat)) != 0)
 			fatal("%s: sshkey_sign failed: %s",
 			    __func__, ssh_err(r));
 	} else if ((key = get_hostkey_public_by_index(keyid, ssh)) != NULL &&
 	    auth_sock > 0) {
 		if ((r = ssh_agent_sign(auth_sock, key, &signature, &siglen,
-		    p, datlen, alg, datafellows)) != 0) {
+		    p, datlen, alg, compat)) != 0) {
 			fatal("%s: ssh_agent_sign failed: %s",
 			    __func__, ssh_err(r));
 		}
@@ -695,12 +706,12 @@
 /* Retrieves the password entry and also checks if the user is permitted */
 
 int
-mm_answer_pwnamallow(int sock, Buffer *m)
+mm_answer_pwnamallow(int sock, struct sshbuf *m)
 {
 	struct ssh *ssh = active_state;	/* XXX */
 	char *username;
 	struct passwd *pwent;
-	int allowed = 0;
+	int r, allowed = 0;
 	u_int i;
 
 	debug3("%s", __func__);
@@ -708,7 +719,8 @@
 	if (authctxt->attempt++ != 0)
 		fatal("%s: multiple attempts for getpwnam", __func__);
 
-	username = buffer_get_string(m, NULL);
+	if ((r = sshbuf_get_cstring(m, &username, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	pwent = getpwnamallow(username);
 
@@ -716,10 +728,11 @@
 	setproctitle("%s [priv]", pwent ? username : "unknown");
 	free(username);
 
-	buffer_clear(m);
+	sshbuf_reset(m);
 
 	if (pwent == NULL) {
-		buffer_put_char(m, 0);
+		if ((r = sshbuf_put_u8(m, 0)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		authctxt->pw = fakepw();
 		goto out;
 	}
@@ -728,31 +741,40 @@
 	authctxt->pw = pwent;
 	authctxt->valid = 1;
 
-	buffer_put_char(m, 1);
-	buffer_put_string(m, pwent, sizeof(struct passwd));
-	buffer_put_cstring(m, pwent->pw_name);
-	buffer_put_cstring(m, "*");
+	/* XXX don't sent pwent to unpriv; send fake class/dir/shell too */
+	if ((r = sshbuf_put_u8(m, 1)) != 0 ||
+	    (r = sshbuf_put_string(m, pwent, sizeof(*pwent))) != 0 ||
+	    (r = sshbuf_put_cstring(m, pwent->pw_name)) != 0 ||
+	    (r = sshbuf_put_cstring(m, "*")) != 0 ||
 #ifdef HAVE_STRUCT_PASSWD_PW_GECOS
-	buffer_put_cstring(m, pwent->pw_gecos);
+	    (r = sshbuf_put_cstring(m, pwent->pw_gecos)) != 0 ||
 #endif
 #ifdef HAVE_STRUCT_PASSWD_PW_CLASS
-	buffer_put_cstring(m, pwent->pw_class);
+	    (r = sshbuf_put_cstring(m, pwent->pw_class)) != 0 ||
 #endif
-	buffer_put_cstring(m, pwent->pw_dir);
-	buffer_put_cstring(m, pwent->pw_shell);
+	    (r = sshbuf_put_cstring(m, pwent->pw_dir)) != 0 ||
+	    (r = sshbuf_put_cstring(m, pwent->pw_shell)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
  out:
 	ssh_packet_set_log_preamble(ssh, "%suser %s",
 	    authctxt->valid ? "authenticating" : "invalid ", authctxt->user);
-	buffer_put_string(m, &options, sizeof(options));
+	if ((r = sshbuf_put_string(m, &options, sizeof(options))) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 #define M_CP_STROPT(x) do { \
-		if (options.x != NULL) \
-			buffer_put_cstring(m, options.x); \
+		if (options.x != NULL) { \
+			if ((r = sshbuf_put_cstring(m, options.x)) != 0) \
+				fatal("%s: buffer error: %s", \
+				    __func__, ssh_err(r)); \
+		} \
 	} while (0)
 #define M_CP_STRARRAYOPT(x, nx) do { \
-		for (i = 0; i < options.nx; i++) \
-			buffer_put_cstring(m, options.x[i]); \
+		for (i = 0; i < options.nx; i++) { \
+			if ((r = sshbuf_put_cstring(m, options.x[i])) != 0) \
+				fatal("%s: buffer error: %s", \
+				    __func__, ssh_err(r)); \
+		} \
 	} while (0)
 	/* See comment in servconf.h */
 	COPY_MATCH_STRING_OPTS();
@@ -784,13 +806,15 @@
 	return (0);
 }
 
-int mm_answer_auth2_read_banner(int sock, Buffer *m)
+int mm_answer_auth2_read_banner(int sock, struct sshbuf *m)
 {
 	char *banner;
+	int r;
 
-	buffer_clear(m);
+	sshbuf_reset(m);
 	banner = auth2_read_banner();
-	buffer_put_cstring(m, banner != NULL ? banner : "");
+	if ((r = sshbuf_put_cstring(m, banner != NULL ? banner : "")) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	mm_request_send(sock, MONITOR_ANS_AUTH2_READ_BANNER, m);
 	free(banner);
 
@@ -798,12 +822,15 @@
 }
 
 int
-mm_answer_authserv(int sock, Buffer *m)
+mm_answer_authserv(int sock, struct sshbuf *m)
 {
+	int r;
+
 	monitor_permit_authentications(1);
 
-	authctxt->service = buffer_get_string(m, NULL);
-	authctxt->style = buffer_get_string(m, NULL);
+	if ((r = sshbuf_get_cstring(m, &authctxt->service, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &authctxt->style, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	debug3("%s: service=%s, style=%s",
 	    __func__, authctxt->service, authctxt->style);
 
@@ -816,26 +843,30 @@
 }
 
 int
-mm_answer_authpassword(int sock, Buffer *m)
+mm_answer_authpassword(int sock, struct sshbuf *m)
 {
+	struct ssh *ssh = active_state;	/* XXX */
 	static int call_count;
 	char *passwd;
-	int authenticated;
-	u_int plen;
+	int r, authenticated;
+	size_t plen;
 
 	if (!options.password_authentication)
 		fatal("%s: password authentication not enabled", __func__);
-	passwd = buffer_get_string(m, &plen);
+	if ((r = sshbuf_get_cstring(m, &passwd, &plen)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	/* Only authenticate if the context is valid */
 	authenticated = options.password_authentication &&
-	    auth_password(authctxt, passwd);
-	explicit_bzero(passwd, strlen(passwd));
+	    auth_password(ssh, passwd);
+	explicit_bzero(passwd, plen);
 	free(passwd);
 
-	buffer_clear(m);
-	buffer_put_int(m, authenticated);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, authenticated)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 #ifdef USE_PAM
-	buffer_put_int(m, sshpam_get_maxtries_reached());
+	if ((r = sshbuf_put_u32(m, sshpam_get_maxtries_reached())) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 #endif
 
 	debug3("%s: sending result %d", __func__, authenticated);
@@ -853,23 +884,25 @@
 
 #ifdef BSD_AUTH
 int
-mm_answer_bsdauthquery(int sock, Buffer *m)
+mm_answer_bsdauthquery(int sock, struct sshbuf *m)
 {
 	char *name, *infotxt;
-	u_int numprompts;
-	u_int *echo_on;
+	u_int numprompts, *echo_on, success;
 	char **prompts;
-	u_int success;
+	int r;
 
 	if (!options.kbd_interactive_authentication)
 		fatal("%s: kbd-int authentication not enabled", __func__);
 	success = bsdauth_query(authctxt, &name, &infotxt, &numprompts,
 	    &prompts, &echo_on) < 0 ? 0 : 1;
 
-	buffer_clear(m);
-	buffer_put_int(m, success);
-	if (success)
-		buffer_put_cstring(m, prompts[0]);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, success)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (success) {
+		if ((r = sshbuf_put_cstring(m, prompts[0])) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
 
 	debug3("%s: sending challenge success: %u", __func__, success);
 	mm_request_send(sock, MONITOR_ANS_BSDAUTHQUERY, m);
@@ -885,25 +918,27 @@
 }
 
 int
-mm_answer_bsdauthrespond(int sock, Buffer *m)
+mm_answer_bsdauthrespond(int sock, struct sshbuf *m)
 {
 	char *response;
-	int authok;
+	int r, authok;
 
 	if (!options.kbd_interactive_authentication)
 		fatal("%s: kbd-int authentication not enabled", __func__);
 	if (authctxt->as == NULL)
 		fatal("%s: no bsd auth session", __func__);
 
-	response = buffer_get_string(m, NULL);
+	if ((r = sshbuf_get_cstring(m, &response, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	authok = options.challenge_response_authentication &&
 	    auth_userresponse(authctxt->as, response, 0);
 	authctxt->as = NULL;
 	debug3("%s: <%s> = <%d>", __func__, response, authok);
 	free(response);
 
-	buffer_clear(m);
-	buffer_put_int(m, authok);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, authok)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	debug3("%s: sending authenticated: %d", __func__, authok);
 	mm_request_send(sock, MONITOR_ANS_BSDAUTHRESPOND, m);
@@ -915,59 +950,9 @@
 }
 #endif
 
-#ifdef SKEY
-int
-mm_answer_skeyquery(int sock, Buffer *m)
-{
-	struct skey skey;
-	char challenge[1024];
-	u_int success;
-
-	success = _compat_skeychallenge(&skey, authctxt->user, challenge,
-	    sizeof(challenge)) < 0 ? 0 : 1;
-
-	buffer_clear(m);
-	buffer_put_int(m, success);
-	if (success)
-		buffer_put_cstring(m, challenge);
-
-	debug3("%s: sending challenge success: %u", __func__, success);
-	mm_request_send(sock, MONITOR_ANS_SKEYQUERY, m);
-
-	return (0);
-}
-
-int
-mm_answer_skeyrespond(int sock, Buffer *m)
-{
-	char *response;
-	int authok;
-
-	response = buffer_get_string(m, NULL);
-
-	authok = (options.challenge_response_authentication &&
-	    authctxt->valid &&
-	    skey_haskey(authctxt->pw->pw_name) == 0 &&
-	    skey_passcheck(authctxt->pw->pw_name, response) != -1);
-
-	free(response);
-
-	buffer_clear(m);
-	buffer_put_int(m, authok);
-
-	debug3("%s: sending authenticated: %d", __func__, authok);
-	mm_request_send(sock, MONITOR_ANS_SKEYRESPOND, m);
-
-	auth_method = "keyboard-interactive";
-	auth_submethod = "skey";
-
-	return (authok != 0);
-}
-#endif
-
 #ifdef USE_PAM
 int
-mm_answer_pam_start(int sock, Buffer *m)
+mm_answer_pam_start(int sock, struct sshbuf *m)
 {
 	if (!options.use_pam)
 		fatal("UsePAM not set, but ended up in %s anyway", __func__);
@@ -982,17 +967,19 @@
 }
 
 int
-mm_answer_pam_account(int sock, Buffer *m)
+mm_answer_pam_account(int sock, struct sshbuf *m)
 {
 	u_int ret;
+	int r;
 
 	if (!options.use_pam)
 		fatal("%s: PAM not enabled", __func__);
 
 	ret = do_pam_account();
 
-	buffer_put_int(m, ret);
-	buffer_put_string(m, buffer_ptr(&loginmsg), buffer_len(&loginmsg));
+	if ((r = sshbuf_put_u32(m, ret)) != 0 ||
+	    (r = sshbuf_put_stringb(m, loginmsg)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	mm_request_send(sock, MONITOR_ANS_PAM_ACCOUNT, m);
 
@@ -1003,8 +990,11 @@
 extern KbdintDevice sshpam_device;
 
 int
-mm_answer_pam_init_ctx(int sock, Buffer *m)
+mm_answer_pam_init_ctx(int sock, struct sshbuf *m)
 {
+	u_int ok = 0;
+	int r;
+
 	debug3("%s", __func__);
 	if (!options.kbd_interactive_authentication)
 		fatal("%s: kbd-int authentication not enabled", __func__);
@@ -1012,24 +1002,24 @@
 		fatal("%s: already called", __func__);
 	sshpam_ctxt = (sshpam_device.init_ctx)(authctxt);
 	sshpam_authok = NULL;
-	buffer_clear(m);
+	sshbuf_reset(m);
 	if (sshpam_ctxt != NULL) {
 		monitor_permit(mon_dispatch, MONITOR_REQ_PAM_FREE_CTX, 1);
 		monitor_permit(mon_dispatch, MONITOR_REQ_PAM_QUERY, 1);
-		buffer_put_int(m, 1);
-	} else {
-		buffer_put_int(m, 0);
+		ok = 1;
 	}
+	if ((r = sshbuf_put_u32(m, ok)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	mm_request_send(sock, MONITOR_ANS_PAM_INIT_CTX, m);
 	return (0);
 }
 
 int
-mm_answer_pam_query(int sock, Buffer *m)
+mm_answer_pam_query(int sock, struct sshbuf *m)
 {
 	char *name = NULL, *info = NULL, **prompts = NULL;
 	u_int i, num = 0, *echo_on = 0;
-	int ret;
+	int r, ret;
 
 	debug3("%s", __func__);
 	sshpam_authok = NULL;
@@ -1042,18 +1032,20 @@
 	if (num > 1 || name == NULL || info == NULL)
 		fatal("sshpam_device.query failed");
 	monitor_permit(mon_dispatch, MONITOR_REQ_PAM_RESPOND, 1);
-	buffer_clear(m);
-	buffer_put_int(m, ret);
-	buffer_put_cstring(m, name);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, ret)) != 0 ||
+	    (r = sshbuf_put_cstring(m, name)) != 0 ||
+	    (r = sshbuf_put_cstring(m, info)) != 0 ||
+	    (r = sshbuf_put_u32(m, sshpam_get_maxtries_reached())) != 0 ||
+	    (r = sshbuf_put_u32(m, num)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	free(name);
-	buffer_put_cstring(m, info);
 	free(info);
-	buffer_put_int(m, sshpam_get_maxtries_reached());
-	buffer_put_int(m, num);
 	for (i = 0; i < num; ++i) {
-		buffer_put_cstring(m, prompts[i]);
+		if ((r = sshbuf_put_cstring(m, prompts[i])) != 0 ||
+		    (r = sshbuf_put_u32(m, echo_on[i])) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		free(prompts[i]);
-		buffer_put_int(m, echo_on[i]);
 	}
 	free(prompts);
 	free(echo_on);
@@ -1064,21 +1056,25 @@
 }
 
 int
-mm_answer_pam_respond(int sock, Buffer *m)
+mm_answer_pam_respond(int sock, struct sshbuf *m)
 {
 	char **resp;
 	u_int i, num;
-	int ret;
+	int r, ret;
 
 	debug3("%s", __func__);
 	if (sshpam_ctxt == NULL)
 		fatal("%s: no context", __func__);
 	sshpam_authok = NULL;
-	num = buffer_get_int(m);
+	if ((r = sshbuf_get_u32(m, &num)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (num > 0) {
 		resp = xcalloc(num, sizeof(char *));
-		for (i = 0; i < num; ++i)
-			resp[i] = buffer_get_string(m, NULL);
+		for (i = 0; i < num; ++i) {
+			if ((r = sshbuf_get_cstring(m, &(resp[i]), NULL)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
+		}
 		ret = (sshpam_device.respond)(sshpam_ctxt, num, resp);
 		for (i = 0; i < num; ++i)
 			free(resp[i]);
@@ -1086,8 +1082,9 @@
 	} else {
 		ret = (sshpam_device.respond)(sshpam_ctxt, num, NULL);
 	}
-	buffer_clear(m);
-	buffer_put_int(m, ret);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, ret)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	mm_request_send(sock, MONITOR_ANS_PAM_RESPOND, m);
 	auth_method = "keyboard-interactive";
 	auth_submethod = "pam";
@@ -1097,7 +1094,7 @@
 }
 
 int
-mm_answer_pam_free_ctx(int sock, Buffer *m)
+mm_answer_pam_free_ctx(int sock, struct sshbuf *m)
 {
 	int r = sshpam_authok != NULL && sshpam_authok == sshpam_ctxt;
 
@@ -1106,7 +1103,7 @@
 		fatal("%s: no context", __func__);
 	(sshpam_device.free_ctx)(sshpam_ctxt);
 	sshpam_ctxt = sshpam_authok = NULL;
-	buffer_clear(m);
+	sshbuf_reset(m);
 	mm_request_send(sock, MONITOR_ANS_PAM_FREE_CTX, m);
 	/* Allow another attempt */
 	monitor_permit(mon_dispatch, MONITOR_REQ_PAM_INIT_CTX, 1);
@@ -1117,57 +1114,59 @@
 #endif
 
 int
-mm_answer_keyallowed(int sock, Buffer *m)
+mm_answer_keyallowed(int sock, struct sshbuf *m)
 {
-	Key *key;
+	struct ssh *ssh = active_state;	/* XXX */
+	struct sshkey *key = NULL;
 	char *cuser, *chost;
-	u_char *blob;
-	u_int bloblen, pubkey_auth_attempt;
+	u_int pubkey_auth_attempt;
 	enum mm_keytype type = 0;
-	int allowed = 0;
+	int r, allowed = 0;
+	struct sshauthopt *opts = NULL;
 
 	debug3("%s entering", __func__);
-
-	type = buffer_get_int(m);
-	cuser = buffer_get_string(m, NULL);
-	chost = buffer_get_string(m, NULL);
-	blob = buffer_get_string(m, &bloblen);
-	pubkey_auth_attempt = buffer_get_int(m);
-
-	key = key_from_blob(blob, bloblen);
+	if ((r = sshbuf_get_u32(m, &type)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &cuser, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &chost, NULL)) != 0 ||
+	    (r = sshkey_froms(m, &key)) != 0 ||
+	    (r = sshbuf_get_u32(m, &pubkey_auth_attempt)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	debug3("%s: key_from_blob: %p", __func__, key);
 
 	if (key != NULL && authctxt->valid) {
 		/* These should not make it past the privsep child */
-		if (key_type_plain(key->type) == KEY_RSA &&
+		if (sshkey_type_plain(key->type) == KEY_RSA &&
 		    (datafellows & SSH_BUG_RSASIGMD5) != 0)
 			fatal("%s: passed a SSH_BUG_RSASIGMD5 key", __func__);
 
 		switch (type) {
 		case MM_USERKEY:
-			allowed = options.pubkey_authentication &&
-			    !auth2_userkey_already_used(authctxt, key) &&
-			    match_pattern_list(sshkey_ssh_name(key),
-			    options.pubkey_key_types, 0) == 1 &&
-			    user_key_allowed(authctxt->pw, key,
-			    pubkey_auth_attempt);
-			pubkey_auth_info(authctxt, key, NULL);
 			auth_method = "publickey";
-			if (options.pubkey_authentication &&
-			    (!pubkey_auth_attempt || allowed != 1))
-				auth_clear_options();
+			if (!options.pubkey_authentication)
+				break;
+			if (auth2_key_already_used(authctxt, key))
+				break;
+			if (match_pattern_list(sshkey_ssh_name(key),
+			    options.pubkey_key_types, 0) != 1)
+				break;
+			allowed = user_key_allowed(ssh, authctxt->pw, key,
+			    pubkey_auth_attempt, &opts);
 			break;
 		case MM_HOSTKEY:
-			allowed = options.hostbased_authentication &&
-			    match_pattern_list(sshkey_ssh_name(key),
-			    options.hostbased_key_types, 0) == 1 &&
-			    hostbased_key_allowed(authctxt->pw,
+			auth_method = "hostbased";
+			if (!options.hostbased_authentication)
+				break;
+			if (auth2_key_already_used(authctxt, key))
+				break;
+			if (match_pattern_list(sshkey_ssh_name(key),
+			    options.hostbased_key_types, 0) != 1)
+				break;
+			allowed = hostbased_key_allowed(authctxt->pw,
 			    cuser, chost, key);
-			pubkey_auth_info(authctxt, key,
+			auth2_record_info(authctxt,
 			    "client user \"%.100s\", client host \"%.100s\"",
 			    cuser, chost);
-			auth_method = "hostbased";
 			break;
 		default:
 			fatal("%s: unknown key type %d", __func__, type);
@@ -1175,70 +1174,83 @@
 		}
 	}
 
-	debug3("%s: key %p is %s",
-	    __func__, key, allowed ? "allowed" : "not allowed");
+	debug3("%s: %s authentication%s: %s key is %s", __func__,
+	    auth_method, pubkey_auth_attempt ? "" : " test",
+	    (key == NULL || !authctxt->valid) ? "invalid" : sshkey_type(key),
+	    allowed ? "allowed" : "not allowed");
 
-	if (key != NULL)
-		key_free(key);
+	auth2_record_key(authctxt, 0, key);
 
 	/* clear temporarily storage (used by verify) */
 	monitor_reset_key_state();
 
 	if (allowed) {
 		/* Save temporarily for comparison in verify */
-		key_blob = blob;
-		key_bloblen = bloblen;
+		if ((r = sshkey_to_blob(key, &key_blob, &key_bloblen)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		key_blobtype = type;
+		key_opts = opts;
 		hostbased_cuser = cuser;
 		hostbased_chost = chost;
 	} else {
 		/* Log failed attempt */
 		auth_log(authctxt, 0, 0, auth_method, NULL);
-		free(blob);
 		free(cuser);
 		free(chost);
 	}
+	sshkey_free(key);
 
-	buffer_clear(m);
-	buffer_put_int(m, allowed);
-	buffer_put_int(m, forced_command != NULL);
-
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, allowed)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (opts != NULL && (r = sshauthopt_serialise(opts, m, 1)) != 0)
+		fatal("%s: sshauthopt_serialise: %s", __func__, ssh_err(r));
 	mm_request_send(sock, MONITOR_ANS_KEYALLOWED, m);
 
+	if (!allowed)
+		sshauthopt_free(opts);
+
 	return (0);
 }
 
 static int
 monitor_valid_userblob(u_char *data, u_int datalen)
 {
-	Buffer b;
-	u_char *p;
+	struct sshbuf *b;
+	const u_char *p;
 	char *userstyle, *cp;
-	u_int len;
-	int fail = 0;
+	size_t len;
+	u_char type;
+	int r, fail = 0;
 
-	buffer_init(&b);
-	buffer_append(&b, data, datalen);
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put(b, data, datalen)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	if (datafellows & SSH_OLD_SESSIONID) {
-		p = buffer_ptr(&b);
-		len = buffer_len(&b);
+		p = sshbuf_ptr(b);
+		len = sshbuf_len(b);
 		if ((session_id2 == NULL) ||
 		    (len < session_id2_len) ||
 		    (timingsafe_bcmp(p, session_id2, session_id2_len) != 0))
 			fail++;
-		buffer_consume(&b, session_id2_len);
+		if ((r = sshbuf_consume(b, session_id2_len)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	} else {
-		p = buffer_get_string(&b, &len);
+		if ((r = sshbuf_get_string_direct(b, &p, &len)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		if ((session_id2 == NULL) ||
 		    (len != session_id2_len) ||
 		    (timingsafe_bcmp(p, session_id2, session_id2_len) != 0))
 			fail++;
-		free(p);
 	}
-	if (buffer_get_char(&b) != SSH2_MSG_USERAUTH_REQUEST)
+	if ((r = sshbuf_get_u8(b, &type)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (type != SSH2_MSG_USERAUTH_REQUEST)
 		fail++;
-	cp = buffer_get_cstring(&b, NULL);
+	if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	xasprintf(&userstyle, "%s%s%s", authctxt->user,
 	    authctxt->style ? ":" : "",
 	    authctxt->style ? authctxt->style : "");
@@ -1249,23 +1261,22 @@
 	}
 	free(userstyle);
 	free(cp);
-	buffer_skip_string(&b);
-	if (datafellows & SSH_BUG_PKAUTH) {
-		if (!buffer_get_char(&b))
-			fail++;
-	} else {
-		cp = buffer_get_cstring(&b, NULL);
-		if (strcmp("publickey", cp) != 0)
-			fail++;
-		free(cp);
-		if (!buffer_get_char(&b))
-			fail++;
-		buffer_skip_string(&b);
-	}
-	buffer_skip_string(&b);
-	if (buffer_len(&b) != 0)
+	if ((r = sshbuf_skip_string(b)) != 0 ||	/* service */
+	    (r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (strcmp("publickey", cp) != 0)
 		fail++;
-	buffer_free(&b);
+	free(cp);
+	if ((r = sshbuf_get_u8(b, &type)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (type == 0)
+		fail++;
+	if ((r = sshbuf_skip_string(b)) != 0 ||	/* pkalg */
+	    (r = sshbuf_skip_string(b)) != 0)	/* pkblob */
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (sshbuf_len(b) != 0)
+		fail++;
+	sshbuf_free(b);
 	return (fail == 0);
 }
 
@@ -1273,90 +1284,111 @@
 monitor_valid_hostbasedblob(u_char *data, u_int datalen, char *cuser,
     char *chost)
 {
-	Buffer b;
-	char *p, *userstyle;
-	u_int len;
-	int fail = 0;
+	struct sshbuf *b;
+	const u_char *p;
+	char *cp, *userstyle;
+	size_t len;
+	int r, fail = 0;
+	u_char type;
 
-	buffer_init(&b);
-	buffer_append(&b, data, datalen);
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put(b, data, datalen)) != 0 ||
+	    (r = sshbuf_get_string_direct(b, &p, &len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	p = buffer_get_string(&b, &len);
 	if ((session_id2 == NULL) ||
 	    (len != session_id2_len) ||
 	    (timingsafe_bcmp(p, session_id2, session_id2_len) != 0))
 		fail++;
-	free(p);
 
-	if (buffer_get_char(&b) != SSH2_MSG_USERAUTH_REQUEST)
+	if ((r = sshbuf_get_u8(b, &type)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (type != SSH2_MSG_USERAUTH_REQUEST)
 		fail++;
-	p = buffer_get_cstring(&b, NULL);
+	if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	xasprintf(&userstyle, "%s%s%s", authctxt->user,
 	    authctxt->style ? ":" : "",
 	    authctxt->style ? authctxt->style : "");
-	if (strcmp(userstyle, p) != 0) {
-		logit("wrong user name passed to monitor: expected %s != %.100s",
-		    userstyle, p);
+	if (strcmp(userstyle, cp) != 0) {
+		logit("wrong user name passed to monitor: "
+		    "expected %s != %.100s", userstyle, cp);
 		fail++;
 	}
 	free(userstyle);
-	free(p);
-	buffer_skip_string(&b);	/* service */
-	p = buffer_get_cstring(&b, NULL);
-	if (strcmp(p, "hostbased") != 0)
+	free(cp);
+	if ((r = sshbuf_skip_string(b)) != 0 ||	/* service */
+	    (r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (strcmp(cp, "hostbased") != 0)
 		fail++;
-	free(p);
-	buffer_skip_string(&b);	/* pkalg */
-	buffer_skip_string(&b);	/* pkblob */
+	free(cp);
+	if ((r = sshbuf_skip_string(b)) != 0 ||	/* pkalg */
+	    (r = sshbuf_skip_string(b)) != 0)	/* pkblob */
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	/* verify client host, strip trailing dot if necessary */
-	p = buffer_get_string(&b, NULL);
-	if (((len = strlen(p)) > 0) && p[len - 1] == '.')
-		p[len - 1] = '\0';
-	if (strcmp(p, chost) != 0)
+	if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (((len = strlen(cp)) > 0) && cp[len - 1] == '.')
+		cp[len - 1] = '\0';
+	if (strcmp(cp, chost) != 0)
 		fail++;
-	free(p);
+	free(cp);
 
 	/* verify client user */
-	p = buffer_get_string(&b, NULL);
-	if (strcmp(p, cuser) != 0)
+	if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (strcmp(cp, cuser) != 0)
 		fail++;
-	free(p);
+	free(cp);
 
-	if (buffer_len(&b) != 0)
+	if (sshbuf_len(b) != 0)
 		fail++;
-	buffer_free(&b);
+	sshbuf_free(b);
 	return (fail == 0);
 }
 
 int
-mm_answer_keyverify(int sock, Buffer *m)
+mm_answer_keyverify(int sock, struct sshbuf *m)
 {
-	Key *key;
+	struct ssh *ssh = active_state;	/* XXX */
+	struct sshkey *key;
 	u_char *signature, *data, *blob;
-	u_int signaturelen, datalen, bloblen;
-	int verified = 0;
-	int valid_data = 0;
+	char *sigalg;
+	size_t signaturelen, datalen, bloblen;
+	int r, ret, valid_data = 0, encoded_ret;
 
-	blob = buffer_get_string(m, &bloblen);
-	signature = buffer_get_string(m, &signaturelen);
-	data = buffer_get_string(m, &datalen);
+	if ((r = sshbuf_get_string(m, &blob, &bloblen)) != 0 ||
+	    (r = sshbuf_get_string(m, &signature, &signaturelen)) != 0 ||
+	    (r = sshbuf_get_string(m, &data, &datalen)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &sigalg, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	if (hostbased_cuser == NULL || hostbased_chost == NULL ||
 	  !monitor_allowed_key(blob, bloblen))
 		fatal("%s: bad key, not previously allowed", __func__);
 
-	key = key_from_blob(blob, bloblen);
-	if (key == NULL)
-		fatal("%s: bad public key blob", __func__);
+	/* Empty signature algorithm means NULL. */
+	if (*sigalg == '\0') {
+		free(sigalg);
+		sigalg = NULL;
+	}
+
+	/* XXX use sshkey_froms here; need to change key_blob, etc. */
+	if ((r = sshkey_from_blob(blob, bloblen, &key)) != 0)
+		fatal("%s: bad public key blob: %s", __func__, ssh_err(r));
 
 	switch (key_blobtype) {
 	case MM_USERKEY:
 		valid_data = monitor_valid_userblob(data, datalen);
+		auth_method = "publickey";
 		break;
 	case MM_HOSTKEY:
 		valid_data = monitor_valid_hostbasedblob(data, datalen,
 		    hostbased_cuser, hostbased_chost);
+		auth_method = "hostbased";
 		break;
 	default:
 		valid_data = 0;
@@ -1365,29 +1397,31 @@
 	if (!valid_data)
 		fatal("%s: bad signature data blob", __func__);
 
-	verified = key_verify(key, signature, signaturelen, data, datalen);
-	debug3("%s: key %p signature %s",
-	    __func__, key, (verified == 1) ? "verified" : "unverified");
-
-	/* If auth was successful then record key to ensure it isn't reused */
-	if (verified == 1 && key_blobtype == MM_USERKEY)
-		auth2_record_userkey(authctxt, key);
-	else
-		key_free(key);
+	ret = sshkey_verify(key, signature, signaturelen, data, datalen,
+	    sigalg, active_state->compat);
+	debug3("%s: %s %p signature %s", __func__, auth_method, key,
+	    (ret == 0) ? "verified" : "unverified");
+	auth2_record_key(authctxt, ret == 0, key);
 
 	free(blob);
 	free(signature);
 	free(data);
+	free(sigalg);
 
-	auth_method = key_blobtype == MM_USERKEY ? "publickey" : "hostbased";
-
+	if (key_blobtype == MM_USERKEY)
+		auth_activate_options(ssh, key_opts);
 	monitor_reset_key_state();
 
-	buffer_clear(m);
-	buffer_put_int(m, verified);
+	sshkey_free(key);
+	sshbuf_reset(m);
+
+	/* encode ret != 0 as positive integer, since we're sending u32 */
+	encoded_ret = (ret != 0);
+	if ((r = sshbuf_put_u32(m, encoded_ret)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	mm_request_send(sock, MONITOR_ANS_KEYVERIFY, m);
 
-	return (verified == 1);
+	return ret == 0;
 }
 
 static void
@@ -1428,15 +1462,15 @@
 }
 
 int
-mm_answer_pty(int sock, Buffer *m)
+mm_answer_pty(int sock, struct sshbuf *m)
 {
 	extern struct monitor *pmonitor;
 	Session *s;
-	int res, fd0;
+	int r, res, fd0;
 
 	debug3("%s entering", __func__);
 
-	buffer_clear(m);
+	sshbuf_reset(m);
 	s = session_new();
 	if (s == NULL)
 		goto error;
@@ -1448,8 +1482,9 @@
 		goto error;
 	pty_setowner(authctxt->pw, s->tty);
 
-	buffer_put_int(m, 1);
-	buffer_put_cstring(m, s->tty);
+	if ((r = sshbuf_put_u32(m, 1)) != 0 ||
+	    (r = sshbuf_put_cstring(m, s->tty)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	/* We need to trick ttyslot */
 	if (dup2(s->ttyfd, 0) == -1)
@@ -1461,8 +1496,9 @@
 	close(0);
 
 	/* send messages generated by record_login */
-	buffer_put_string(m, buffer_ptr(&loginmsg), buffer_len(&loginmsg));
-	buffer_clear(&loginmsg);
+	if ((r = sshbuf_put_stringb(m, loginmsg)) != 0)
+		fatal("%s: put login message: %s", __func__, ssh_err(r));
+	sshbuf_reset(loginmsg);
 
 	mm_request_send(sock, MONITOR_ANS_PTY, m);
 
@@ -1489,37 +1525,41 @@
  error:
 	if (s != NULL)
 		mm_session_close(s);
-	buffer_put_int(m, 0);
+	if ((r = sshbuf_put_u32(m, 0)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	mm_request_send(sock, MONITOR_ANS_PTY, m);
 	return (0);
 }
 
 int
-mm_answer_pty_cleanup(int sock, Buffer *m)
+mm_answer_pty_cleanup(int sock, struct sshbuf *m)
 {
 	Session *s;
 	char *tty;
+	int r;
 
 	debug3("%s entering", __func__);
 
-	tty = buffer_get_string(m, NULL);
+	if ((r = sshbuf_get_cstring(m, &tty, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if ((s = session_by_tty(tty)) != NULL)
 		mm_session_close(s);
-	buffer_clear(m);
+	sshbuf_reset(m);
 	free(tty);
 	return (0);
 }
 
 int
-mm_answer_term(int sock, Buffer *req)
+mm_answer_term(int sock, struct sshbuf *req)
 {
+	struct ssh *ssh = active_state;	/* XXX */
 	extern struct monitor *pmonitor;
 	int res, status;
 
 	debug3("%s: tearing down sessions", __func__);
 
 	/* The child is terminating */
-	session_destroy_all(&mm_session_close);
+	session_destroy_all(ssh, &mm_session_close);
 
 #ifdef USE_PAM
 	if (options.use_pam)
@@ -1539,14 +1579,18 @@
 #ifdef SSH_AUDIT_EVENTS
 /* Report that an audit event occurred */
 int
-mm_answer_audit_event(int socket, Buffer *m)
+mm_answer_audit_event(int socket, struct sshbuf *m)
 {
+	u_int n;
 	ssh_audit_event_t event;
+	int r;
 
 	debug3("%s entering", __func__);
 
-	event = buffer_get_int(m);
-	switch(event) {
+	if ((r = sshbuf_get_u32(m, &n)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	event = (ssh_audit_event_t)n;
+	switch (event) {
 	case SSH_AUTH_FAIL_PUBKEY:
 	case SSH_AUTH_FAIL_HOSTBASED:
 	case SSH_AUTH_FAIL_GSSAPI:
@@ -1564,13 +1608,14 @@
 }
 
 int
-mm_answer_audit_command(int socket, Buffer *m)
+mm_answer_audit_command(int socket, struct sshbuf *m)
 {
-	u_int len;
 	char *cmd;
+	int r;
 
 	debug3("%s entering", __func__);
-	cmd = buffer_get_string(m, &len);
+	if ((r = sshbuf_get_cstring(m, &cmd, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	/* sanity check command, if so how? */
 	audit_run_command(cmd);
 	free(cmd);
@@ -1579,6 +1624,17 @@
 #endif /* SSH_AUDIT_EVENTS */
 
 void
+monitor_clear_keystate(struct monitor *pmonitor)
+{
+	struct ssh *ssh = active_state;	/* XXX */
+
+	ssh_clear_newkeys(ssh, MODE_IN);
+	ssh_clear_newkeys(ssh, MODE_OUT);
+	sshbuf_free(child_state);
+	child_state = NULL;
+}
+
+void
 monitor_apply_keystate(struct monitor *pmonitor)
 {
 	struct ssh *ssh = active_state;	/* XXX */
@@ -1639,9 +1695,18 @@
 monitor_openfds(struct monitor *mon, int do_logfds)
 {
 	int pair[2];
+#ifdef SO_ZEROIZE
+	int on = 1;
+#endif
 
 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1)
 		fatal("%s: socketpair: %s", __func__, strerror(errno));
+#ifdef SO_ZEROIZE
+	if (setsockopt(pair[0], SOL_SOCKET, SO_ZEROIZE, &on, sizeof(on)) < 0)
+		error("setsockopt SO_ZEROIZE(0): %.100s", strerror(errno));
+	if (setsockopt(pair[1], SOL_SOCKET, SO_ZEROIZE, &on, sizeof(on)) < 0)
+		error("setsockopt SO_ZEROIZE(1): %.100s", strerror(errno));
+#endif
 	FD_CLOSEONEXEC(pair[0]);
 	FD_CLOSEONEXEC(pair[1]);
 	mon->m_recvfd = pair[0];
@@ -1679,24 +1744,29 @@
 
 #ifdef GSSAPI
 int
-mm_answer_gss_setup_ctx(int sock, Buffer *m)
+mm_answer_gss_setup_ctx(int sock, struct sshbuf *m)
 {
 	gss_OID_desc goid;
 	OM_uint32 major;
-	u_int len;
+	size_t len;
+	u_char *p;
+	int r;
 
 	if (!options.gss_authentication)
 		fatal("%s: GSSAPI authentication not enabled", __func__);
 
-	goid.elements = buffer_get_string(m, &len);
+	if ((r = sshbuf_get_string(m, &p, &len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	goid.elements = p;
 	goid.length = len;
 
 	major = ssh_gssapi_server_ctx(&gsscontext, &goid);
 
 	free(goid.elements);
 
-	buffer_clear(m);
-	buffer_put_int(m, major);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, major)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	mm_request_send(sock, MONITOR_ANS_GSSSETUP, m);
 
@@ -1707,26 +1777,27 @@
 }
 
 int
-mm_answer_gss_accept_ctx(int sock, Buffer *m)
+mm_answer_gss_accept_ctx(int sock, struct sshbuf *m)
 {
 	gss_buffer_desc in;
 	gss_buffer_desc out = GSS_C_EMPTY_BUFFER;
 	OM_uint32 major, minor;
 	OM_uint32 flags = 0; /* GSI needs this */
-	u_int len;
+	int r;
 
 	if (!options.gss_authentication)
 		fatal("%s: GSSAPI authentication not enabled", __func__);
 
-	in.value = buffer_get_string(m, &len);
-	in.length = len;
+	if ((r = ssh_gssapi_get_buffer_desc(m, &in)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	major = ssh_gssapi_accept_ctx(gsscontext, &in, &out, &flags);
 	free(in.value);
 
-	buffer_clear(m);
-	buffer_put_int(m, major);
-	buffer_put_string(m, out.value, out.length);
-	buffer_put_int(m, flags);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, major)) != 0 ||
+	    (r = sshbuf_put_string(m, out.value, out.length)) != 0 ||
+	    (r = sshbuf_put_u32(m, flags)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	mm_request_send(sock, MONITOR_ANS_GSSSTEP, m);
 
 	gss_release_buffer(&minor, &out);
@@ -1740,27 +1811,27 @@
 }
 
 int
-mm_answer_gss_checkmic(int sock, Buffer *m)
+mm_answer_gss_checkmic(int sock, struct sshbuf *m)
 {
 	gss_buffer_desc gssbuf, mic;
 	OM_uint32 ret;
-	u_int len;
+	int r;
 
 	if (!options.gss_authentication)
 		fatal("%s: GSSAPI authentication not enabled", __func__);
 
-	gssbuf.value = buffer_get_string(m, &len);
-	gssbuf.length = len;
-	mic.value = buffer_get_string(m, &len);
-	mic.length = len;
+	if ((r = ssh_gssapi_get_buffer_desc(m, &gssbuf)) != 0 ||
+	    (r = ssh_gssapi_get_buffer_desc(m, &mic)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	ret = ssh_gssapi_checkmic(gsscontext, &gssbuf, &mic);
 
 	free(gssbuf.value);
 	free(mic.value);
 
-	buffer_clear(m);
-	buffer_put_int(m, ret);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, ret)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	mm_request_send(sock, MONITOR_ANS_GSSCHECKMIC, m);
 
@@ -1771,23 +1842,28 @@
 }
 
 int
-mm_answer_gss_userok(int sock, Buffer *m)
+mm_answer_gss_userok(int sock, struct sshbuf *m)
 {
-	int authenticated;
+	int r, authenticated;
+	const char *displayname;
 
 	if (!options.gss_authentication)
 		fatal("%s: GSSAPI authentication not enabled", __func__);
 
 	authenticated = authctxt->valid && ssh_gssapi_userok(authctxt->user);
 
-	buffer_clear(m);
-	buffer_put_int(m, authenticated);
+	sshbuf_reset(m);
+	if ((r = sshbuf_put_u32(m, authenticated)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	debug3("%s: sending result %d", __func__, authenticated);
 	mm_request_send(sock, MONITOR_ANS_GSSUSEROK, m);
 
 	auth_method = "gssapi-with-mic";
 
+	if ((displayname = ssh_gssapi_displayname()) != NULL)
+		auth2_record_info(authctxt, "%s", displayname);
+
 	/* Monitor loop will terminate if authenticated */
 	return (authenticated);
 }
diff --git a/monitor.h b/monitor.h
index d68f674..1604729 100644
--- a/monitor.h
+++ b/monitor.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor.h,v 1.20 2016/09/28 16:33:07 djm Exp $ */
+/* $OpenBSD: monitor.h,v 1.21 2018/07/09 21:53:45 markus Exp $ */
 
 /*
  * Copyright 2002 Niels Provos <provos@citi.umich.edu>
@@ -39,8 +39,6 @@
 	MONITOR_REQ_AUTHPASSWORD = 12, MONITOR_ANS_AUTHPASSWORD = 13,
 	MONITOR_REQ_BSDAUTHQUERY = 14, MONITOR_ANS_BSDAUTHQUERY = 15,
 	MONITOR_REQ_BSDAUTHRESPOND = 16, MONITOR_ANS_BSDAUTHRESPOND = 17,
-	MONITOR_REQ_SKEYQUERY = 18, MONITOR_ANS_SKEYQUERY = 19,
-	MONITOR_REQ_SKEYRESPOND = 20, MONITOR_ANS_SKEYRESPOND = 21,
 	MONITOR_REQ_KEYALLOWED = 22, MONITOR_ANS_KEYALLOWED = 23,
 	MONITOR_REQ_KEYVERIFY = 24, MONITOR_ANS_KEYVERIFY = 25,
 	MONITOR_REQ_KEYEXPORT = 26,
@@ -87,8 +85,8 @@
 int monitor_read(struct monitor*, struct mon_table *, struct mon_table **);
 
 /* Prototypes for request sending and receiving */
-void mm_request_send(int, enum monitor_reqtype, Buffer *);
-void mm_request_receive(int, Buffer *);
-void mm_request_receive_expect(int, enum monitor_reqtype, Buffer *);
+void mm_request_send(int, enum monitor_reqtype, struct sshbuf *);
+void mm_request_receive(int, struct sshbuf *);
+void mm_request_receive_expect(int, enum monitor_reqtype, struct sshbuf *);
 
 #endif /* _MONITOR_H_ */
diff --git a/monitor_wrap.c b/monitor_wrap.c
index 64ff928..732fb34 100644
--- a/monitor_wrap.c
+++ b/monitor_wrap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor_wrap.c,v 1.89 2016/08/13 17:47:41 markus Exp $ */
+/* $OpenBSD: monitor_wrap.c,v 1.107 2018/07/20 03:46:34 djm Exp $ */
 /*
  * Copyright 2002 Niels Provos <provos@citi.umich.edu>
  * Copyright 2002 Markus Friedl <markus@openbsd.org>
@@ -50,8 +50,8 @@
 #ifdef WITH_OPENSSL
 #include "dh.h"
 #endif
-#include "buffer.h"
-#include "key.h"
+#include "sshbuf.h"
+#include "sshkey.h"
 #include "cipher.h"
 #include "kex.h"
 #include "hostfile.h"
@@ -61,13 +61,6 @@
 #include "mac.h"
 #include "log.h"
 #include "auth-pam.h"
-#ifdef TARGET_OS_MAC    /* XXX Broken krb5 headers on Mac */
-#undef TARGET_OS_MAC
-#include "zlib.h"
-#define TARGET_OS_MAC 1
-#else
-#include "zlib.h"
-#endif
 #include "monitor.h"
 #ifdef GSSAPI
 #include "ssh-gss.h"
@@ -76,7 +69,6 @@
 #include "atomicio.h"
 #include "monitor_fdpass.h"
 #include "misc.h"
-#include "uuencode.h"
 
 #include "channels.h"
 #include "session.h"
@@ -85,36 +77,35 @@
 #include "ssherr.h"
 
 /* Imports */
-extern z_stream incoming_stream;
-extern z_stream outgoing_stream;
 extern struct monitor *pmonitor;
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
 extern ServerOptions options;
 
 void
 mm_log_handler(LogLevel level, const char *msg, void *ctx)
 {
-	Buffer log_msg;
+	struct sshbuf *log_msg;
 	struct monitor *mon = (struct monitor *)ctx;
+	int r;
+	size_t len;
 
 	if (mon->m_log_sendfd == -1)
 		fatal("%s: no log channel", __func__);
 
-	buffer_init(&log_msg);
-	/*
-	 * Placeholder for packet length. Will be filled in with the actual
-	 * packet length once the packet has been constucted. This saves
-	 * fragile math.
-	 */
-	buffer_put_int(&log_msg, 0);
+	if ((log_msg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 
-	buffer_put_int(&log_msg, level);
-	buffer_put_cstring(&log_msg, msg);
-	put_u32(buffer_ptr(&log_msg), buffer_len(&log_msg) - 4);
-	if (atomicio(vwrite, mon->m_log_sendfd, buffer_ptr(&log_msg),
-	    buffer_len(&log_msg)) != buffer_len(&log_msg))
+	if ((r = sshbuf_put_u32(log_msg, 0)) != 0 || /* length; filled below */
+	    (r = sshbuf_put_u32(log_msg, level)) != 0 ||
+	    (r = sshbuf_put_cstring(log_msg, msg)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if ((len = sshbuf_len(log_msg)) < 4 || len > 0xffffffff)
+		fatal("%s: bad length %zu", __func__, len);
+	POKE_U32(sshbuf_mutable_ptr(log_msg), len - 4);
+	if (atomicio(vwrite, mon->m_log_sendfd,
+	    sshbuf_mutable_ptr(log_msg), len) != len)
 		fatal("%s: write: %s", __func__, strerror(errno));
-	buffer_free(&log_msg);
+	sshbuf_free(log_msg);
 }
 
 int
@@ -128,26 +119,29 @@
 }
 
 void
-mm_request_send(int sock, enum monitor_reqtype type, Buffer *m)
+mm_request_send(int sock, enum monitor_reqtype type, struct sshbuf *m)
 {
-	u_int mlen = buffer_len(m);
+	size_t mlen = sshbuf_len(m);
 	u_char buf[5];
 
 	debug3("%s entering: type %d", __func__, type);
 
-	put_u32(buf, mlen + 1);
+	if (mlen >= 0xffffffff)
+		fatal("%s: bad length %zu", __func__, mlen);
+	POKE_U32(buf, mlen + 1);
 	buf[4] = (u_char) type;		/* 1st byte of payload is mesg-type */
 	if (atomicio(vwrite, sock, buf, sizeof(buf)) != sizeof(buf))
 		fatal("%s: write: %s", __func__, strerror(errno));
-	if (atomicio(vwrite, sock, buffer_ptr(m), mlen) != mlen)
+	if (atomicio(vwrite, sock, sshbuf_mutable_ptr(m), mlen) != mlen)
 		fatal("%s: write: %s", __func__, strerror(errno));
 }
 
 void
-mm_request_receive(int sock, Buffer *m)
+mm_request_receive(int sock, struct sshbuf *m)
 {
-	u_char buf[4];
+	u_char buf[4], *p = NULL;
 	u_int msg_len;
+	int r;
 
 	debug3("%s entering", __func__);
 
@@ -156,24 +150,27 @@
 			cleanup_exit(255);
 		fatal("%s: read: %s", __func__, strerror(errno));
 	}
-	msg_len = get_u32(buf);
+	msg_len = PEEK_U32(buf);
 	if (msg_len > 256 * 1024)
 		fatal("%s: read: bad msg_len %d", __func__, msg_len);
-	buffer_clear(m);
-	buffer_append_space(m, msg_len);
-	if (atomicio(read, sock, buffer_ptr(m), msg_len) != msg_len)
+	sshbuf_reset(m);
+	if ((r = sshbuf_reserve(m, msg_len, &p)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (atomicio(read, sock, p, msg_len) != msg_len)
 		fatal("%s: read: %s", __func__, strerror(errno));
 }
 
 void
-mm_request_receive_expect(int sock, enum monitor_reqtype type, Buffer *m)
+mm_request_receive_expect(int sock, enum monitor_reqtype type, struct sshbuf *m)
 {
 	u_char rtype;
+	int r;
 
 	debug3("%s entering: type %d", __func__, type);
 
 	mm_request_receive(sock, m);
-	rtype = buffer_get_char(m);
+	if ((r = sshbuf_get_u8(m, &rtype)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (rtype != type)
 		fatal("%s: read: rtype %d != type %d", __func__,
 		    rtype, type);
@@ -184,20 +181,24 @@
 mm_choose_dh(int min, int nbits, int max)
 {
 	BIGNUM *p, *g;
-	int success = 0;
-	Buffer m;
+	int r;
+	u_char success = 0;
+	struct sshbuf *m;
 
-	buffer_init(&m);
-	buffer_put_int(&m, min);
-	buffer_put_int(&m, nbits);
-	buffer_put_int(&m, max);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u32(m, min)) != 0 ||
+	    (r = sshbuf_put_u32(m, nbits)) != 0 ||
+	    (r = sshbuf_put_u32(m, max)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_MODULI, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_MODULI, m);
 
 	debug3("%s: waiting for MONITOR_ANS_MODULI", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_MODULI, &m);
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_MODULI, m);
 
-	success = buffer_get_char(&m);
+	if ((r = sshbuf_get_u8(m, &success)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (success == 0)
 		fatal("%s: MONITOR_ANS_MODULI failed", __func__);
 
@@ -205,36 +206,43 @@
 		fatal("%s: BN_new failed", __func__);
 	if ((g = BN_new()) == NULL)
 		fatal("%s: BN_new failed", __func__);
-	buffer_get_bignum2(&m, p);
-	buffer_get_bignum2(&m, g);
+	if ((r = sshbuf_get_bignum2(m, p)) != 0 ||
+	    (r = sshbuf_get_bignum2(m, g)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	debug3("%s: remaining %d", __func__, buffer_len(&m));
-	buffer_free(&m);
+	debug3("%s: remaining %zu", __func__, sshbuf_len(m));
+	sshbuf_free(m);
 
 	return (dh_new_group(g, p));
 }
 #endif
 
 int
-mm_key_sign(Key *key, u_char **sigp, u_int *lenp,
-    const u_char *data, u_int datalen, const char *hostkey_alg)
+mm_sshkey_sign(struct sshkey *key, u_char **sigp, size_t *lenp,
+    const u_char *data, size_t datalen, const char *hostkey_alg, u_int compat)
 {
 	struct kex *kex = *pmonitor->m_pkex;
-	Buffer m;
+	struct sshbuf *m;
+	u_int ndx = kex->host_key_index(key, 0, active_state);
+	int r;
 
 	debug3("%s entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_int(&m, kex->host_key_index(key, 0, active_state));
-	buffer_put_string(&m, data, datalen);
-	buffer_put_cstring(&m, hostkey_alg);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u32(m, ndx)) != 0 ||
+	    (r = sshbuf_put_string(m, data, datalen)) != 0 ||
+	    (r = sshbuf_put_cstring(m, hostkey_alg)) != 0 ||
+	    (r = sshbuf_put_u32(m, compat)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SIGN, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SIGN, m);
 
 	debug3("%s: waiting for MONITOR_ANS_SIGN", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SIGN, &m);
-	*sigp  = buffer_get_string(&m, lenp);
-	buffer_free(&m);
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SIGN, m);
+	if ((r = sshbuf_get_string(m, sigp, lenp)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 
 	return (0);
 }
@@ -242,52 +250,81 @@
 struct passwd *
 mm_getpwnamallow(const char *username)
 {
-	Buffer m;
+	struct ssh *ssh = active_state;		/* XXX */
+	struct sshbuf *m;
 	struct passwd *pw;
-	u_int len, i;
+	size_t len;
+	u_int i;
 	ServerOptions *newopts;
+	int r;
+	u_char ok;
+	const u_char *p;
 
 	debug3("%s entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_cstring(&m, username);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_cstring(m, username)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PWNAM, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PWNAM, m);
 
 	debug3("%s: waiting for MONITOR_ANS_PWNAM", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PWNAM, &m);
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PWNAM, m);
 
-	if (buffer_get_char(&m) == 0) {
+	if ((r = sshbuf_get_u8(m, &ok)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (ok == 0) {
 		pw = NULL;
 		goto out;
 	}
-	pw = buffer_get_string(&m, &len);
-	if (len != sizeof(struct passwd))
+
+	/* XXX don't like passing struct passwd like this */
+	pw = xcalloc(sizeof(*pw), 1);
+	if ((r = sshbuf_get_string_direct(m, &p, &len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (len != sizeof(*pw))
 		fatal("%s: struct passwd size mismatch", __func__);
-	pw->pw_name = buffer_get_string(&m, NULL);
-	pw->pw_passwd = buffer_get_string(&m, NULL);
+	memcpy(pw, p, sizeof(*pw));
+
+	if ((r = sshbuf_get_cstring(m, &pw->pw_name, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &pw->pw_passwd, NULL)) != 0 ||
 #ifdef HAVE_STRUCT_PASSWD_PW_GECOS
-	pw->pw_gecos = buffer_get_string(&m, NULL);
+	    (r = sshbuf_get_cstring(m, &pw->pw_gecos, NULL)) != 0 ||
 #endif
 #ifdef HAVE_STRUCT_PASSWD_PW_CLASS
-	pw->pw_class = buffer_get_string(&m, NULL);
+	    (r = sshbuf_get_cstring(m, &pw->pw_class, NULL)) != 0 ||
 #endif
-	pw->pw_dir = buffer_get_string(&m, NULL);
-	pw->pw_shell = buffer_get_string(&m, NULL);
+	    (r = sshbuf_get_cstring(m, &pw->pw_dir, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &pw->pw_shell, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 out:
 	/* copy options block as a Match directive may have changed some */
-	newopts = buffer_get_string(&m, &len);
+	if ((r = sshbuf_get_string_direct(m, &p, &len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (len != sizeof(*newopts))
 		fatal("%s: option block size mismatch", __func__);
+	newopts = xcalloc(sizeof(*newopts), 1);
+	memcpy(newopts, p, sizeof(*newopts));
 
 #define M_CP_STROPT(x) do { \
-		if (newopts->x != NULL) \
-			newopts->x = buffer_get_string(&m, NULL); \
+		if (newopts->x != NULL) { \
+			if ((r = sshbuf_get_cstring(m, \
+			    &newopts->x, NULL)) != 0) \
+				fatal("%s: buffer error: %s", \
+				    __func__, ssh_err(r)); \
+		} \
 	} while (0)
 #define M_CP_STRARRAYOPT(x, nx) do { \
-		for (i = 0; i < newopts->nx; i++) \
-			newopts->x[i] = buffer_get_string(&m, NULL); \
+		newopts->x = newopts->nx == 0 ? \
+		    NULL : xcalloc(newopts->nx, sizeof(*newopts->x)); \
+		for (i = 0; i < newopts->nx; i++) { \
+			if ((r = sshbuf_get_cstring(m, \
+			    &newopts->x[i], NULL)) != 0) \
+				fatal("%s: buffer error: %s", \
+				    __func__, ssh_err(r)); \
+		} \
 	} while (0)
 	/* See comment in servconf.h */
 	COPY_MATCH_STRING_OPTS();
@@ -295,9 +332,11 @@
 #undef M_CP_STRARRAYOPT
 
 	copy_set_server_options(&options, newopts, 1);
+	log_change_level(options.log_level);
+	process_permitopen(ssh, &options);
 	free(newopts);
 
-	buffer_free(&m);
+	sshbuf_free(m);
 
 	return (pw);
 }
@@ -305,19 +344,22 @@
 char *
 mm_auth2_read_banner(void)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *banner;
+	int r;
 
 	debug3("%s entering", __func__);
 
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTH2_READ_BANNER, &m);
-	buffer_clear(&m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTH2_READ_BANNER, m);
+	sshbuf_reset(m);
 
 	mm_request_receive_expect(pmonitor->m_recvfd,
-	    MONITOR_ANS_AUTH2_READ_BANNER, &m);
-	banner = buffer_get_string(&m, NULL);
-	buffer_free(&m);
+	    MONITOR_ANS_AUTH2_READ_BANNER, m);
+	if ((r = sshbuf_get_cstring(m, &banner, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 
 	/* treat empty banner as missing banner */
 	if (strlen(banner) == 0) {
@@ -332,41 +374,55 @@
 void
 mm_inform_authserv(char *service, char *style)
 {
-	Buffer m;
+	struct sshbuf *m;
+	int r;
 
 	debug3("%s entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_cstring(&m, service);
-	buffer_put_cstring(&m, style ? style : "");
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_cstring(m, service)) != 0 ||
+	    (r = sshbuf_put_cstring(m, style ? style : "")) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHSERV, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHSERV, m);
 
-	buffer_free(&m);
+	sshbuf_free(m);
 }
 
 /* Do the password authentication */
 int
-mm_auth_password(Authctxt *authctxt, char *password)
+mm_auth_password(struct ssh *ssh, char *password)
 {
-	Buffer m;
-	int authenticated = 0;
+	struct sshbuf *m;
+	int r, authenticated = 0;
+#ifdef USE_PAM
+	u_int maxtries = 0;
+#endif
 
 	debug3("%s entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_cstring(&m, password);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHPASSWORD, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_cstring(m, password)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHPASSWORD, m);
 
 	debug3("%s: waiting for MONITOR_ANS_AUTHPASSWORD", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUTHPASSWORD, &m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_AUTHPASSWORD, m);
 
-	authenticated = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &authenticated)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 #ifdef USE_PAM
-	sshpam_set_maxtries_reached(buffer_get_int(&m));
+	if ((r = sshbuf_get_u32(m, &maxtries)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (maxtries > INT_MAX)
+		fatal("%s: bad maxtries %u", __func__, maxtries);
+	sshpam_set_maxtries_reached(maxtries);
 #endif
 
-	buffer_free(&m);
+	sshbuf_free(m);
 
 	debug3("%s: user %sauthenticated",
 	    __func__, authenticated ? "" : "not ");
@@ -374,57 +430,64 @@
 }
 
 int
-mm_user_key_allowed(struct passwd *pw, Key *key, int pubkey_auth_attempt)
+mm_user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key,
+    int pubkey_auth_attempt, struct sshauthopt **authoptp)
 {
 	return (mm_key_allowed(MM_USERKEY, NULL, NULL, key,
-	    pubkey_auth_attempt));
+	    pubkey_auth_attempt, authoptp));
 }
 
 int
 mm_hostbased_key_allowed(struct passwd *pw, const char *user, const char *host,
-    Key *key)
+    struct sshkey *key)
 {
-	return (mm_key_allowed(MM_HOSTKEY, user, host, key, 0));
+	return (mm_key_allowed(MM_HOSTKEY, user, host, key, 0, NULL));
 }
 
 int
 mm_key_allowed(enum mm_keytype type, const char *user, const char *host,
-    Key *key, int pubkey_auth_attempt)
+    struct sshkey *key, int pubkey_auth_attempt, struct sshauthopt **authoptp)
 {
-	Buffer m;
-	u_char *blob;
-	u_int len;
-	int allowed = 0, have_forced = 0;
+	struct sshbuf *m;
+	int r, allowed = 0;
+	struct sshauthopt *opts = NULL;
 
 	debug3("%s entering", __func__);
 
-	/* Convert the key to a blob and the pass it over */
-	if (!key_to_blob(key, &blob, &len))
-		return (0);
+	if (authoptp != NULL)
+		*authoptp = NULL;
 
-	buffer_init(&m);
-	buffer_put_int(&m, type);
-	buffer_put_cstring(&m, user ? user : "");
-	buffer_put_cstring(&m, host ? host : "");
-	buffer_put_string(&m, blob, len);
-	buffer_put_int(&m, pubkey_auth_attempt);
-	free(blob);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u32(m, type)) != 0 ||
+	    (r = sshbuf_put_cstring(m, user ? user : "")) != 0 ||
+	    (r = sshbuf_put_cstring(m, host ? host : "")) != 0 ||
+	    (r = sshkey_puts(key, m)) != 0 ||
+	    (r = sshbuf_put_u32(m, pubkey_auth_attempt)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KEYALLOWED, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KEYALLOWED, m);
 
 	debug3("%s: waiting for MONITOR_ANS_KEYALLOWED", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KEYALLOWED, &m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_KEYALLOWED, m);
 
-	allowed = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &allowed)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (allowed && type == MM_USERKEY) {
+		if ((r = sshauthopt_deserialise(m, &opts)) != 0)
+			fatal("%s: sshauthopt_deserialise: %s",
+			    __func__, ssh_err(r));
+	}
+	sshbuf_free(m);
 
-	/* fake forced command */
-	auth_clear_options();
-	have_forced = buffer_get_int(&m);
-	forced_command = have_forced ? xstrdup("true") : NULL;
+	if (authoptp != NULL) {
+		*authoptp = opts;
+		opts = NULL;
+	}
+	sshauthopt_free(opts);
 
-	buffer_free(&m);
-
-	return (allowed);
+	return allowed;
 }
 
 /*
@@ -434,35 +497,38 @@
  */
 
 int
-mm_key_verify(Key *key, u_char *sig, u_int siglen, u_char *data, u_int datalen)
+mm_sshkey_verify(const struct sshkey *key, const u_char *sig, size_t siglen,
+    const u_char *data, size_t datalen, const char *sigalg, u_int compat)
 {
-	Buffer m;
-	u_char *blob;
-	u_int len;
-	int verified = 0;
+	struct sshbuf *m;
+	u_int encoded_ret = 0;
+	int r;
 
 	debug3("%s entering", __func__);
 
-	/* Convert the key to a blob and the pass it over */
-	if (!key_to_blob(key, &blob, &len))
-		return (0);
 
-	buffer_init(&m);
-	buffer_put_string(&m, blob, len);
-	buffer_put_string(&m, sig, siglen);
-	buffer_put_string(&m, data, datalen);
-	free(blob);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshkey_puts(key, m)) != 0 ||
+	    (r = sshbuf_put_string(m, sig, siglen)) != 0 ||
+	    (r = sshbuf_put_string(m, data, datalen)) != 0 ||
+	    (r = sshbuf_put_cstring(m, sigalg == NULL ? "" : sigalg)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KEYVERIFY, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KEYVERIFY, m);
 
 	debug3("%s: waiting for MONITOR_ANS_KEYVERIFY", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KEYVERIFY, &m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_KEYVERIFY, m);
 
-	verified = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &encoded_ret)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	buffer_free(&m);
+	sshbuf_free(m);
 
-	return (verified);
+	if (encoded_ret != 0)
+		return SSH_ERR_SIGNATURE_INVALID;
+	return 0;
 }
 
 void
@@ -485,9 +551,9 @@
 int
 mm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, size_t namebuflen)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *p, *msg;
-	int success = 0, tmp1 = -1, tmp2 = -1;
+	int success = 0, tmp1 = -1, tmp2 = -1, r;
 
 	/* Kludge: ensure there are fds free to receive the pty/tty */
 	if ((tmp1 = dup(pmonitor->m_recvfd)) == -1 ||
@@ -502,26 +568,30 @@
 	close(tmp1);
 	close(tmp2);
 
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTY, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTY, m);
 
 	debug3("%s: waiting for MONITOR_ANS_PTY", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PTY, &m);
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PTY, m);
 
-	success = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &success)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (success == 0) {
 		debug3("%s: pty alloc failed", __func__);
-		buffer_free(&m);
+		sshbuf_free(m);
 		return (0);
 	}
-	p = buffer_get_string(&m, NULL);
-	msg = buffer_get_string(&m, NULL);
-	buffer_free(&m);
+	if ((r = sshbuf_get_cstring(m, &p, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &msg, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 
 	strlcpy(namebuf, p, namebuflen); /* Possible truncation */
 	free(p);
 
-	buffer_append(&loginmsg, msg, strlen(msg));
+	if ((r = sshbuf_put(loginmsg, msg, strlen(msg))) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	free(msg);
 
 	if ((*ptyfd = mm_receive_fd(pmonitor->m_recvfd)) == -1 ||
@@ -535,14 +605,17 @@
 void
 mm_session_pty_cleanup2(Session *s)
 {
-	Buffer m;
+	struct sshbuf *m;
+	int r;
 
 	if (s->ttyfd == -1)
 		return;
-	buffer_init(&m);
-	buffer_put_cstring(&m, s->tty);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTYCLEANUP, &m);
-	buffer_free(&m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_cstring(m, s->tty)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTYCLEANUP, m);
+	sshbuf_free(m);
 
 	/* closed dup'ed master */
 	if (s->ptymaster != -1 && close(s->ptymaster) < 0)
@@ -557,40 +630,44 @@
 void
 mm_start_pam(Authctxt *authctxt)
 {
-	Buffer m;
+	struct sshbuf *m;
 
 	debug3("%s entering", __func__);
 	if (!options.use_pam)
 		fatal("UsePAM=no, but ended up in %s anyway", __func__);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, m);
 
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, &m);
-
-	buffer_free(&m);
+	sshbuf_free(m);
 }
 
 u_int
 mm_do_pam_account(void)
 {
-	Buffer m;
+	struct sshbuf *m;
 	u_int ret;
 	char *msg;
+	size_t msglen;
+	int r;
 
 	debug3("%s entering", __func__);
 	if (!options.use_pam)
 		fatal("UsePAM=no, but ended up in %s anyway", __func__);
 
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_ACCOUNT, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_ACCOUNT, m);
 
 	mm_request_receive_expect(pmonitor->m_recvfd,
-	    MONITOR_ANS_PAM_ACCOUNT, &m);
-	ret = buffer_get_int(&m);
-	msg = buffer_get_string(&m, NULL);
-	buffer_append(&loginmsg, msg, strlen(msg));
-	free(msg);
+	    MONITOR_ANS_PAM_ACCOUNT, m);
+	if ((r = sshbuf_get_u32(m, &ret)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &msg, &msglen)) != 0 ||
+	    (r = sshbuf_put(loginmsg, msg, msglen)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	buffer_free(&m);
+	free(msg);
+	sshbuf_free(m);
 
 	debug3("%s returning %d", __func__, ret);
 
@@ -600,21 +677,24 @@
 void *
 mm_sshpam_init_ctx(Authctxt *authctxt)
 {
-	Buffer m;
-	int success;
+	struct sshbuf *m;
+	int r, success;
 
 	debug3("%s", __func__);
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, m);
 	debug3("%s: waiting for MONITOR_ANS_PAM_INIT_CTX", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_INIT_CTX, &m);
-	success = buffer_get_int(&m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_PAM_INIT_CTX, m);
+	if ((r = sshbuf_get_u32(m, &success)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (success == 0) {
 		debug3("%s: pam_init_ctx failed", __func__);
-		buffer_free(&m);
+		sshbuf_free(m);
 		return (NULL);
 	}
-	buffer_free(&m);
+	sshbuf_free(m);
 	return (authctxt);
 }
 
@@ -622,66 +702,79 @@
 mm_sshpam_query(void *ctx, char **name, char **info,
     u_int *num, char ***prompts, u_int **echo_on)
 {
-	Buffer m;
-	u_int i;
-	int ret;
+	struct sshbuf *m;
+	u_int i, n;
+	int r, ret;
 
 	debug3("%s", __func__);
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, m);
 	debug3("%s: waiting for MONITOR_ANS_PAM_QUERY", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_QUERY, &m);
-	ret = buffer_get_int(&m);
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_QUERY, m);
+	if ((r = sshbuf_get_u32(m, &ret)) != 0 ||
+	    (r = sshbuf_get_cstring(m, name, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(m, info, NULL)) != 0 ||
+	    (r = sshbuf_get_u32(m, &n)) != 0 ||
+	    (r = sshbuf_get_u32(m, num)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	debug3("%s: pam_query returned %d", __func__, ret);
-	*name = buffer_get_string(&m, NULL);
-	*info = buffer_get_string(&m, NULL);
-	sshpam_set_maxtries_reached(buffer_get_int(&m));
-	*num = buffer_get_int(&m);
+	sshpam_set_maxtries_reached(n);
 	if (*num > PAM_MAX_NUM_MSG)
-		fatal("%s: recieved %u PAM messages, expected <= %u",
+		fatal("%s: received %u PAM messages, expected <= %u",
 		    __func__, *num, PAM_MAX_NUM_MSG);
 	*prompts = xcalloc((*num + 1), sizeof(char *));
 	*echo_on = xcalloc((*num + 1), sizeof(u_int));
 	for (i = 0; i < *num; ++i) {
-		(*prompts)[i] = buffer_get_string(&m, NULL);
-		(*echo_on)[i] = buffer_get_int(&m);
+		if ((r = sshbuf_get_cstring(m, &((*prompts)[i]), NULL)) != 0 ||
+		    (r = sshbuf_get_u32(m, &((*echo_on)[i]))) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
-	buffer_free(&m);
+	sshbuf_free(m);
 	return (ret);
 }
 
 int
 mm_sshpam_respond(void *ctx, u_int num, char **resp)
 {
-	Buffer m;
-	u_int i;
-	int ret;
+	struct sshbuf *m;
+	u_int n, i;
+	int r, ret;
 
 	debug3("%s", __func__);
-	buffer_init(&m);
-	buffer_put_int(&m, num);
-	for (i = 0; i < num; ++i)
-		buffer_put_cstring(&m, resp[i]);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u32(m, num)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	for (i = 0; i < num; ++i) {
+		if ((r = sshbuf_put_cstring(m, resp[i])) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, m);
 	debug3("%s: waiting for MONITOR_ANS_PAM_RESPOND", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_RESPOND, &m);
-	ret = buffer_get_int(&m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_PAM_RESPOND, m);
+	if ((r = sshbuf_get_u32(m, &n)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	ret = (int)n; /* XXX */
 	debug3("%s: pam_respond returned %d", __func__, ret);
-	buffer_free(&m);
+	sshbuf_free(m);
 	return (ret);
 }
 
 void
 mm_sshpam_free_ctx(void *ctxtp)
 {
-	Buffer m;
+	struct sshbuf *m;
 
 	debug3("%s", __func__);
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, m);
 	debug3("%s: waiting for MONITOR_ANS_PAM_FREE_CTX", __func__);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_FREE_CTX, &m);
-	buffer_free(&m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_PAM_FREE_CTX, m);
+	sshbuf_free(m);
 }
 #endif /* USE_PAM */
 
@@ -690,11 +783,12 @@
 void
 mm_terminate(void)
 {
-	Buffer m;
+	struct sshbuf *m;
 
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_TERM, &m);
-	buffer_free(&m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_TERM, m);
+	sshbuf_free(m);
 }
 
 static void
@@ -713,27 +807,31 @@
 mm_bsdauth_query(void *ctx, char **name, char **infotxt,
    u_int *numprompts, char ***prompts, u_int **echo_on)
 {
-	Buffer m;
+	struct sshbuf *m;
 	u_int success;
 	char *challenge;
+	int r;
 
 	debug3("%s: entering", __func__);
 
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHQUERY, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHQUERY, m);
 
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_BSDAUTHQUERY,
-	    &m);
-	success = buffer_get_int(&m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_BSDAUTHQUERY, m);
+	if ((r = sshbuf_get_u32(m, &success)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (success == 0) {
 		debug3("%s: no challenge", __func__);
-		buffer_free(&m);
+		sshbuf_free(m);
 		return (-1);
 	}
 
 	/* Get the challenge, and format the response */
-	challenge  = buffer_get_string(&m, NULL);
-	buffer_free(&m);
+	if ((r = sshbuf_get_cstring(m, &challenge, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 
 	mm_chall_setup(name, infotxt, numprompts, prompts, echo_on);
 	(*prompts)[0] = challenge;
@@ -746,114 +844,62 @@
 int
 mm_bsdauth_respond(void *ctx, u_int numresponses, char **responses)
 {
-	Buffer m;
-	int authok;
+	struct sshbuf *m;
+	int r, authok;
 
 	debug3("%s: entering", __func__);
 	if (numresponses != 1)
 		return (-1);
 
-	buffer_init(&m);
-	buffer_put_cstring(&m, responses[0]);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHRESPOND, &m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_cstring(m, responses[0])) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHRESPOND, m);
 
 	mm_request_receive_expect(pmonitor->m_recvfd,
-	    MONITOR_ANS_BSDAUTHRESPOND, &m);
+	    MONITOR_ANS_BSDAUTHRESPOND, m);
 
-	authok = buffer_get_int(&m);
-	buffer_free(&m);
+	if ((r = sshbuf_get_u32(m, &authok)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 
 	return ((authok == 0) ? -1 : 0);
 }
 
-#ifdef SKEY
-int
-mm_skey_query(void *ctx, char **name, char **infotxt,
-   u_int *numprompts, char ***prompts, u_int **echo_on)
-{
-	Buffer m;
-	u_int success;
-	char *challenge;
-
-	debug3("%s: entering", __func__);
-
-	buffer_init(&m);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SKEYQUERY, &m);
-
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SKEYQUERY,
-	    &m);
-	success = buffer_get_int(&m);
-	if (success == 0) {
-		debug3("%s: no challenge", __func__);
-		buffer_free(&m);
-		return (-1);
-	}
-
-	/* Get the challenge, and format the response */
-	challenge  = buffer_get_string(&m, NULL);
-	buffer_free(&m);
-
-	debug3("%s: received challenge: %s", __func__, challenge);
-
-	mm_chall_setup(name, infotxt, numprompts, prompts, echo_on);
-
-	xasprintf(*prompts, "%s%s", challenge, SKEY_PROMPT);
-	free(challenge);
-
-	return (0);
-}
-
-int
-mm_skey_respond(void *ctx, u_int numresponses, char **responses)
-{
-	Buffer m;
-	int authok;
-
-	debug3("%s: entering", __func__);
-	if (numresponses != 1)
-		return (-1);
-
-	buffer_init(&m);
-	buffer_put_cstring(&m, responses[0]);
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SKEYRESPOND, &m);
-
-	mm_request_receive_expect(pmonitor->m_recvfd,
-	    MONITOR_ANS_SKEYRESPOND, &m);
-
-	authok = buffer_get_int(&m);
-	buffer_free(&m);
-
-	return ((authok == 0) ? -1 : 0);
-}
-#endif /* SKEY */
-
 #ifdef SSH_AUDIT_EVENTS
 void
 mm_audit_event(ssh_audit_event_t event)
 {
-	Buffer m;
+	struct sshbuf *m;
+	int r;
 
 	debug3("%s entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_int(&m, event);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u32(m, event)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_EVENT, &m);
-	buffer_free(&m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_EVENT, m);
+	sshbuf_free(m);
 }
 
 void
 mm_audit_run_command(const char *command)
 {
-	Buffer m;
+	struct sshbuf *m;
+	int r;
 
 	debug3("%s entering command %s", __func__, command);
 
-	buffer_init(&m);
-	buffer_put_cstring(&m, command);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_cstring(m, command)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_COMMAND, &m);
-	buffer_free(&m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_COMMAND, m);
+	sshbuf_free(m);
 }
 #endif /* SSH_AUDIT_EVENTS */
 
@@ -861,45 +907,55 @@
 OM_uint32
 mm_ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID goid)
 {
-	Buffer m;
+	struct sshbuf *m;
 	OM_uint32 major;
+	int r;
 
 	/* Client doesn't get to see the context */
 	*ctx = NULL;
 
-	buffer_init(&m);
-	buffer_put_string(&m, goid->elements, goid->length);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_string(m, goid->elements, goid->length)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSETUP, &m);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSETUP, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSETUP, m);
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSETUP, m);
 
-	major = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &major)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	buffer_free(&m);
+	sshbuf_free(m);
 	return (major);
 }
 
 OM_uint32
 mm_ssh_gssapi_accept_ctx(Gssctxt *ctx, gss_buffer_desc *in,
-    gss_buffer_desc *out, OM_uint32 *flags)
+    gss_buffer_desc *out, OM_uint32 *flagsp)
 {
-	Buffer m;
+	struct sshbuf *m;
 	OM_uint32 major;
-	u_int len;
+	u_int flags;
+	int r;
 
-	buffer_init(&m);
-	buffer_put_string(&m, in->value, in->length);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_string(m, in->value, in->length)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSTEP, &m);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSTEP, &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSTEP, m);
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSTEP, m);
 
-	major = buffer_get_int(&m);
-	out->value = buffer_get_string(&m, &len);
-	out->length = len;
-	if (flags)
-		*flags = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &major)) != 0 ||
+	    (r = ssh_gssapi_get_buffer_desc(m, out)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (flagsp != NULL) {
+		if ((r = sshbuf_get_u32(m, &flags)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+		*flagsp = flags;
+	}
 
-	buffer_free(&m);
+	sshbuf_free(m);
 
 	return (major);
 }
@@ -907,39 +963,44 @@
 OM_uint32
 mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
 {
-	Buffer m;
+	struct sshbuf *m;
 	OM_uint32 major;
+	int r;
 
-	buffer_init(&m);
-	buffer_put_string(&m, gssbuf->value, gssbuf->length);
-	buffer_put_string(&m, gssmic->value, gssmic->length);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_string(m, gssbuf->value, gssbuf->length)) != 0 ||
+	    (r = sshbuf_put_string(m, gssmic->value, gssmic->length)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSCHECKMIC, &m);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSCHECKMIC,
-	    &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSCHECKMIC, m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_GSSCHECKMIC, m);
 
-	major = buffer_get_int(&m);
-	buffer_free(&m);
+	if ((r = sshbuf_get_u32(m, &major)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 	return(major);
 }
 
 int
 mm_ssh_gssapi_userok(char *user)
 {
-	Buffer m;
-	int authenticated = 0;
+	struct sshbuf *m;
+	int r, authenticated = 0;
 
-	buffer_init(&m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 
-	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUSEROK, &m);
-	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSUSEROK,
-				  &m);
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUSEROK, m);
+	mm_request_receive_expect(pmonitor->m_recvfd,
+	    MONITOR_ANS_GSSUSEROK, m);
 
-	authenticated = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &authenticated)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	buffer_free(&m);
+	sshbuf_free(m);
 	debug3("%s: user %sauthenticated",__func__, authenticated ? "" : "not ");
 	return (authenticated);
 }
 #endif /* GSSAPI */
-
diff --git a/monitor_wrap.h b/monitor_wrap.h
index e13f5ea..2135a06 100644
--- a/monitor_wrap.h
+++ b/monitor_wrap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor_wrap.h,v 1.32 2016/09/28 16:33:07 djm Exp $ */
+/* $OpenBSD: monitor_wrap.h,v 1.38 2018/07/11 18:53:29 markus Exp $ */
 
 /*
  * Copyright 2002 Niels Provos <provos@citi.umich.edu>
@@ -35,22 +35,27 @@
 enum mm_keytype { MM_NOKEY, MM_HOSTKEY, MM_USERKEY };
 
 struct monitor;
-struct mm_master;
 struct Authctxt;
+struct sshkey;
+struct sshauthopt;
 
 void mm_log_handler(LogLevel, const char *, void *);
 int mm_is_monitor(void);
 DH *mm_choose_dh(int, int, int);
-int mm_key_sign(Key *, u_char **, u_int *, const u_char *, u_int, const char *);
+int mm_sshkey_sign(struct sshkey *, u_char **, size_t *, const u_char *, size_t,
+    const char *, u_int compat);
 void mm_inform_authserv(char *, char *);
 struct passwd *mm_getpwnamallow(const char *);
 char *mm_auth2_read_banner(void);
-int mm_auth_password(struct Authctxt *, char *);
-int mm_key_allowed(enum mm_keytype, const char *, const char *, Key *, int);
-int mm_user_key_allowed(struct passwd *, Key *, int);
+int mm_auth_password(struct ssh *, char *);
+int mm_key_allowed(enum mm_keytype, const char *, const char *, struct sshkey *,
+    int, struct sshauthopt **);
+int mm_user_key_allowed(struct ssh *, struct passwd *, struct sshkey *, int,
+    struct sshauthopt **);
 int mm_hostbased_key_allowed(struct passwd *, const char *,
-    const char *, Key *);
-int mm_key_verify(Key *, u_char *, u_int, u_char *, u_int);
+    const char *, struct sshkey *);
+int mm_sshkey_verify(const struct sshkey *, const u_char *, size_t,
+    const u_char *, size_t, const char *, u_int);
 
 #ifdef GSSAPI
 OM_uint32 mm_ssh_gssapi_server_ctx(Gssctxt **, gss_OID);
@@ -84,6 +89,7 @@
 struct newkeys *mm_newkeys_from_blob(u_char *, int);
 int mm_newkeys_to_blob(int, u_char **, u_int *);
 
+void monitor_clear_keystate(struct monitor *);
 void monitor_apply_keystate(struct monitor *);
 void mm_get_keystate(struct monitor *);
 void mm_send_keystate(struct monitor*);
@@ -92,8 +98,4 @@
 int mm_bsdauth_query(void *, char **, char **, u_int *, char ***, u_int **);
 int mm_bsdauth_respond(void *, u_int, char **);
 
-/* skey */
-int mm_skey_query(void *, char **, char **, u_int *, char ***, u_int **);
-int mm_skey_respond(void *, u_int, char **);
-
 #endif /* _MM_WRAP_H_ */
diff --git a/msg.c b/msg.c
index 5a7b8ca..1bd20f3 100644
--- a/msg.c
+++ b/msg.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: msg.c,v 1.16 2015/01/15 09:40:00 djm Exp $ */
+/* $OpenBSD: msg.c,v 1.17 2018/07/09 21:59:10 markus Exp $ */
 /*
  * Copyright (c) 2002 Markus Friedl.  All rights reserved.
  *
@@ -55,7 +55,7 @@
 		error("ssh_msg_send: write");
 		return (-1);
 	}
-	if (atomicio(vwrite, fd, (u_char *)sshbuf_ptr(m), mlen) != mlen) {
+	if (atomicio(vwrite, fd, sshbuf_mutable_ptr(m), mlen) != mlen) {
 		error("ssh_msg_send: write");
 		return (-1);
 	}
diff --git a/mux.c b/mux.c
index 2d6639c..e607acd 100644
--- a/mux.c
+++ b/mux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mux.c,v 1.64 2017/01/21 11:32:04 guenther Exp $ */
+/* $OpenBSD: mux.c,v 1.75 2018/07/31 03:07:24 djm Exp $ */
 /*
  * Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org>
  *
@@ -70,13 +70,13 @@
 #include "pathnames.h"
 #include "misc.h"
 #include "match.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "channels.h"
 #include "msg.h"
 #include "packet.h"
 #include "monitor_fdpass.h"
 #include "sshpty.h"
-#include "key.h"
+#include "sshkey.h"
 #include "readconf.h"
 #include "clientloop.h"
 #include "ssherr.h"
@@ -87,7 +87,7 @@
 extern int stdin_null_flag;
 extern char *host;
 extern int subsystem_flag;
-extern Buffer command;
+extern struct sshbuf *command;
 extern volatile sig_atomic_t quit_pending;
 
 /* Context for session open confirmation callback */
@@ -96,7 +96,7 @@
 	u_int want_subsys;
 	u_int want_x_fwd;
 	u_int want_agent_fwd;
-	Buffer cmd;
+	struct sshbuf *cmd;
 	char *term;
 	struct termios tio;
 	char **env;
@@ -161,22 +161,32 @@
 #define MUX_FWD_REMOTE  2
 #define MUX_FWD_DYNAMIC 3
 
-static void mux_session_confirm(int, int, void *);
-static void mux_stdio_confirm(int, int, void *);
+static void mux_session_confirm(struct ssh *, int, int, void *);
+static void mux_stdio_confirm(struct ssh *, int, int, void *);
 
-static int process_mux_master_hello(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_new_session(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_alive_check(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_terminate(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_open_fwd(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_close_fwd(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_stdio_fwd(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_stop_listening(u_int, Channel *, Buffer *, Buffer *);
-static int process_mux_proxy(u_int, Channel *, Buffer *, Buffer *);
+static int process_mux_master_hello(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_new_session(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_alive_check(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_terminate(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_open_fwd(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_close_fwd(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_stdio_fwd(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_stop_listening(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
+static int process_mux_proxy(struct ssh *, u_int,
+	    Channel *, struct sshbuf *, struct sshbuf *);
 
 static const struct {
 	u_int type;
-	int (*handler)(u_int, Channel *, Buffer *, Buffer *);
+	int (*handler)(struct ssh *, u_int, Channel *,
+	    struct sshbuf *, struct sshbuf *);
 } mux_master_handlers[] = {
 	{ MUX_MSG_HELLO, process_mux_master_hello },
 	{ MUX_C_NEW_SESSION, process_mux_new_session },
@@ -193,52 +203,54 @@
 /* Cleanup callback fired on closure of mux slave _session_ channel */
 /* ARGSUSED */
 static void
-mux_master_session_cleanup_cb(int cid, void *unused)
+mux_master_session_cleanup_cb(struct ssh *ssh, int cid, void *unused)
 {
-	Channel *cc, *c = channel_by_id(cid);
+	Channel *cc, *c = channel_by_id(ssh, cid);
 
 	debug3("%s: entering for channel %d", __func__, cid);
 	if (c == NULL)
 		fatal("%s: channel_by_id(%i) == NULL", __func__, cid);
 	if (c->ctl_chan != -1) {
-		if ((cc = channel_by_id(c->ctl_chan)) == NULL)
+		if ((cc = channel_by_id(ssh, c->ctl_chan)) == NULL)
 			fatal("%s: channel %d missing control channel %d",
 			    __func__, c->self, c->ctl_chan);
 		c->ctl_chan = -1;
-		cc->remote_id = -1;
-		chan_rcvd_oclose(cc);
+		cc->remote_id = 0;
+		cc->have_remote_id = 0;
+		chan_rcvd_oclose(ssh, cc);
 	}
-	channel_cancel_cleanup(c->self);
+	channel_cancel_cleanup(ssh, c->self);
 }
 
 /* Cleanup callback fired on closure of mux slave _control_ channel */
 /* ARGSUSED */
 static void
-mux_master_control_cleanup_cb(int cid, void *unused)
+mux_master_control_cleanup_cb(struct ssh *ssh, int cid, void *unused)
 {
-	Channel *sc, *c = channel_by_id(cid);
+	Channel *sc, *c = channel_by_id(ssh, cid);
 
 	debug3("%s: entering for channel %d", __func__, cid);
 	if (c == NULL)
 		fatal("%s: channel_by_id(%i) == NULL", __func__, cid);
-	if (c->remote_id != -1) {
-		if ((sc = channel_by_id(c->remote_id)) == NULL)
-			fatal("%s: channel %d missing session channel %d",
+	if (c->have_remote_id) {
+		if ((sc = channel_by_id(ssh, c->remote_id)) == NULL)
+			fatal("%s: channel %d missing session channel %u",
 			    __func__, c->self, c->remote_id);
-		c->remote_id = -1;
+		c->remote_id = 0;
+		c->have_remote_id = 0;
 		sc->ctl_chan = -1;
 		if (sc->type != SSH_CHANNEL_OPEN &&
 		    sc->type != SSH_CHANNEL_OPENING) {
 			debug2("%s: channel %d: not open", __func__, sc->self);
-			chan_mark_dead(sc);
+			chan_mark_dead(ssh, sc);
 		} else {
 			if (sc->istate == CHAN_INPUT_OPEN)
-				chan_read_failed(sc);
+				chan_read_failed(ssh, sc);
 			if (sc->ostate == CHAN_OUTPUT_OPEN)
-				chan_write_failed(sc);
+				chan_write_failed(ssh, sc);
 		}
 	}
-	channel_cancel_cleanup(c->self);
+	channel_cancel_cleanup(ssh, c->self);
 }
 
 /* Check mux client environment variables before passing them to mux master. */
@@ -266,10 +278,12 @@
 /* Mux master protocol message handlers */
 
 static int
-process_mux_master_hello(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_master_hello(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
 	u_int ver;
 	struct mux_master_state *state = (struct mux_master_state *)c->mux_ctx;
+	int r;
 
 	if (state == NULL)
 		fatal("%s: channel %d: c->mux_ctx == NULL", __func__, c->self);
@@ -277,9 +291,8 @@
 		error("%s: HELLO received twice", __func__);
 		return -1;
 	}
-	if (buffer_get_int_ret(&ver, m) != 0) {
- malf:
-		error("%s: malformed message", __func__);
+	if ((r = sshbuf_get_u32(m, &ver)) != 0) {
+		error("%s: malformed message: %s", __func__, ssh_err(r));
 		return -1;
 	}
 	if (ver != SSHMUX_VER) {
@@ -290,50 +303,72 @@
 	debug2("%s: channel %d slave version %u", __func__, c->self, ver);
 
 	/* No extensions are presently defined */
-	while (buffer_len(m) > 0) {
-		char *name = buffer_get_string_ret(m, NULL);
-		char *value = buffer_get_string_ret(m, NULL);
+	while (sshbuf_len(m) > 0) {
+		char *name = NULL;
 
-		if (name == NULL || value == NULL) {
-			free(name);
-			free(value);
-			goto malf;
+		if ((r = sshbuf_get_cstring(m, &name, NULL)) != 0 ||
+		    (r = sshbuf_skip_string(m)) != 0) { /* value */
+			error("%s: malformed extension: %s",
+			    __func__, ssh_err(r));
+			return -1;
 		}
 		debug2("Unrecognised slave extension \"%s\"", name);
 		free(name);
-		free(value);
 	}
 	state->hello_rcvd = 1;
 	return 0;
 }
 
+/* Enqueue a "ok" response to the reply buffer */
+static void
+reply_ok(struct sshbuf *reply, u_int rid)
+{
+	int r;
+
+	if ((r = sshbuf_put_u32(reply, MUX_S_OK)) != 0 ||
+	    (r = sshbuf_put_u32(reply, rid)) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
+}
+
+/* Enqueue an error response to the reply buffer */
+static void
+reply_error(struct sshbuf *reply, u_int type, u_int rid, const char *msg)
+{
+	int r;
+
+	if ((r = sshbuf_put_u32(reply, type)) != 0 ||
+	    (r = sshbuf_put_u32(reply, rid)) != 0 ||
+	    (r = sshbuf_put_cstring(reply, msg)) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
+}
+
 static int
-process_mux_new_session(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_new_session(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
 	Channel *nc;
 	struct mux_session_confirm_ctx *cctx;
-	char *reserved, *cmd, *cp;
-	u_int i, j, len, env_len, escape_char, window, packetmax;
-	int new_fd[3];
+	char *cmd, *cp;
+	u_int i, j, env_len, escape_char, window, packetmax;
+	int r, new_fd[3];
 
 	/* Reply for SSHMUX_COMMAND_OPEN */
 	cctx = xcalloc(1, sizeof(*cctx));
 	cctx->term = NULL;
 	cctx->rid = rid;
-	cmd = reserved = NULL;
+	cmd = NULL;
 	cctx->env = NULL;
 	env_len = 0;
-	if ((reserved = buffer_get_string_ret(m, NULL)) == NULL ||
-	    buffer_get_int_ret(&cctx->want_tty, m) != 0 ||
-	    buffer_get_int_ret(&cctx->want_x_fwd, m) != 0 ||
-	    buffer_get_int_ret(&cctx->want_agent_fwd, m) != 0 ||
-	    buffer_get_int_ret(&cctx->want_subsys, m) != 0 ||
-	    buffer_get_int_ret(&escape_char, m) != 0 ||
-	    (cctx->term = buffer_get_string_ret(m, &len)) == NULL ||
-	    (cmd = buffer_get_string_ret(m, &len)) == NULL) {
+	if ((r = sshbuf_skip_string(m)) != 0 || /* reserved */
+	    (r = sshbuf_get_u32(m, &cctx->want_tty)) != 0 ||
+	    (r = sshbuf_get_u32(m, &cctx->want_x_fwd)) != 0 ||
+	    (r = sshbuf_get_u32(m, &cctx->want_agent_fwd)) != 0 ||
+	    (r = sshbuf_get_u32(m, &cctx->want_subsys)) != 0 ||
+	    (r = sshbuf_get_u32(m, &escape_char)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &cctx->term, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &cmd, NULL)) != 0) {
  malf:
 		free(cmd);
-		free(reserved);
 		for (j = 0; j < env_len; j++)
 			free(cctx->env[j]);
 		free(cctx->env);
@@ -342,12 +377,10 @@
 		error("%s: malformed message", __func__);
 		return -1;
 	}
-	free(reserved);
-	reserved = NULL;
 
-	while (buffer_len(m) > 0) {
 #define MUX_MAX_ENV_VARS	4096
-		if ((cp = buffer_get_string_ret(m, &len)) == NULL)
+	while (sshbuf_len(m) > 0) {
+		if ((r = sshbuf_get_cstring(m, &cp, NULL)) != 0)
 			goto malf;
 		if (!env_permitted(cp)) {
 			free(cp);
@@ -369,8 +402,10 @@
 	    cctx->want_tty, cctx->want_x_fwd, cctx->want_agent_fwd,
 	    cctx->want_subsys, cctx->term, cmd, env_len);
 
-	buffer_init(&cctx->cmd);
-	buffer_append(&cctx->cmd, cmd, strlen(cmd));
+	if ((cctx->cmd = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put(cctx->cmd, cmd, strlen(cmd))) != 0)
+		fatal("%s: sshbuf_put: %s", __func__, ssh_err(r));
 	free(cmd);
 	cmd = NULL;
 
@@ -385,13 +420,9 @@
 				free(cctx->env[j]);
 			free(cctx->env);
 			free(cctx->term);
-			buffer_free(&cctx->cmd);
+			sshbuf_free(cctx->cmd);
 			free(cctx);
-
-			/* prepare reply */
-			buffer_put_int(r, MUX_S_FAILURE);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r,
+			reply_error(reply, MUX_S_FAILURE, rid,
 			    "did not receive file descriptors");
 			return -1;
 		}
@@ -401,12 +432,10 @@
 	    new_fd[0], new_fd[1], new_fd[2]);
 
 	/* XXX support multiple child sessions in future */
-	if (c->remote_id != -1) {
+	if (c->have_remote_id) {
 		debug2("%s: session already open", __func__);
-		/* prepare reply */
-		buffer_put_int(r, MUX_S_FAILURE);
-		buffer_put_int(r, rid);
-		buffer_put_cstring(r, "Multiple sessions not supported");
+		reply_error(reply, MUX_S_FAILURE, rid,
+		    "Multiple sessions not supported");
  cleanup:
 		close(new_fd[0]);
 		close(new_fd[1]);
@@ -417,7 +446,7 @@
 				free(cctx->env[i]);
 			free(cctx->env);
 		}
-		buffer_free(&cctx->cmd);
+		sshbuf_free(cctx->cmd);
 		free(cctx);
 		return 0;
 	}
@@ -426,10 +455,8 @@
 	    options.control_master == SSHCTL_MASTER_AUTO_ASK) {
 		if (!ask_permission("Allow shared connection to %s? ", host)) {
 			debug2("%s: session refused by user", __func__);
-			/* prepare reply */
-			buffer_put_int(r, MUX_S_PERMISSION_DENIED);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r, "Permission denied");
+			reply_error(reply, MUX_S_PERMISSION_DENIED, rid,
+			    "Permission denied");
 			goto cleanup;
 		}
 	}
@@ -453,15 +480,16 @@
 		packetmax >>= 1;
 	}
 
-	nc = channel_new("session", SSH_CHANNEL_OPENING,
+	nc = channel_new(ssh, "session", SSH_CHANNEL_OPENING,
 	    new_fd[0], new_fd[1], new_fd[2], window, packetmax,
 	    CHAN_EXTENDED_WRITE, "client-session", /*nonblock*/0);
 
 	nc->ctl_chan = c->self;		/* link session -> control channel */
 	c->remote_id = nc->self; 	/* link control -> session channel */
+	c->have_remote_id = 1;
 
 	if (cctx->want_tty && escape_char != 0xffffffff) {
-		channel_register_filter(nc->self,
+		channel_register_filter(ssh, nc->self,
 		    client_simple_escape_filter, NULL,
 		    client_filter_cleanup,
 		    client_new_escape_filter_ctx((int)escape_char));
@@ -470,30 +498,36 @@
 	debug2("%s: channel_new: %d linked to control channel %d",
 	    __func__, nc->self, nc->ctl_chan);
 
-	channel_send_open(nc->self);
-	channel_register_open_confirm(nc->self, mux_session_confirm, cctx);
+	channel_send_open(ssh, nc->self);
+	channel_register_open_confirm(ssh, nc->self, mux_session_confirm, cctx);
 	c->mux_pause = 1; /* stop handling messages until open_confirm done */
-	channel_register_cleanup(nc->self, mux_master_session_cleanup_cb, 1);
+	channel_register_cleanup(ssh, nc->self,
+	    mux_master_session_cleanup_cb, 1);
 
 	/* reply is deferred, sent by mux_session_confirm */
 	return 0;
 }
 
 static int
-process_mux_alive_check(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_alive_check(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
+	int r;
+
 	debug2("%s: channel %d: alive check", __func__, c->self);
 
 	/* prepare reply */
-	buffer_put_int(r, MUX_S_ALIVE);
-	buffer_put_int(r, rid);
-	buffer_put_int(r, (u_int)getpid());
+	if ((r = sshbuf_put_u32(reply, MUX_S_ALIVE)) != 0 ||
+	    (r = sshbuf_put_u32(reply, rid)) != 0 ||
+	    (r = sshbuf_put_u32(reply, (u_int)getpid())) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
 
 	return 0;
 }
 
 static int
-process_mux_terminate(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_terminate(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
 	debug2("%s: channel %d: terminate request", __func__, c->self);
 
@@ -502,16 +536,14 @@
 		if (!ask_permission("Terminate shared connection to %s? ",
 		    host)) {
 			debug2("%s: termination refused by user", __func__);
-			buffer_put_int(r, MUX_S_PERMISSION_DENIED);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r, "Permission denied");
+			reply_error(reply, MUX_S_PERMISSION_DENIED, rid,
+			    "Permission denied");
 			return 0;
 		}
 	}
 
 	quit_pending = 1;
-	buffer_put_int(r, MUX_S_OK);
-	buffer_put_int(r, rid);
+	reply_ok(reply, rid);
 	/* XXX exit happens too soon - message never makes it to client */
 	return 0;
 }
@@ -582,20 +614,22 @@
 }
 
 static void
-mux_confirm_remote_forward(int type, u_int32_t seq, void *ctxt)
+mux_confirm_remote_forward(struct ssh *ssh, int type, u_int32_t seq, void *ctxt)
 {
 	struct mux_channel_confirm_ctx *fctx = ctxt;
 	char *failmsg = NULL;
 	struct Forward *rfwd;
 	Channel *c;
-	Buffer out;
+	struct sshbuf *out;
+	int r;
 
-	if ((c = channel_by_id(fctx->cid)) == NULL) {
+	if ((c = channel_by_id(ssh, fctx->cid)) == NULL) {
 		/* no channel for reply */
 		error("%s: unknown channel", __func__);
 		return;
 	}
-	buffer_init(&out);
+	if ((out = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
 	if (fctx->fid >= options.num_remote_forwards ||
 	    (options.remote_forwards[fctx->fid].connect_path == NULL &&
 	    options.remote_forwards[fctx->fid].connect_host == NULL)) {
@@ -613,19 +647,21 @@
 			debug("Allocated port %u for mux remote forward"
 			    " to %s:%d", rfwd->allocated_port,
 			    rfwd->connect_host, rfwd->connect_port);
-			buffer_put_int(&out, MUX_S_REMOTE_PORT);
-			buffer_put_int(&out, fctx->rid);
-			buffer_put_int(&out, rfwd->allocated_port);
-			channel_update_permitted_opens(rfwd->handle,
+			if ((r = sshbuf_put_u32(out,
+			    MUX_S_REMOTE_PORT)) != 0 ||
+			    (r = sshbuf_put_u32(out, fctx->rid)) != 0 ||
+			    (r = sshbuf_put_u32(out,
+			    rfwd->allocated_port)) != 0)
+				fatal("%s: reply: %s", __func__, ssh_err(r));
+			channel_update_permission(ssh, rfwd->handle,
 			   rfwd->allocated_port);
 		} else {
-			buffer_put_int(&out, MUX_S_OK);
-			buffer_put_int(&out, fctx->rid);
+			reply_ok(out, fctx->rid);
 		}
 		goto out;
 	} else {
 		if (rfwd->listen_port == 0)
-			channel_update_permitted_opens(rfwd->handle, -1);
+			channel_update_permission(ssh, rfwd->handle, -1);
 		if (rfwd->listen_path != NULL)
 			xasprintf(&failmsg, "remote port forwarding failed for "
 			    "listen path %s", rfwd->listen_path);
@@ -646,36 +682,36 @@
 	}
  fail:
 	error("%s: %s", __func__, failmsg);
-	buffer_put_int(&out, MUX_S_FAILURE);
-	buffer_put_int(&out, fctx->rid);
-	buffer_put_cstring(&out, failmsg);
+	reply_error(out, MUX_S_FAILURE, fctx->rid, failmsg);
 	free(failmsg);
  out:
-	buffer_put_string(&c->output, buffer_ptr(&out), buffer_len(&out));
-	buffer_free(&out);
+	if ((r = sshbuf_put_stringb(c->output, out)) != 0)
+		fatal("%s: sshbuf_put_stringb: %s", __func__, ssh_err(r));
+	sshbuf_free(out);
 	if (c->mux_pause <= 0)
 		fatal("%s: mux_pause %d", __func__, c->mux_pause);
 	c->mux_pause = 0; /* start processing messages again */
 }
 
 static int
-process_mux_open_fwd(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_open_fwd(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
 	struct Forward fwd;
 	char *fwd_desc = NULL;
 	char *listen_addr, *connect_addr;
 	u_int ftype;
 	u_int lport, cport;
-	int i, ret = 0, freefwd = 1;
+	int r, i, ret = 0, freefwd = 1;
 
 	memset(&fwd, 0, sizeof(fwd));
 
 	/* XXX - lport/cport check redundant */
-	if (buffer_get_int_ret(&ftype, m) != 0 ||
-	    (listen_addr = buffer_get_string_ret(m, NULL)) == NULL ||
-	    buffer_get_int_ret(&lport, m) != 0 ||
-	    (connect_addr = buffer_get_string_ret(m, NULL)) == NULL ||
-	    buffer_get_int_ret(&cport, m) != 0 ||
+	if ((r = sshbuf_get_u32(m, &ftype)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &listen_addr, NULL)) != 0 ||
+	    (r = sshbuf_get_u32(m, &lport)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &connect_addr, NULL)) != 0 ||
+	    (r = sshbuf_get_u32(m, &cport)) != 0 ||
 	    (lport != (u_int)PORT_STREAMLOCAL && lport > 65535) ||
 	    (cport != (u_int)PORT_STREAMLOCAL && cport > 65535)) {
 		error("%s: malformed message", __func__);
@@ -712,9 +748,8 @@
  invalid:
 		free(listen_addr);
 		free(connect_addr);
-		buffer_put_int(r, MUX_S_FAILURE);
-		buffer_put_int(r, rid);
-		buffer_put_cstring(r, "Invalid forwarding request");
+		reply_error(reply, MUX_S_FAILURE, rid,
+		    "Invalid forwarding request");
 		return 0;
 	}
 	if (ftype == MUX_FWD_DYNAMIC && fwd.listen_path) {
@@ -727,13 +762,16 @@
 		    fwd.listen_port);
 		goto invalid;
 	}
-	if ((fwd.connect_port != PORT_STREAMLOCAL && fwd.connect_port >= 65536)
-	    || (ftype != MUX_FWD_DYNAMIC && ftype != MUX_FWD_REMOTE && fwd.connect_port == 0)) {
+	if ((fwd.connect_port != PORT_STREAMLOCAL &&
+	    fwd.connect_port >= 65536) ||
+	    (ftype != MUX_FWD_DYNAMIC && ftype != MUX_FWD_REMOTE &&
+	    fwd.connect_port == 0)) {
 		logit("%s: invalid connect port %u", __func__,
 		    fwd.connect_port);
 		goto invalid;
 	}
-	if (ftype != MUX_FWD_DYNAMIC && fwd.connect_host == NULL && fwd.connect_path == NULL) {
+	if (ftype != MUX_FWD_DYNAMIC && fwd.connect_host == NULL &&
+	    fwd.connect_path == NULL) {
 		logit("%s: missing connect host", __func__);
 		goto invalid;
 	}
@@ -748,26 +786,25 @@
  exists:
 				debug2("%s: found existing forwarding",
 				    __func__);
-				buffer_put_int(r, MUX_S_OK);
-				buffer_put_int(r, rid);
+				reply_ok(reply, rid);
 				goto out;
 			}
 		}
 		break;
 	case MUX_FWD_REMOTE:
 		for (i = 0; i < options.num_remote_forwards; i++) {
-			if (compare_forward(&fwd,
-			    options.remote_forwards + i)) {
-				if (fwd.listen_port != 0)
-					goto exists;
-				debug2("%s: found allocated port",
-				    __func__);
-				buffer_put_int(r, MUX_S_REMOTE_PORT);
-				buffer_put_int(r, rid);
-				buffer_put_int(r,
-				    options.remote_forwards[i].allocated_port);
-				goto out;
-			}
+			if (!compare_forward(&fwd, options.remote_forwards + i))
+				continue;
+			if (fwd.listen_port != 0)
+				goto exists;
+			debug2("%s: found allocated port", __func__);
+			if ((r = sshbuf_put_u32(reply,
+			    MUX_S_REMOTE_PORT)) != 0 ||
+			    (r = sshbuf_put_u32(reply, rid)) != 0 ||
+			    (r = sshbuf_put_u32(reply,
+			    options.remote_forwards[i].allocated_port)) != 0)
+				fatal("%s: reply: %s", __func__, ssh_err(r));
+			goto out;
 		}
 		break;
 	}
@@ -776,21 +813,19 @@
 	    options.control_master == SSHCTL_MASTER_AUTO_ASK) {
 		if (!ask_permission("Open %s on %s?", fwd_desc, host)) {
 			debug2("%s: forwarding refused by user", __func__);
-			buffer_put_int(r, MUX_S_PERMISSION_DENIED);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r, "Permission denied");
+			reply_error(reply, MUX_S_PERMISSION_DENIED, rid,
+			    "Permission denied");
 			goto out;
 		}
 	}
 
 	if (ftype == MUX_FWD_LOCAL || ftype == MUX_FWD_DYNAMIC) {
-		if (!channel_setup_local_fwd_listener(&fwd,
+		if (!channel_setup_local_fwd_listener(ssh, &fwd,
 		    &options.fwd_opts)) {
  fail:
 			logit("slave-requested %s failed", fwd_desc);
-			buffer_put_int(r, MUX_S_FAILURE);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r, "Port forwarding failed");
+			reply_error(reply, MUX_S_FAILURE, rid,
+			    "Port forwarding failed");
 			goto out;
 		}
 		add_local_forward(&options, &fwd);
@@ -798,7 +833,7 @@
 	} else {
 		struct mux_channel_confirm_ctx *fctx;
 
-		fwd.handle = channel_request_remote_forwarding(&fwd);
+		fwd.handle = channel_request_remote_forwarding(ssh, &fwd);
 		if (fwd.handle < 0)
 			goto fail;
 		add_remote_forward(&options, &fwd);
@@ -813,8 +848,7 @@
 		/* delayed reply in mux_confirm_remote_forward */
 		goto out;
 	}
-	buffer_put_int(r, MUX_S_OK);
-	buffer_put_int(r, rid);
+	reply_ok(reply, rid);
  out:
 	free(fwd_desc);
 	if (freefwd) {
@@ -827,23 +861,24 @@
 }
 
 static int
-process_mux_close_fwd(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_close_fwd(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
 	struct Forward fwd, *found_fwd;
 	char *fwd_desc = NULL;
 	const char *error_reason = NULL;
 	char *listen_addr = NULL, *connect_addr = NULL;
 	u_int ftype;
-	int i, ret = 0;
+	int r, i, ret = 0;
 	u_int lport, cport;
 
 	memset(&fwd, 0, sizeof(fwd));
 
-	if (buffer_get_int_ret(&ftype, m) != 0 ||
-	    (listen_addr = buffer_get_string_ret(m, NULL)) == NULL ||
-	    buffer_get_int_ret(&lport, m) != 0 ||
-	    (connect_addr = buffer_get_string_ret(m, NULL)) == NULL ||
-	    buffer_get_int_ret(&cport, m) != 0 ||
+	if ((r = sshbuf_get_u32(m, &ftype)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &listen_addr, NULL)) != 0 ||
+	    (r = sshbuf_get_u32(m, &lport)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &connect_addr, NULL)) != 0 ||
+	    (r = sshbuf_get_u32(m, &cport)) != 0 ||
 	    (lport != (u_int)PORT_STREAMLOCAL && lport > 65535) ||
 	    (cport != (u_int)PORT_STREAMLOCAL && cport > 65535)) {
 		error("%s: malformed message", __func__);
@@ -908,19 +943,19 @@
 		 * However, for dynamic allocated listen ports we need
 		 * to use the actual listen port.
 		 */
-		if (channel_request_rforward_cancel(found_fwd) == -1)
+		if (channel_request_rforward_cancel(ssh, found_fwd) == -1)
 			error_reason = "port not in permitted opens";
 	} else {	/* local and dynamic forwards */
 		/* Ditto */
-		if (channel_cancel_lport_listener(&fwd, fwd.connect_port,
+		if (channel_cancel_lport_listener(ssh, &fwd, fwd.connect_port,
 		    &options.fwd_opts) == -1)
 			error_reason = "port not found";
 	}
 
-	if (error_reason == NULL) {
-		buffer_put_int(r, MUX_S_OK);
-		buffer_put_int(r, rid);
-
+	if (error_reason != NULL)
+		reply_error(reply, MUX_S_FAILURE, rid, error_reason);
+	else {
+		reply_ok(reply, rid);
 		free(found_fwd->listen_host);
 		free(found_fwd->listen_path);
 		free(found_fwd->connect_host);
@@ -928,10 +963,6 @@
 		found_fwd->listen_host = found_fwd->connect_host = NULL;
 		found_fwd->listen_path = found_fwd->connect_path = NULL;
 		found_fwd->listen_port = found_fwd->connect_port = 0;
-	} else {
-		buffer_put_int(r, MUX_S_FAILURE);
-		buffer_put_int(r, rid);
-		buffer_put_cstring(r, error_reason);
 	}
  out:
 	free(fwd_desc);
@@ -942,24 +973,22 @@
 }
 
 static int
-process_mux_stdio_fwd(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_stdio_fwd(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
 	Channel *nc;
-	char *reserved, *chost;
+	char *chost = NULL;
 	u_int cport, i, j;
-	int new_fd[2];
+	int r, new_fd[2];
 	struct mux_stdio_confirm_ctx *cctx;
 
-	chost = reserved = NULL;
-	if ((reserved = buffer_get_string_ret(m, NULL)) == NULL ||
-	   (chost = buffer_get_string_ret(m, NULL)) == NULL ||
-	    buffer_get_int_ret(&cport, m) != 0) {
-		free(reserved);
+	if ((r = sshbuf_skip_string(m)) != 0 || /* reserved */
+	    (r = sshbuf_get_cstring(m, &chost, NULL)) != 0 ||
+	    (r = sshbuf_get_u32(m, &cport)) != 0) {
 		free(chost);
 		error("%s: malformed message", __func__);
 		return -1;
 	}
-	free(reserved);
 
 	debug2("%s: channel %d: request stdio fwd to %s:%u",
 	    __func__, c->self, chost, cport);
@@ -974,9 +1003,7 @@
 			free(chost);
 
 			/* prepare reply */
-			buffer_put_int(r, MUX_S_FAILURE);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r,
+			reply_error(reply, MUX_S_FAILURE, rid,
 			    "did not receive file descriptors");
 			return -1;
 		}
@@ -986,12 +1013,10 @@
 	    new_fd[0], new_fd[1]);
 
 	/* XXX support multiple child sessions in future */
-	if (c->remote_id != -1) {
+	if (c->have_remote_id) {
 		debug2("%s: session already open", __func__);
-		/* prepare reply */
-		buffer_put_int(r, MUX_S_FAILURE);
-		buffer_put_int(r, rid);
-		buffer_put_cstring(r, "Multiple sessions not supported");
+		reply_error(reply, MUX_S_FAILURE, rid,
+		    "Multiple sessions not supported");
  cleanup:
 		close(new_fd[0]);
 		close(new_fd[1]);
@@ -1004,10 +1029,8 @@
 		if (!ask_permission("Allow forward to %s:%u? ",
 		    chost, cport)) {
 			debug2("%s: stdio fwd refused by user", __func__);
-			/* prepare reply */
-			buffer_put_int(r, MUX_S_PERMISSION_DENIED);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r, "Permission denied");
+			reply_error(reply, MUX_S_PERMISSION_DENIED, rid,
+			    "Permission denied");
 			goto cleanup;
 		}
 	}
@@ -1018,19 +1041,22 @@
 	if (!isatty(new_fd[1]))
 		set_nonblock(new_fd[1]);
 
-	nc = channel_connect_stdio_fwd(chost, cport, new_fd[0], new_fd[1]);
+	nc = channel_connect_stdio_fwd(ssh, chost, cport, new_fd[0], new_fd[1]);
+	free(chost);
 
 	nc->ctl_chan = c->self;		/* link session -> control channel */
 	c->remote_id = nc->self; 	/* link control -> session channel */
+	c->have_remote_id = 1;
 
 	debug2("%s: channel_new: %d linked to control channel %d",
 	    __func__, nc->self, nc->ctl_chan);
 
-	channel_register_cleanup(nc->self, mux_master_session_cleanup_cb, 1);
+	channel_register_cleanup(ssh, nc->self,
+	    mux_master_session_cleanup_cb, 1);
 
 	cctx = xcalloc(1, sizeof(*cctx));
 	cctx->rid = rid;
-	channel_register_open_confirm(nc->self, mux_stdio_confirm, cctx);
+	channel_register_open_confirm(ssh, nc->self, mux_stdio_confirm, cctx);
 	c->mux_pause = 1; /* stop handling messages until open_confirm done */
 
 	/* reply is deferred, sent by mux_session_confirm */
@@ -1039,41 +1065,43 @@
 
 /* Callback on open confirmation in mux master for a mux stdio fwd session. */
 static void
-mux_stdio_confirm(int id, int success, void *arg)
+mux_stdio_confirm(struct ssh *ssh, int id, int success, void *arg)
 {
 	struct mux_stdio_confirm_ctx *cctx = arg;
 	Channel *c, *cc;
-	Buffer reply;
+	struct sshbuf *reply;
+	int r;
 
 	if (cctx == NULL)
 		fatal("%s: cctx == NULL", __func__);
-	if ((c = channel_by_id(id)) == NULL)
+	if ((c = channel_by_id(ssh, id)) == NULL)
 		fatal("%s: no channel for id %d", __func__, id);
-	if ((cc = channel_by_id(c->ctl_chan)) == NULL)
+	if ((cc = channel_by_id(ssh, c->ctl_chan)) == NULL)
 		fatal("%s: channel %d lacks control channel %d", __func__,
 		    id, c->ctl_chan);
+	if ((reply = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
 
 	if (!success) {
 		debug3("%s: sending failure reply", __func__);
+		reply_error(reply, MUX_S_FAILURE, cctx->rid,
+		    "Session open refused by peer");
 		/* prepare reply */
-		buffer_init(&reply);
-		buffer_put_int(&reply, MUX_S_FAILURE);
-		buffer_put_int(&reply, cctx->rid);
-		buffer_put_cstring(&reply, "Session open refused by peer");
 		goto done;
 	}
 
 	debug3("%s: sending success reply", __func__);
 	/* prepare reply */
-	buffer_init(&reply);
-	buffer_put_int(&reply, MUX_S_SESSION_OPENED);
-	buffer_put_int(&reply, cctx->rid);
-	buffer_put_int(&reply, c->self);
+	if ((r = sshbuf_put_u32(reply, MUX_S_SESSION_OPENED)) != 0 ||
+	    (r = sshbuf_put_u32(reply, cctx->rid)) != 0 ||
+	    (r = sshbuf_put_u32(reply, c->self)) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
 
  done:
 	/* Send reply */
-	buffer_put_string(&cc->output, buffer_ptr(&reply), buffer_len(&reply));
-	buffer_free(&reply);
+	if ((r = sshbuf_put_stringb(cc->output, reply)) != 0)
+		fatal("%s: sshbuf_put_stringb: %s", __func__, ssh_err(r));
+	sshbuf_free(reply);
 
 	if (cc->mux_pause <= 0)
 		fatal("%s: mux_pause %d", __func__, cc->mux_pause);
@@ -1083,7 +1111,8 @@
 }
 
 static int
-process_mux_stop_listening(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_stop_listening(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
 	debug("%s: channel %d: stop listening", __func__, c->self);
 
@@ -1092,15 +1121,14 @@
 		if (!ask_permission("Disable further multiplexing on shared "
 		    "connection to %s? ", host)) {
 			debug2("%s: stop listen refused by user", __func__);
-			buffer_put_int(r, MUX_S_PERMISSION_DENIED);
-			buffer_put_int(r, rid);
-			buffer_put_cstring(r, "Permission denied");
+			reply_error(reply, MUX_S_PERMISSION_DENIED, rid,
+			    "Permission denied");
 			return 0;
 		}
 	}
 
 	if (mux_listener_channel != NULL) {
-		channel_free(mux_listener_channel);
+		channel_free(ssh, mux_listener_channel);
 		client_stop_mux();
 		free(options.control_path);
 		options.control_path = NULL;
@@ -1108,69 +1136,69 @@
 		muxserver_sock = -1;
 	}
 
-	/* prepare reply */
-	buffer_put_int(r, MUX_S_OK);
-	buffer_put_int(r, rid);
-
+	reply_ok(reply, rid);
 	return 0;
 }
 
 static int
-process_mux_proxy(u_int rid, Channel *c, Buffer *m, Buffer *r)
+process_mux_proxy(struct ssh *ssh, u_int rid,
+    Channel *c, struct sshbuf *m, struct sshbuf *reply)
 {
+	int r;
+
 	debug("%s: channel %d: proxy request", __func__, c->self);
 
 	c->mux_rcb = channel_proxy_downstream;
-	buffer_put_int(r, MUX_S_PROXY);
-	buffer_put_int(r, rid);
+	if ((r = sshbuf_put_u32(reply, MUX_S_PROXY)) != 0 ||
+	    (r = sshbuf_put_u32(reply, rid)) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
 
 	return 0;
 }
 
 /* Channel callbacks fired on read/write from mux slave fd */
 static int
-mux_master_read_cb(Channel *c)
+mux_master_read_cb(struct ssh *ssh, Channel *c)
 {
 	struct mux_master_state *state = (struct mux_master_state *)c->mux_ctx;
-	Buffer in, out;
-	const u_char *ptr;
-	u_int type, rid, have, i;
-	int ret = -1;
+	struct sshbuf *in = NULL, *out = NULL;
+	u_int type, rid, i;
+	int r, ret = -1;
+
+	if ((out = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
 
 	/* Setup ctx and  */
 	if (c->mux_ctx == NULL) {
 		state = xcalloc(1, sizeof(*state));
 		c->mux_ctx = state;
-		channel_register_cleanup(c->self,
+		channel_register_cleanup(ssh, c->self,
 		    mux_master_control_cleanup_cb, 0);
 
 		/* Send hello */
-		buffer_init(&out);
-		buffer_put_int(&out, MUX_MSG_HELLO);
-		buffer_put_int(&out, SSHMUX_VER);
+		if ((r = sshbuf_put_u32(out, MUX_MSG_HELLO)) != 0 ||
+		    (r = sshbuf_put_u32(out, SSHMUX_VER)) != 0)
+			fatal("%s: reply: %s", __func__, ssh_err(r));
 		/* no extensions */
-		buffer_put_string(&c->output, buffer_ptr(&out),
-		    buffer_len(&out));
-		buffer_free(&out);
+		if ((r = sshbuf_put_stringb(c->output, out)) != 0)
+			fatal("%s: sshbuf_put_stringb: %s",
+			    __func__, ssh_err(r));
 		debug3("%s: channel %d: hello sent", __func__, c->self);
-		return 0;
+		ret = 0;
+		goto out;
 	}
 
-	buffer_init(&in);
-	buffer_init(&out);
-
 	/* Channel code ensures that we receive whole packets */
-	if ((ptr = buffer_get_string_ptr_ret(&c->input, &have)) == NULL) {
+	if ((r = sshbuf_froms(c->input, &in)) != 0) {
  malf:
 		error("%s: malformed message", __func__);
 		goto out;
 	}
-	buffer_append(&in, ptr, have);
 
-	if (buffer_get_int_ret(&type, &in) != 0)
+	if ((r = sshbuf_get_u32(in, &type)) != 0)
 		goto malf;
-	debug3("%s: channel %d packet type 0x%08x len %u",
-	    __func__, c->self, type, buffer_len(&in));
+	debug3("%s: channel %d packet type 0x%08x len %zu",
+	    __func__, c->self, type, sshbuf_len(in));
 
 	if (type == MUX_MSG_HELLO)
 		rid = 0;
@@ -1180,81 +1208,85 @@
 			    "received 0x%08x", __func__, MUX_MSG_HELLO, type);
 			goto out;
 		}
-		if (buffer_get_int_ret(&rid, &in) != 0)
+		if ((r = sshbuf_get_u32(in, &rid)) != 0)
 			goto malf;
 	}
 
 	for (i = 0; mux_master_handlers[i].handler != NULL; i++) {
 		if (type == mux_master_handlers[i].type) {
-			ret = mux_master_handlers[i].handler(rid, c, &in, &out);
+			ret = mux_master_handlers[i].handler(ssh, rid,
+			    c, in, out);
 			break;
 		}
 	}
 	if (mux_master_handlers[i].handler == NULL) {
 		error("%s: unsupported mux message 0x%08x", __func__, type);
-		buffer_put_int(&out, MUX_S_FAILURE);
-		buffer_put_int(&out, rid);
-		buffer_put_cstring(&out, "unsupported request");
+		reply_error(out, MUX_S_FAILURE, rid, "unsupported request");
 		ret = 0;
 	}
 	/* Enqueue reply packet */
-	if (buffer_len(&out) != 0) {
-		buffer_put_string(&c->output, buffer_ptr(&out),
-		    buffer_len(&out));
+	if (sshbuf_len(out) != 0) {
+		if ((r = sshbuf_put_stringb(c->output, out)) != 0)
+			fatal("%s: sshbuf_put_stringb: %s",
+			    __func__, ssh_err(r));
 	}
  out:
-	buffer_free(&in);
-	buffer_free(&out);
+	sshbuf_free(in);
+	sshbuf_free(out);
 	return ret;
 }
 
 void
-mux_exit_message(Channel *c, int exitval)
+mux_exit_message(struct ssh *ssh, Channel *c, int exitval)
 {
-	Buffer m;
+	struct sshbuf *m;
 	Channel *mux_chan;
+	int r;
 
 	debug3("%s: channel %d: exit message, exitval %d", __func__, c->self,
 	    exitval);
 
-	if ((mux_chan = channel_by_id(c->ctl_chan)) == NULL)
+	if ((mux_chan = channel_by_id(ssh, c->ctl_chan)) == NULL)
 		fatal("%s: channel %d missing mux channel %d",
 		    __func__, c->self, c->ctl_chan);
 
 	/* Append exit message packet to control socket output queue */
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_S_EXIT_MESSAGE);
-	buffer_put_int(&m, c->self);
-	buffer_put_int(&m, exitval);
-
-	buffer_put_string(&mux_chan->output, buffer_ptr(&m), buffer_len(&m));
-	buffer_free(&m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_S_EXIT_MESSAGE)) != 0 ||
+	    (r = sshbuf_put_u32(m, c->self)) != 0 ||
+	    (r = sshbuf_put_u32(m, exitval)) != 0 ||
+	    (r = sshbuf_put_stringb(mux_chan->output, m)) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 }
 
 void
-mux_tty_alloc_failed(Channel *c)
+mux_tty_alloc_failed(struct ssh *ssh, Channel *c)
 {
-	Buffer m;
+	struct sshbuf *m;
 	Channel *mux_chan;
+	int r;
 
 	debug3("%s: channel %d: TTY alloc failed", __func__, c->self);
 
-	if ((mux_chan = channel_by_id(c->ctl_chan)) == NULL)
+	if ((mux_chan = channel_by_id(ssh, c->ctl_chan)) == NULL)
 		fatal("%s: channel %d missing mux channel %d",
 		    __func__, c->self, c->ctl_chan);
 
 	/* Append exit message packet to control socket output queue */
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_S_TTY_ALLOC_FAIL);
-	buffer_put_int(&m, c->self);
-
-	buffer_put_string(&mux_chan->output, buffer_ptr(&m), buffer_len(&m));
-	buffer_free(&m);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_S_TTY_ALLOC_FAIL)) != 0 ||
+	    (r = sshbuf_put_u32(m, c->self)) != 0 ||
+	    (r = sshbuf_put_stringb(mux_chan->output, m)) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 }
 
 /* Prepare a mux master to listen on a Unix domain socket. */
 void
-muxserver_listen(void)
+muxserver_listen(struct ssh *ssh)
 {
 	mode_t old_umask;
 	char *orig_control_path = options.control_path;
@@ -1327,7 +1359,7 @@
 
 	set_nonblock(muxserver_sock);
 
-	mux_listener_channel = channel_new("mux listener",
+	mux_listener_channel = channel_new(ssh, "mux listener",
 	    SSH_CHANNEL_MUX_LISTENER, muxserver_sock, muxserver_sock, -1,
 	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
 	    0, options.control_path, 1);
@@ -1338,29 +1370,28 @@
 
 /* Callback on open confirmation in mux master for a mux client session. */
 static void
-mux_session_confirm(int id, int success, void *arg)
+mux_session_confirm(struct ssh *ssh, int id, int success, void *arg)
 {
 	struct mux_session_confirm_ctx *cctx = arg;
 	const char *display;
 	Channel *c, *cc;
-	int i;
-	Buffer reply;
+	int i, r;
+	struct sshbuf *reply;
 
 	if (cctx == NULL)
 		fatal("%s: cctx == NULL", __func__);
-	if ((c = channel_by_id(id)) == NULL)
+	if ((c = channel_by_id(ssh, id)) == NULL)
 		fatal("%s: no channel for id %d", __func__, id);
-	if ((cc = channel_by_id(c->ctl_chan)) == NULL)
+	if ((cc = channel_by_id(ssh, c->ctl_chan)) == NULL)
 		fatal("%s: channel %d lacks control channel %d", __func__,
 		    id, c->ctl_chan);
+	if ((reply = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
 
 	if (!success) {
 		debug3("%s: sending failure reply", __func__);
-		/* prepare reply */
-		buffer_init(&reply);
-		buffer_put_int(&reply, MUX_S_FAILURE);
-		buffer_put_int(&reply, cctx->rid);
-		buffer_put_cstring(&reply, "Session open refused by peer");
+		reply_error(reply, MUX_S_FAILURE, cctx->rid,
+		    "Session open refused by peer");
 		goto done;
 	}
 
@@ -1369,46 +1400,47 @@
 		char *proto, *data;
 
 		/* Get reasonable local authentication information. */
-		if (client_x11_get_proto(display, options.xauth_location,
+		if (client_x11_get_proto(ssh, display, options.xauth_location,
 		    options.forward_x11_trusted, options.forward_x11_timeout,
 		    &proto, &data) == 0) {
 			/* Request forwarding with authentication spoofing. */
 			debug("Requesting X11 forwarding with authentication "
 			    "spoofing.");
-			x11_request_forwarding_with_spoofing(id, display, proto,
-			    data, 1);
+			x11_request_forwarding_with_spoofing(ssh, id,
+			    display, proto, data, 1);
 			/* XXX exit_on_forward_failure */
-			client_expect_confirm(id, "X11 forwarding",
+			client_expect_confirm(ssh, id, "X11 forwarding",
 			    CONFIRM_WARN);
 		}
 	}
 
 	if (cctx->want_agent_fwd && options.forward_agent) {
 		debug("Requesting authentication agent forwarding.");
-		channel_request_start(id, "auth-agent-req@openssh.com", 0);
+		channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
 		packet_send();
 	}
 
-	client_session2_setup(id, cctx->want_tty, cctx->want_subsys,
-	    cctx->term, &cctx->tio, c->rfd, &cctx->cmd, cctx->env);
+	client_session2_setup(ssh, id, cctx->want_tty, cctx->want_subsys,
+	    cctx->term, &cctx->tio, c->rfd, cctx->cmd, cctx->env);
 
 	debug3("%s: sending success reply", __func__);
 	/* prepare reply */
-	buffer_init(&reply);
-	buffer_put_int(&reply, MUX_S_SESSION_OPENED);
-	buffer_put_int(&reply, cctx->rid);
-	buffer_put_int(&reply, c->self);
+	if ((r = sshbuf_put_u32(reply, MUX_S_SESSION_OPENED)) != 0 ||
+	    (r = sshbuf_put_u32(reply, cctx->rid)) != 0 ||
+	    (r = sshbuf_put_u32(reply, c->self)) != 0)
+		fatal("%s: reply: %s", __func__, ssh_err(r));
 
  done:
 	/* Send reply */
-	buffer_put_string(&cc->output, buffer_ptr(&reply), buffer_len(&reply));
-	buffer_free(&reply);
+	if ((r = sshbuf_put_stringb(cc->output, reply)) != 0)
+		fatal("%s: sshbuf_put_stringb: %s", __func__, ssh_err(r));
+	sshbuf_free(reply);
 
 	if (cc->mux_pause <= 0)
 		fatal("%s: mux_pause %d", __func__, cc->mux_pause);
 	cc->mux_pause = 0; /* start processing messages again */
 	c->open_confirm_ctx = NULL;
-	buffer_free(&cctx->cmd);
+	sshbuf_free(cctx->cmd);
 	free(cctx->term);
 	if (cctx->env != NULL) {
 		for (i = 0; cctx->env[i] != NULL; i++)
@@ -1443,16 +1475,18 @@
 }
 
 static int
-mux_client_read(int fd, Buffer *b, u_int need)
+mux_client_read(int fd, struct sshbuf *b, size_t need)
 {
-	u_int have;
+	size_t have;
 	ssize_t len;
 	u_char *p;
 	struct pollfd pfd;
+	int r;
 
 	pfd.fd = fd;
 	pfd.events = POLLIN;
-	p = buffer_append_space(b, need);
+	if ((r = sshbuf_reserve(b, need, &p)) != 0)
+		fatal("%s: reserve: %s", __func__, ssh_err(r));
 	for (have = 0; have < need; ) {
 		if (muxclient_terminate) {
 			errno = EINTR;
@@ -1477,31 +1511,33 @@
 			errno = EPIPE;
 			return -1;
 		}
-		have += (u_int)len;
+		have += (size_t)len;
 	}
 	return 0;
 }
 
 static int
-mux_client_write_packet(int fd, Buffer *m)
+mux_client_write_packet(int fd, struct sshbuf *m)
 {
-	Buffer queue;
+	struct sshbuf *queue;
 	u_int have, need;
-	int oerrno, len;
-	u_char *ptr;
+	int r, oerrno, len;
+	const u_char *ptr;
 	struct pollfd pfd;
 
 	pfd.fd = fd;
 	pfd.events = POLLOUT;
-	buffer_init(&queue);
-	buffer_put_string(&queue, buffer_ptr(m), buffer_len(m));
+	if ((queue = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_stringb(queue, m)) != 0)
+		fatal("%s: sshbuf_put_stringb: %s", __func__, ssh_err(r));
 
-	need = buffer_len(&queue);
-	ptr = buffer_ptr(&queue);
+	need = sshbuf_len(queue);
+	ptr = sshbuf_ptr(queue);
 
 	for (have = 0; have < need; ) {
 		if (muxclient_terminate) {
-			buffer_free(&queue);
+			sshbuf_free(queue);
 			errno = EINTR;
 			return -1;
 		}
@@ -1518,132 +1554,160 @@
 				continue;
 			default:
 				oerrno = errno;
-				buffer_free(&queue);
+				sshbuf_free(queue);
 				errno = oerrno;
 				return -1;
 			}
 		}
 		if (len == 0) {
-			buffer_free(&queue);
+			sshbuf_free(queue);
 			errno = EPIPE;
 			return -1;
 		}
 		have += (u_int)len;
 	}
-	buffer_free(&queue);
+	sshbuf_free(queue);
 	return 0;
 }
 
 static int
-mux_client_read_packet(int fd, Buffer *m)
+mux_client_read_packet(int fd, struct sshbuf *m)
 {
-	Buffer queue;
-	u_int need, have;
+	struct sshbuf *queue;
+	size_t need, have;
 	const u_char *ptr;
-	int oerrno;
+	int r, oerrno;
 
-	buffer_init(&queue);
-	if (mux_client_read(fd, &queue, 4) != 0) {
+	if ((queue = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if (mux_client_read(fd, queue, 4) != 0) {
 		if ((oerrno = errno) == EPIPE)
 			debug3("%s: read header failed: %s", __func__,
 			    strerror(errno));
-		buffer_free(&queue);
+		sshbuf_free(queue);
 		errno = oerrno;
 		return -1;
 	}
-	need = get_u32(buffer_ptr(&queue));
-	if (mux_client_read(fd, &queue, need) != 0) {
+	need = PEEK_U32(sshbuf_ptr(queue));
+	if (mux_client_read(fd, queue, need) != 0) {
 		oerrno = errno;
 		debug3("%s: read body failed: %s", __func__, strerror(errno));
-		buffer_free(&queue);
+		sshbuf_free(queue);
 		errno = oerrno;
 		return -1;
 	}
-	ptr = buffer_get_string_ptr(&queue, &have);
-	buffer_append(m, ptr, have);
-	buffer_free(&queue);
+	if ((r = sshbuf_get_string_direct(queue, &ptr, &have)) != 0 ||
+	    (r = sshbuf_put(m, ptr, have)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	sshbuf_free(queue);
 	return 0;
 }
 
 static int
 mux_client_hello_exchange(int fd)
 {
-	Buffer m;
+	struct sshbuf *m;
 	u_int type, ver;
+	int r, ret = -1;
 
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_MSG_HELLO);
-	buffer_put_int(&m, SSHMUX_VER);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_MSG_HELLO)) != 0 ||
+	    (r = sshbuf_put_u32(m, SSHMUX_VER)) != 0)
+		fatal("%s: hello: %s", __func__, ssh_err(r));
 	/* no extensions */
 
-	if (mux_client_write_packet(fd, &m) != 0)
-		fatal("%s: write packet: %s", __func__, strerror(errno));
+	if (mux_client_write_packet(fd, m) != 0) {
+		debug("%s: write packet: %s", __func__, strerror(errno));
+		goto out;
+	}
 
-	buffer_clear(&m);
+	sshbuf_reset(m);
 
 	/* Read their HELLO */
-	if (mux_client_read_packet(fd, &m) != 0) {
-		buffer_free(&m);
-		return -1;
+	if (mux_client_read_packet(fd, m) != 0) {
+		debug("%s: read packet failed", __func__);
+		goto out;
 	}
 
-	type = buffer_get_int(&m);
-	if (type != MUX_MSG_HELLO)
-		fatal("%s: expected HELLO (%u) received %u",
+	if ((r = sshbuf_get_u32(m, &type)) != 0)
+		fatal("%s: decode type: %s", __func__, ssh_err(r));
+	if (type != MUX_MSG_HELLO) {
+		error("%s: expected HELLO (%u) received %u",
 		    __func__, MUX_MSG_HELLO, type);
-	ver = buffer_get_int(&m);
-	if (ver != SSHMUX_VER)
-		fatal("Unsupported multiplexing protocol version %d "
+		goto out;
+	}
+	if ((r = sshbuf_get_u32(m, &ver)) != 0)
+		fatal("%s: decode version: %s", __func__, ssh_err(r));
+	if (ver != SSHMUX_VER) {
+		error("Unsupported multiplexing protocol version %d "
 		    "(expected %d)", ver, SSHMUX_VER);
+		goto out;
+	}
 	debug2("%s: master version %u", __func__, ver);
 	/* No extensions are presently defined */
-	while (buffer_len(&m) > 0) {
-		char *name = buffer_get_string(&m, NULL);
-		char *value = buffer_get_string(&m, NULL);
+	while (sshbuf_len(m) > 0) {
+		char *name = NULL;
 
+		if ((r = sshbuf_get_cstring(m, &name, NULL)) != 0 ||
+		    (r = sshbuf_skip_string(m)) != 0) { /* value */
+			error("%s: malformed extension: %s",
+			    __func__, ssh_err(r));
+			goto out;
+		}
 		debug2("Unrecognised master extension \"%s\"", name);
 		free(name);
-		free(value);
 	}
-	buffer_free(&m);
-	return 0;
+	/* success */
+	ret = 0;
+ out:
+	sshbuf_free(m);
+	return ret;
 }
 
 static u_int
 mux_client_request_alive(int fd)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *e;
 	u_int pid, type, rid;
+	int r;
 
 	debug3("%s: entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_C_ALIVE_CHECK);
-	buffer_put_int(&m, muxclient_request_id);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_C_ALIVE_CHECK)) != 0 ||
+	    (r = sshbuf_put_u32(m, muxclient_request_id)) != 0)
+		fatal("%s: request: %s", __func__, ssh_err(r));
 
-	if (mux_client_write_packet(fd, &m) != 0)
+	if (mux_client_write_packet(fd, m) != 0)
 		fatal("%s: write packet: %s", __func__, strerror(errno));
 
-	buffer_clear(&m);
+	sshbuf_reset(m);
 
 	/* Read their reply */
-	if (mux_client_read_packet(fd, &m) != 0) {
-		buffer_free(&m);
+	if (mux_client_read_packet(fd, m) != 0) {
+		sshbuf_free(m);
 		return 0;
 	}
 
-	type = buffer_get_int(&m);
+	if ((r = sshbuf_get_u32(m, &type)) != 0)
+		fatal("%s: decode type: %s", __func__, ssh_err(r));
 	if (type != MUX_S_ALIVE) {
-		e = buffer_get_string(&m, NULL);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
 		fatal("%s: master returned error: %s", __func__, e);
 	}
 
-	if ((rid = buffer_get_int(&m)) != muxclient_request_id)
+	if ((r = sshbuf_get_u32(m, &rid)) != 0)
+		fatal("%s: decode remote ID: %s", __func__, ssh_err(r));
+	if (rid != muxclient_request_id)
 		fatal("%s: out of sequence reply: my id %u theirs %u",
 		    __func__, muxclient_request_id, rid);
-	pid = buffer_get_int(&m);
-	buffer_free(&m);
+	if ((r = sshbuf_get_u32(m, &pid)) != 0)
+		fatal("%s: decode PID: %s", __func__, ssh_err(r));
+	sshbuf_free(m);
 
 	debug3("%s: done pid = %u", __func__, pid);
 
@@ -1655,107 +1719,128 @@
 static void
 mux_client_request_terminate(int fd)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *e;
 	u_int type, rid;
+	int r;
 
 	debug3("%s: entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_C_TERMINATE);
-	buffer_put_int(&m, muxclient_request_id);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_C_TERMINATE)) != 0 ||
+	    (r = sshbuf_put_u32(m, muxclient_request_id)) != 0)
+		fatal("%s: request: %s", __func__, ssh_err(r));
 
-	if (mux_client_write_packet(fd, &m) != 0)
+	if (mux_client_write_packet(fd, m) != 0)
 		fatal("%s: write packet: %s", __func__, strerror(errno));
 
-	buffer_clear(&m);
+	sshbuf_reset(m);
 
 	/* Read their reply */
-	if (mux_client_read_packet(fd, &m) != 0) {
+	if (mux_client_read_packet(fd, m) != 0) {
 		/* Remote end exited already */
 		if (errno == EPIPE) {
-			buffer_free(&m);
+			sshbuf_free(m);
 			return;
 		}
 		fatal("%s: read from master failed: %s",
 		    __func__, strerror(errno));
 	}
 
-	type = buffer_get_int(&m);
-	if ((rid = buffer_get_int(&m)) != muxclient_request_id)
+	if ((r = sshbuf_get_u32(m, &type)) != 0 ||
+	    (r = sshbuf_get_u32(m, &rid)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
+	if (rid != muxclient_request_id)
 		fatal("%s: out of sequence reply: my id %u theirs %u",
 		    __func__, muxclient_request_id, rid);
 	switch (type) {
 	case MUX_S_OK:
 		break;
 	case MUX_S_PERMISSION_DENIED:
-		e = buffer_get_string(&m, NULL);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
 		fatal("Master refused termination request: %s", e);
 	case MUX_S_FAILURE:
-		e = buffer_get_string(&m, NULL);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
 		fatal("%s: termination request failed: %s", __func__, e);
 	default:
 		fatal("%s: unexpected response from master 0x%08x",
 		    __func__, type);
 	}
-	buffer_free(&m);
+	sshbuf_free(m);
 	muxclient_request_id++;
 }
 
 static int
 mux_client_forward(int fd, int cancel_flag, u_int ftype, struct Forward *fwd)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *e, *fwd_desc;
+	const char *lhost, *chost;
 	u_int type, rid;
+	int r;
 
 	fwd_desc = format_forward(ftype, fwd);
 	debug("Requesting %s %s",
 	    cancel_flag ? "cancellation of" : "forwarding of", fwd_desc);
 	free(fwd_desc);
 
-	buffer_init(&m);
-	buffer_put_int(&m, cancel_flag ? MUX_C_CLOSE_FWD : MUX_C_OPEN_FWD);
-	buffer_put_int(&m, muxclient_request_id);
-	buffer_put_int(&m, ftype);
-	if (fwd->listen_path != NULL) {
-		buffer_put_cstring(&m, fwd->listen_path);
-	} else {
-		buffer_put_cstring(&m,
-		    fwd->listen_host == NULL ? "" :
-		    (*fwd->listen_host == '\0' ? "*" : fwd->listen_host));
-	}
-	buffer_put_int(&m, fwd->listen_port);
-	if (fwd->connect_path != NULL) {
-		buffer_put_cstring(&m, fwd->connect_path);
-	} else {
-		buffer_put_cstring(&m,
-		    fwd->connect_host == NULL ? "" : fwd->connect_host);
-	}
-	buffer_put_int(&m, fwd->connect_port);
+	type = cancel_flag ? MUX_C_CLOSE_FWD : MUX_C_OPEN_FWD;
+	if (fwd->listen_path != NULL)
+		lhost = fwd->listen_path;
+	else if (fwd->listen_host == NULL)
+		lhost = "";
+	else if (*fwd->listen_host == '\0')
+		lhost = "*";
+	else
+		lhost = fwd->listen_host;
 
-	if (mux_client_write_packet(fd, &m) != 0)
+	if (fwd->connect_path != NULL)
+		chost = fwd->connect_path;
+	else if (fwd->connect_host == NULL)
+		chost = "";
+	else
+		chost = fwd->connect_host;
+
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, type)) != 0 ||
+	    (r = sshbuf_put_u32(m, muxclient_request_id)) != 0 ||
+	    (r = sshbuf_put_u32(m, ftype)) != 0 ||
+	    (r = sshbuf_put_cstring(m, lhost)) != 0 ||
+	    (r = sshbuf_put_u32(m, fwd->listen_port)) != 0 ||
+	    (r = sshbuf_put_cstring(m, chost)) != 0 ||
+	    (r = sshbuf_put_u32(m, fwd->connect_port)) != 0)
+		fatal("%s: request: %s", __func__, ssh_err(r));
+
+	if (mux_client_write_packet(fd, m) != 0)
 		fatal("%s: write packet: %s", __func__, strerror(errno));
 
-	buffer_clear(&m);
+	sshbuf_reset(m);
 
 	/* Read their reply */
-	if (mux_client_read_packet(fd, &m) != 0) {
-		buffer_free(&m);
+	if (mux_client_read_packet(fd, m) != 0) {
+		sshbuf_free(m);
 		return -1;
 	}
 
-	type = buffer_get_int(&m);
-	if ((rid = buffer_get_int(&m)) != muxclient_request_id)
+	if ((r = sshbuf_get_u32(m, &type)) != 0 ||
+	    (r = sshbuf_get_u32(m, &rid)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
+	if (rid != muxclient_request_id)
 		fatal("%s: out of sequence reply: my id %u theirs %u",
 		    __func__, muxclient_request_id, rid);
+
 	switch (type) {
 	case MUX_S_OK:
 		break;
 	case MUX_S_REMOTE_PORT:
 		if (cancel_flag)
 			fatal("%s: got MUX_S_REMOTE_PORT for cancel", __func__);
-		fwd->allocated_port = buffer_get_int(&m);
+		if ((r = sshbuf_get_u32(m, &fwd->allocated_port)) != 0)
+			fatal("%s: decode port: %s", __func__, ssh_err(r));
 		verbose("Allocated port %u for remote forward to %s:%d",
 		    fwd->allocated_port,
 		    fwd->connect_host ? fwd->connect_host : "",
@@ -1764,20 +1849,22 @@
 			fprintf(stdout, "%i\n", fwd->allocated_port);
 		break;
 	case MUX_S_PERMISSION_DENIED:
-		e = buffer_get_string(&m, NULL);
-		buffer_free(&m);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
+		sshbuf_free(m);
 		error("Master refused forwarding request: %s", e);
 		return -1;
 	case MUX_S_FAILURE:
-		e = buffer_get_string(&m, NULL);
-		buffer_free(&m);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
+		sshbuf_free(m);
 		error("%s: forwarding request failed: %s", __func__, e);
 		return -1;
 	default:
 		fatal("%s: unexpected response from master 0x%08x",
 		    __func__, type);
 	}
-	buffer_free(&m);
+	sshbuf_free(m);
 
 	muxclient_request_id++;
 	return 0;
@@ -1811,11 +1898,12 @@
 static int
 mux_client_request_session(int fd)
 {
-	Buffer m;
-	char *e, *term;
-	u_int i, rid, sid, esid, exitval, type, exitval_seen;
+	struct sshbuf *m;
+	char *e;
+	const char *term;
+	u_int echar, rid, sid, esid, exitval, type, exitval_seen;
 	extern char **environ;
-	int devnull, rawmode;
+	int r, i, devnull, rawmode;
 
 	debug3("%s: entering", __func__);
 
@@ -1835,31 +1923,41 @@
 			close(devnull);
 	}
 
-	term = getenv("TERM");
+	if ((term = getenv("TERM")) == NULL)
+		term = "";
+	echar = 0xffffffff;
+	if (options.escape_char != SSH_ESCAPECHAR_NONE)
+	    echar = (u_int)options.escape_char;
 
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_C_NEW_SESSION);
-	buffer_put_int(&m, muxclient_request_id);
-	buffer_put_cstring(&m, ""); /* reserved */
-	buffer_put_int(&m, tty_flag);
-	buffer_put_int(&m, options.forward_x11);
-	buffer_put_int(&m, options.forward_agent);
-	buffer_put_int(&m, subsystem_flag);
-	buffer_put_int(&m, options.escape_char == SSH_ESCAPECHAR_NONE ?
-	    0xffffffff : (u_int)options.escape_char);
-	buffer_put_cstring(&m, term == NULL ? "" : term);
-	buffer_put_string(&m, buffer_ptr(&command), buffer_len(&command));
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_C_NEW_SESSION)) != 0 ||
+	    (r = sshbuf_put_u32(m, muxclient_request_id)) != 0 ||
+	    (r = sshbuf_put_string(m, NULL, 0)) != 0 || /* reserved */
+	    (r = sshbuf_put_u32(m, tty_flag)) != 0 ||
+	    (r = sshbuf_put_u32(m, options.forward_x11)) != 0 ||
+	    (r = sshbuf_put_u32(m, options.forward_agent)) != 0 ||
+	    (r = sshbuf_put_u32(m, subsystem_flag)) != 0 ||
+	    (r = sshbuf_put_u32(m, echar)) != 0 ||
+	    (r = sshbuf_put_cstring(m, term)) != 0 ||
+	    (r = sshbuf_put_stringb(m, command)) != 0)
+		fatal("%s: request: %s", __func__, ssh_err(r));
 
+	/* Pass environment */
 	if (options.num_send_env > 0 && environ != NULL) {
-		/* Pass environment */
 		for (i = 0; environ[i] != NULL; i++) {
-			if (env_permitted(environ[i])) {
-				buffer_put_cstring(&m, environ[i]);
-			}
+			if (!env_permitted(environ[i]))
+				continue;
+			if ((r = sshbuf_put_cstring(m, environ[i])) != 0)
+				fatal("%s: request: %s", __func__, ssh_err(r));
 		}
 	}
+	for (i = 0; i < options.num_setenv; i++) {
+		if ((r = sshbuf_put_cstring(m, options.setenv[i])) != 0)
+			fatal("%s: request: %s", __func__, ssh_err(r));
+	}
 
-	if (mux_client_write_packet(fd, &m) != 0)
+	if (mux_client_write_packet(fd, m) != 0)
 		fatal("%s: write packet: %s", __func__, strerror(errno));
 
 	/* Send the stdio file descriptors */
@@ -1871,35 +1969,40 @@
 	debug3("%s: session request sent", __func__);
 
 	/* Read their reply */
-	buffer_clear(&m);
-	if (mux_client_read_packet(fd, &m) != 0) {
+	sshbuf_reset(m);
+	if (mux_client_read_packet(fd, m) != 0) {
 		error("%s: read from master failed: %s",
 		    __func__, strerror(errno));
-		buffer_free(&m);
+		sshbuf_free(m);
 		return -1;
 	}
 
-	type = buffer_get_int(&m);
-	if ((rid = buffer_get_int(&m)) != muxclient_request_id)
+	if ((r = sshbuf_get_u32(m, &type)) != 0 ||
+	    (r = sshbuf_get_u32(m, &rid)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
+	if (rid != muxclient_request_id)
 		fatal("%s: out of sequence reply: my id %u theirs %u",
 		    __func__, muxclient_request_id, rid);
+
 	switch (type) {
 	case MUX_S_SESSION_OPENED:
-		sid = buffer_get_int(&m);
-		debug("%s: master session id: %u", __func__, sid);
+		if ((r = sshbuf_get_u32(m, &sid)) != 0)
+			fatal("%s: decode ID: %s", __func__, ssh_err(r));
 		break;
 	case MUX_S_PERMISSION_DENIED:
-		e = buffer_get_string(&m, NULL);
-		buffer_free(&m);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
 		error("Master refused session request: %s", e);
+		sshbuf_free(m);
 		return -1;
 	case MUX_S_FAILURE:
-		e = buffer_get_string(&m, NULL);
-		buffer_free(&m);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
 		error("%s: session request failed: %s", __func__, e);
+		sshbuf_free(m);
 		return -1;
 	default:
-		buffer_free(&m);
+		sshbuf_free(m);
 		error("%s: unexpected response from master 0x%08x",
 		    __func__, type);
 		return -1;
@@ -1927,13 +2030,17 @@
 	 * terminate early too (possibly losing data).
 	 */
 	for (exitval = 255, exitval_seen = 0;;) {
-		buffer_clear(&m);
-		if (mux_client_read_packet(fd, &m) != 0)
+		sshbuf_reset(m);
+		if (mux_client_read_packet(fd, m) != 0)
 			break;
-		type = buffer_get_int(&m);
+		if ((r = sshbuf_get_u32(m, &type)) != 0)
+			fatal("%s: decode type: %s", __func__, ssh_err(r));
 		switch (type) {
 		case MUX_S_TTY_ALLOC_FAIL:
-			if ((esid = buffer_get_int(&m)) != sid)
+			if ((r = sshbuf_get_u32(m, &esid)) != 0)
+				fatal("%s: decode ID: %s",
+				    __func__, ssh_err(r));
+			if (esid != sid)
 				fatal("%s: tty alloc fail on unknown session: "
 				    "my id %u theirs %u",
 				    __func__, sid, esid);
@@ -1942,17 +2049,24 @@
 			rawmode = 0;
 			continue;
 		case MUX_S_EXIT_MESSAGE:
-			if ((esid = buffer_get_int(&m)) != sid)
+			if ((r = sshbuf_get_u32(m, &esid)) != 0)
+				fatal("%s: decode ID: %s",
+				    __func__, ssh_err(r));
+			if (esid != sid)
 				fatal("%s: exit on unknown session: "
 				    "my id %u theirs %u",
 				    __func__, sid, esid);
 			if (exitval_seen)
 				fatal("%s: exitval sent twice", __func__);
-			exitval = buffer_get_int(&m);
+			if ((r = sshbuf_get_u32(m, &exitval)) != 0)
+				fatal("%s: decode exit value: %s",
+				    __func__, ssh_err(r));
 			exitval_seen = 1;
 			continue;
 		default:
-			e = buffer_get_string(&m, NULL);
+			if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+				fatal("%s: decode error: %s",
+				    __func__, ssh_err(r));
 			fatal("%s: master returned error: %s", __func__, e);
 		}
 	}
@@ -1962,7 +2076,7 @@
 		leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
 
 	if (muxclient_terminate) {
-		debug2("Exiting on signal %d", muxclient_terminate);
+		debug2("Exiting on signal: %s", strsignal(muxclient_terminate));
 		exitval = 255;
 	} else if (!exitval_seen) {
 		debug2("Control master terminated unexpectedly");
@@ -1979,32 +2093,38 @@
 static int
 mux_client_proxy(int fd)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *e;
 	u_int type, rid;
+	int r;
 
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_C_PROXY);
-	buffer_put_int(&m, muxclient_request_id);
-	if (mux_client_write_packet(fd, &m) != 0)
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_C_PROXY)) != 0 ||
+	    (r = sshbuf_put_u32(m, muxclient_request_id)) != 0)
+		fatal("%s: request: %s", __func__, ssh_err(r));
+	if (mux_client_write_packet(fd, m) != 0)
 		fatal("%s: write packet: %s", __func__, strerror(errno));
 
-	buffer_clear(&m);
+	sshbuf_reset(m);
 
 	/* Read their reply */
-	if (mux_client_read_packet(fd, &m) != 0) {
-		buffer_free(&m);
+	if (mux_client_read_packet(fd, m) != 0) {
+		sshbuf_free(m);
 		return 0;
 	}
-	type = buffer_get_int(&m);
-	if (type != MUX_S_PROXY) {
-		e = buffer_get_string(&m, NULL);
-		fatal("%s: master returned error: %s", __func__, e);
-	}
-	if ((rid = buffer_get_int(&m)) != muxclient_request_id)
+	if ((r = sshbuf_get_u32(m, &type)) != 0 ||
+	    (r = sshbuf_get_u32(m, &rid)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
+	if (rid != muxclient_request_id)
 		fatal("%s: out of sequence reply: my id %u theirs %u",
 		    __func__, muxclient_request_id, rid);
-	buffer_free(&m);
+	if (type != MUX_S_PROXY) {
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
+		fatal("%s: master returned error: %s", __func__, e);
+	}
+	sshbuf_free(m);
 
 	debug3("%s: done", __func__);
 	muxclient_request_id++;
@@ -2014,10 +2134,10 @@
 static int
 mux_client_request_stdio_fwd(int fd)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *e;
 	u_int type, rid, sid;
-	int devnull;
+	int r, devnull;
 
 	debug3("%s: entering", __func__);
 
@@ -2037,14 +2157,16 @@
 			close(devnull);
 	}
 
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_C_NEW_STDIO_FWD);
-	buffer_put_int(&m, muxclient_request_id);
-	buffer_put_cstring(&m, ""); /* reserved */
-	buffer_put_cstring(&m, options.stdio_forward_host);
-	buffer_put_int(&m, options.stdio_forward_port);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_C_NEW_STDIO_FWD)) != 0 ||
+	    (r = sshbuf_put_u32(m, muxclient_request_id)) != 0 ||
+	    (r = sshbuf_put_string(m, NULL, 0)) != 0 || /* reserved */
+	    (r = sshbuf_put_cstring(m, options.stdio_forward_host)) != 0 ||
+	    (r = sshbuf_put_u32(m, options.stdio_forward_port)) != 0)
+		fatal("%s: request: %s", __func__, ssh_err(r));
 
-	if (mux_client_write_packet(fd, &m) != 0)
+	if (mux_client_write_packet(fd, m) != 0)
 		fatal("%s: write packet: %s", __func__, strerror(errno));
 
 	/* Send the stdio file descriptors */
@@ -2059,34 +2181,39 @@
 	debug3("%s: stdio forward request sent", __func__);
 
 	/* Read their reply */
-	buffer_clear(&m);
+	sshbuf_reset(m);
 
-	if (mux_client_read_packet(fd, &m) != 0) {
+	if (mux_client_read_packet(fd, m) != 0) {
 		error("%s: read from master failed: %s",
 		    __func__, strerror(errno));
-		buffer_free(&m);
+		sshbuf_free(m);
 		return -1;
 	}
 
-	type = buffer_get_int(&m);
-	if ((rid = buffer_get_int(&m)) != muxclient_request_id)
+	if ((r = sshbuf_get_u32(m, &type)) != 0 ||
+	    (r = sshbuf_get_u32(m, &rid)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
+	if (rid != muxclient_request_id)
 		fatal("%s: out of sequence reply: my id %u theirs %u",
 		    __func__, muxclient_request_id, rid);
 	switch (type) {
 	case MUX_S_SESSION_OPENED:
-		sid = buffer_get_int(&m);
+		if ((r = sshbuf_get_u32(m, &sid)) != 0)
+			fatal("%s: decode ID: %s", __func__, ssh_err(r));
 		debug("%s: master session id: %u", __func__, sid);
 		break;
 	case MUX_S_PERMISSION_DENIED:
-		e = buffer_get_string(&m, NULL);
-		buffer_free(&m);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
+		sshbuf_free(m);
 		fatal("Master refused stdio forwarding request: %s", e);
 	case MUX_S_FAILURE:
-		e = buffer_get_string(&m, NULL);
-		buffer_free(&m);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
+		sshbuf_free(m);
 		fatal("Stdio forwarding request failed: %s", e);
 	default:
-		buffer_free(&m);
+		sshbuf_free(m);
 		error("%s: unexpected response from master 0x%08x",
 		    __func__, type);
 		return -1;
@@ -2101,8 +2228,8 @@
 	/*
 	 * Stick around until the controlee closes the client_fd.
 	 */
-	buffer_clear(&m);
-	if (mux_client_read_packet(fd, &m) != 0) {
+	sshbuf_reset(m);
+	if (mux_client_read_packet(fd, m) != 0) {
 		if (errno == EPIPE ||
 		    (errno == EINTR && muxclient_terminate != 0))
 			return 0;
@@ -2115,44 +2242,52 @@
 static void
 mux_client_request_stop_listening(int fd)
 {
-	Buffer m;
+	struct sshbuf *m;
 	char *e;
 	u_int type, rid;
+	int r;
 
 	debug3("%s: entering", __func__);
 
-	buffer_init(&m);
-	buffer_put_int(&m, MUX_C_STOP_LISTENING);
-	buffer_put_int(&m, muxclient_request_id);
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new", __func__);
+	if ((r = sshbuf_put_u32(m, MUX_C_STOP_LISTENING)) != 0 ||
+	    (r = sshbuf_put_u32(m, muxclient_request_id)) != 0)
+		fatal("%s: request: %s", __func__, ssh_err(r));
 
-	if (mux_client_write_packet(fd, &m) != 0)
+	if (mux_client_write_packet(fd, m) != 0)
 		fatal("%s: write packet: %s", __func__, strerror(errno));
 
-	buffer_clear(&m);
+	sshbuf_reset(m);
 
 	/* Read their reply */
-	if (mux_client_read_packet(fd, &m) != 0)
+	if (mux_client_read_packet(fd, m) != 0)
 		fatal("%s: read from master failed: %s",
 		    __func__, strerror(errno));
 
-	type = buffer_get_int(&m);
-	if ((rid = buffer_get_int(&m)) != muxclient_request_id)
+	if ((r = sshbuf_get_u32(m, &type)) != 0 ||
+	    (r = sshbuf_get_u32(m, &rid)) != 0)
+		fatal("%s: decode: %s", __func__, ssh_err(r));
+	if (rid != muxclient_request_id)
 		fatal("%s: out of sequence reply: my id %u theirs %u",
 		    __func__, muxclient_request_id, rid);
+
 	switch (type) {
 	case MUX_S_OK:
 		break;
 	case MUX_S_PERMISSION_DENIED:
-		e = buffer_get_string(&m, NULL);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
 		fatal("Master refused stop listening request: %s", e);
 	case MUX_S_FAILURE:
-		e = buffer_get_string(&m, NULL);
+		if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+			fatal("%s: decode error: %s", __func__, ssh_err(r));
 		fatal("%s: stop listening request failed: %s", __func__, e);
 	default:
 		fatal("%s: unexpected response from master 0x%08x",
 		    __func__, type);
 	}
-	buffer_free(&m);
+	sshbuf_free(m);
 	muxclient_request_id++;
 }
 
diff --git a/myproposal.h b/myproposal.h
index 072e36e..08782dd 100644
--- a/myproposal.h
+++ b/myproposal.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: myproposal.h,v 1.54 2016/09/28 16:33:07 djm Exp $ */
+/* $OpenBSD: myproposal.h,v 1.56 2018/07/03 11:39:54 djm Exp $ */
 
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
@@ -107,6 +107,8 @@
 #define	KEX_DEFAULT_PK_ALG	\
 	HOSTKEY_ECDSA_CERT_METHODS \
 	"ssh-ed25519-cert-v01@openssh.com," \
+	"rsa-sha2-512-cert-v01@openssh.com," \
+	"rsa-sha2-256-cert-v01@openssh.com," \
 	"ssh-rsa-cert-v01@openssh.com," \
 	HOSTKEY_ECDSA_METHODS \
 	"ssh-ed25519," \
@@ -121,8 +123,7 @@
 	"aes128-ctr,aes192-ctr,aes256-ctr" \
 	AESGCM_CIPHER_MODES
 
-#define KEX_CLIENT_ENCRYPT KEX_SERVER_ENCRYPT "," \
-	"aes128-cbc,aes192-cbc,aes256-cbc"
+#define KEX_CLIENT_ENCRYPT KEX_SERVER_ENCRYPT
 
 #define KEX_SERVER_MAC \
 	"umac-64-etm@openssh.com," \
diff --git a/nchan.c b/nchan.c
index 20f6a2f..2492955 100644
--- a/nchan.c
+++ b/nchan.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nchan.c,v 1.63 2010/01/26 01:28:35 djm Exp $ */
+/* $OpenBSD: nchan.c,v 1.67 2017/09/12 06:35:32 djm Exp $ */
 /*
  * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl.  All rights reserved.
  *
@@ -33,9 +33,9 @@
 #include <stdarg.h>
 
 #include "openbsd-compat/sys-queue.h"
-#include "ssh1.h"
 #include "ssh2.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 #include "packet.h"
 #include "channels.h"
 #include "compat.h"
@@ -74,18 +74,15 @@
 /*
  * ACTIONS: should never update the channel states
  */
-static void	chan_send_ieof1(Channel *);
-static void	chan_send_oclose1(Channel *);
-static void	chan_send_close2(Channel *);
-static void	chan_send_eof2(Channel *);
-static void	chan_send_eow2(Channel *);
+static void	chan_send_eof2(struct ssh *, Channel *);
+static void	chan_send_eow2(struct ssh *, Channel *);
 
 /* helper */
-static void	chan_shutdown_write(Channel *);
-static void	chan_shutdown_read(Channel *);
+static void	chan_shutdown_write(struct ssh *, Channel *);
+static void	chan_shutdown_read(struct ssh *, Channel *);
 
-static char *ostates[] = { "open", "drain", "wait_ieof", "closed" };
-static char *istates[] = { "open", "drain", "wait_oclose", "closed" };
+static const char *ostates[] = { "open", "drain", "wait_ieof", "closed" };
+static const char *istates[] = { "open", "drain", "wait_oclose", "closed" };
 
 static void
 chan_set_istate(Channel *c, u_int next)
@@ -96,6 +93,7 @@
 	    istates[next]);
 	c->istate = next;
 }
+
 static void
 chan_set_ostate(Channel *c, u_int next)
 {
@@ -106,41 +104,13 @@
 	c->ostate = next;
 }
 
-/*
- * SSH1 specific implementation of event functions
- */
-
-static void
-chan_rcvd_oclose1(Channel *c)
-{
-	debug2("channel %d: rcvd oclose", c->self);
-	switch (c->istate) {
-	case CHAN_INPUT_WAIT_OCLOSE:
-		chan_set_istate(c, CHAN_INPUT_CLOSED);
-		break;
-	case CHAN_INPUT_OPEN:
-		chan_shutdown_read(c);
-		chan_send_ieof1(c);
-		chan_set_istate(c, CHAN_INPUT_CLOSED);
-		break;
-	case CHAN_INPUT_WAIT_DRAIN:
-		/* both local read_failed and remote write_failed  */
-		chan_send_ieof1(c);
-		chan_set_istate(c, CHAN_INPUT_CLOSED);
-		break;
-	default:
-		error("channel %d: protocol error: rcvd_oclose for istate %d",
-		    c->self, c->istate);
-		return;
-	}
-}
 void
-chan_read_failed(Channel *c)
+chan_read_failed(struct ssh *ssh, Channel *c)
 {
 	debug2("channel %d: read failed", c->self);
 	switch (c->istate) {
 	case CHAN_INPUT_OPEN:
-		chan_shutdown_read(c);
+		chan_shutdown_read(ssh, c);
 		chan_set_istate(c, CHAN_INPUT_WAIT_DRAIN);
 		break;
 	default:
@@ -149,25 +119,21 @@
 		break;
 	}
 }
+
 void
-chan_ibuf_empty(Channel *c)
+chan_ibuf_empty(struct ssh *ssh, Channel *c)
 {
 	debug2("channel %d: ibuf empty", c->self);
-	if (buffer_len(&c->input)) {
+	if (sshbuf_len(c->input)) {
 		error("channel %d: chan_ibuf_empty for non empty buffer",
 		    c->self);
 		return;
 	}
 	switch (c->istate) {
 	case CHAN_INPUT_WAIT_DRAIN:
-		if (compat20) {
-			if (!(c->flags & (CHAN_CLOSE_SENT|CHAN_LOCAL)))
-				chan_send_eof2(c);
-			chan_set_istate(c, CHAN_INPUT_CLOSED);
-		} else {
-			chan_send_ieof1(c);
-			chan_set_istate(c, CHAN_INPUT_WAIT_OCLOSE);
-		}
+		if (!(c->flags & (CHAN_CLOSE_SENT|CHAN_LOCAL)))
+			chan_send_eof2(ssh, c);
+		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: chan_ibuf_empty for istate %d",
@@ -175,58 +141,19 @@
 		break;
 	}
 }
-static void
-chan_rcvd_ieof1(Channel *c)
-{
-	debug2("channel %d: rcvd ieof", c->self);
-	switch (c->ostate) {
-	case CHAN_OUTPUT_OPEN:
-		chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
-		break;
-	case CHAN_OUTPUT_WAIT_IEOF:
-		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
-		break;
-	default:
-		error("channel %d: protocol error: rcvd_ieof for ostate %d",
-		    c->self, c->ostate);
-		break;
-	}
-}
-static void
-chan_write_failed1(Channel *c)
-{
-	debug2("channel %d: write failed", c->self);
-	switch (c->ostate) {
-	case CHAN_OUTPUT_OPEN:
-		chan_shutdown_write(c);
-		chan_send_oclose1(c);
-		chan_set_ostate(c, CHAN_OUTPUT_WAIT_IEOF);
-		break;
-	case CHAN_OUTPUT_WAIT_DRAIN:
-		chan_shutdown_write(c);
-		chan_send_oclose1(c);
-		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
-		break;
-	default:
-		error("channel %d: chan_write_failed for ostate %d",
-		    c->self, c->ostate);
-		break;
-	}
-}
+
 void
-chan_obuf_empty(Channel *c)
+chan_obuf_empty(struct ssh *ssh, Channel *c)
 {
 	debug2("channel %d: obuf empty", c->self);
-	if (buffer_len(&c->output)) {
+	if (sshbuf_len(c->output)) {
 		error("channel %d: chan_obuf_empty for non empty buffer",
 		    c->self);
 		return;
 	}
 	switch (c->ostate) {
 	case CHAN_OUTPUT_WAIT_DRAIN:
-		chan_shutdown_write(c);
-		if (!compat20)
-			chan_send_oclose1(c);
+		chan_shutdown_write(ssh, c);
 		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	default:
@@ -235,47 +162,107 @@
 		break;
 	}
 }
-static void
-chan_send_ieof1(Channel *c)
+
+void
+chan_rcvd_eow(struct ssh *ssh, Channel *c)
 {
-	debug2("channel %d: send ieof", c->self);
+	debug2("channel %d: rcvd eow", c->self);
 	switch (c->istate) {
 	case CHAN_INPUT_OPEN:
-	case CHAN_INPUT_WAIT_DRAIN:
-		packet_start(SSH_MSG_CHANNEL_INPUT_EOF);
-		packet_put_int(c->remote_id);
-		packet_send();
-		break;
-	default:
-		error("channel %d: cannot send ieof for istate %d",
-		    c->self, c->istate);
-		break;
-	}
-}
-static void
-chan_send_oclose1(Channel *c)
-{
-	debug2("channel %d: send oclose", c->self);
-	switch (c->ostate) {
-	case CHAN_OUTPUT_OPEN:
-	case CHAN_OUTPUT_WAIT_DRAIN:
-		buffer_clear(&c->output);
-		packet_start(SSH_MSG_CHANNEL_OUTPUT_CLOSE);
-		packet_put_int(c->remote_id);
-		packet_send();
-		break;
-	default:
-		error("channel %d: cannot send oclose for ostate %d",
-		    c->self, c->ostate);
+		chan_shutdown_read(ssh, c);
+		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	}
 }
 
-/*
- * the same for SSH2
- */
 static void
-chan_rcvd_close2(Channel *c)
+chan_send_eof2(struct ssh *ssh, Channel *c)
+{
+	int r;
+
+	debug2("channel %d: send eof", c->self);
+	switch (c->istate) {
+	case CHAN_INPUT_WAIT_DRAIN:
+		if (!c->have_remote_id)
+			fatal("%s: channel %d: no remote_id",
+			    __func__, c->self);
+		if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_EOF)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0)
+			fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
+		c->flags |= CHAN_EOF_SENT;
+		break;
+	default:
+		error("channel %d: cannot send eof for istate %d",
+		    c->self, c->istate);
+		break;
+	}
+}
+
+static void
+chan_send_close2(struct ssh *ssh, Channel *c)
+{
+	int r;
+
+	debug2("channel %d: send close", c->self);
+	if (c->ostate != CHAN_OUTPUT_CLOSED ||
+	    c->istate != CHAN_INPUT_CLOSED) {
+		error("channel %d: cannot send close for istate/ostate %d/%d",
+		    c->self, c->istate, c->ostate);
+	} else if (c->flags & CHAN_CLOSE_SENT) {
+		error("channel %d: already sent close", c->self);
+	} else {
+		if (!c->have_remote_id)
+			fatal("%s: channel %d: no remote_id",
+			    __func__, c->self);
+		if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_CLOSE)) != 0 ||
+		    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0)
+			fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
+		c->flags |= CHAN_CLOSE_SENT;
+	}
+}
+
+static void
+chan_send_eow2(struct ssh *ssh, Channel *c)
+{
+	int r;
+
+	debug2("channel %d: send eow", c->self);
+	if (c->ostate == CHAN_OUTPUT_CLOSED) {
+		error("channel %d: must not sent eow on closed output",
+		    c->self);
+		return;
+	}
+	if (!(datafellows & SSH_NEW_OPENSSH))
+		return;
+	if (!c->have_remote_id)
+		fatal("%s: channel %d: no remote_id", __func__, c->self);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_REQUEST)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, "eow@openssh.com")) != 0 ||
+	    (r = sshpkt_put_u8(ssh, 0)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
+}
+
+/* shared */
+
+void
+chan_rcvd_ieof(struct ssh *ssh, Channel *c)
+{
+	debug2("channel %d: rcvd eof", c->self);
+	c->flags |= CHAN_EOF_RCVD;
+	if (c->ostate == CHAN_OUTPUT_OPEN)
+		chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
+	if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN &&
+	    sshbuf_len(c->output) == 0 &&
+	    !CHANNEL_EFD_OUTPUT_ACTIVE(c))
+		chan_obuf_empty(ssh, c);
+}
+
+void
+chan_rcvd_oclose(struct ssh *ssh, Channel *c)
 {
 	debug2("channel %d: rcvd close", c->self);
 	if (!(c->flags & CHAN_LOCAL)) {
@@ -301,46 +288,27 @@
 	}
 	switch (c->istate) {
 	case CHAN_INPUT_OPEN:
-		chan_shutdown_read(c);
+		chan_shutdown_read(ssh, c);
 		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	case CHAN_INPUT_WAIT_DRAIN:
 		if (!(c->flags & CHAN_LOCAL))
-			chan_send_eof2(c);
+			chan_send_eof2(ssh, c);
 		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	}
 }
 
 void
-chan_rcvd_eow(Channel *c)
-{
-	debug2("channel %d: rcvd eow", c->self);
-	switch (c->istate) {
-	case CHAN_INPUT_OPEN:
-		chan_shutdown_read(c);
-		chan_set_istate(c, CHAN_INPUT_CLOSED);
-		break;
-	}
-}
-static void
-chan_rcvd_eof2(Channel *c)
-{
-	debug2("channel %d: rcvd eof", c->self);
-	c->flags |= CHAN_EOF_RCVD;
-	if (c->ostate == CHAN_OUTPUT_OPEN)
-		chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
-}
-static void
-chan_write_failed2(Channel *c)
+chan_write_failed(struct ssh *ssh, Channel *c)
 {
 	debug2("channel %d: write failed", c->self);
 	switch (c->ostate) {
 	case CHAN_OUTPUT_OPEN:
 	case CHAN_OUTPUT_WAIT_DRAIN:
-		chan_shutdown_write(c);
+		chan_shutdown_write(ssh, c);
 		if (strcmp(c->ctype, "session") == 0)
-			chan_send_eow2(c);
+			chan_send_eow2(ssh, c);
 		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	default:
@@ -349,97 +317,15 @@
 		break;
 	}
 }
-static void
-chan_send_eof2(Channel *c)
-{
-	debug2("channel %d: send eof", c->self);
-	switch (c->istate) {
-	case CHAN_INPUT_WAIT_DRAIN:
-		packet_start(SSH2_MSG_CHANNEL_EOF);
-		packet_put_int(c->remote_id);
-		packet_send();
-		c->flags |= CHAN_EOF_SENT;
-		break;
-	default:
-		error("channel %d: cannot send eof for istate %d",
-		    c->self, c->istate);
-		break;
-	}
-}
-static void
-chan_send_close2(Channel *c)
-{
-	debug2("channel %d: send close", c->self);
-	if (c->ostate != CHAN_OUTPUT_CLOSED ||
-	    c->istate != CHAN_INPUT_CLOSED) {
-		error("channel %d: cannot send close for istate/ostate %d/%d",
-		    c->self, c->istate, c->ostate);
-	} else if (c->flags & CHAN_CLOSE_SENT) {
-		error("channel %d: already sent close", c->self);
-	} else {
-		packet_start(SSH2_MSG_CHANNEL_CLOSE);
-		packet_put_int(c->remote_id);
-		packet_send();
-		c->flags |= CHAN_CLOSE_SENT;
-	}
-}
-static void
-chan_send_eow2(Channel *c)
-{
-	debug2("channel %d: send eow", c->self);
-	if (c->ostate == CHAN_OUTPUT_CLOSED) {
-		error("channel %d: must not sent eow on closed output",
-		    c->self);
-		return;
-	}
-	if (!(datafellows & SSH_NEW_OPENSSH))
-		return;
-	packet_start(SSH2_MSG_CHANNEL_REQUEST);
-	packet_put_int(c->remote_id);
-	packet_put_cstring("eow@openssh.com");
-	packet_put_char(0);
-	packet_send();
-}
-
-/* shared */
 
 void
-chan_rcvd_ieof(Channel *c)
-{
-	if (compat20)
-		chan_rcvd_eof2(c);
-	else
-		chan_rcvd_ieof1(c);
-	if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN &&
-	    buffer_len(&c->output) == 0 &&
-	    !CHANNEL_EFD_OUTPUT_ACTIVE(c))
-		chan_obuf_empty(c);
-}
-void
-chan_rcvd_oclose(Channel *c)
-{
-	if (compat20)
-		chan_rcvd_close2(c);
-	else
-		chan_rcvd_oclose1(c);
-}
-void
-chan_write_failed(Channel *c)
-{
-	if (compat20)
-		chan_write_failed2(c);
-	else
-		chan_write_failed1(c);
-}
-
-void
-chan_mark_dead(Channel *c)
+chan_mark_dead(struct ssh *ssh, Channel *c)
 {
 	c->type = SSH_CHANNEL_ZOMBIE;
 }
 
 int
-chan_is_dead(Channel *c, int do_send)
+chan_is_dead(struct ssh *ssh, Channel *c, int do_send)
 {
 	if (c->type == SSH_CHANNEL_ZOMBIE) {
 		debug2("channel %d: zombie", c->self);
@@ -447,16 +333,12 @@
 	}
 	if (c->istate != CHAN_INPUT_CLOSED || c->ostate != CHAN_OUTPUT_CLOSED)
 		return 0;
-	if (!compat20) {
-		debug2("channel %d: is dead", c->self);
-		return 1;
-	}
 	if ((datafellows & SSH_BUG_EXTEOF) &&
 	    c->extended_usage == CHAN_EXTENDED_WRITE &&
 	    c->efd != -1 &&
-	    buffer_len(&c->extended) > 0) {
-		debug2("channel %d: active efd: %d len %d",
-		    c->self, c->efd, buffer_len(&c->extended));
+	    sshbuf_len(c->extended) > 0) {
+		debug2("channel %d: active efd: %d len %zu",
+		    c->self, c->efd, sshbuf_len(c->extended));
 		return 0;
 	}
 	if (c->flags & CHAN_LOCAL) {
@@ -465,7 +347,7 @@
 	}		
 	if (!(c->flags & CHAN_CLOSE_SENT)) {
 		if (do_send) {
-			chan_send_close2(c);
+			chan_send_close2(ssh, c);
 		} else {
 			/* channel would be dead if we sent a close */
 			if (c->flags & CHAN_CLOSE_RCVD) {
@@ -485,10 +367,10 @@
 
 /* helper */
 static void
-chan_shutdown_write(Channel *c)
+chan_shutdown_write(struct ssh *ssh, Channel *c)
 {
-	buffer_clear(&c->output);
-	if (compat20 && c->type == SSH_CHANNEL_LARVAL)
+	sshbuf_reset(c->output);
+	if (c->type == SSH_CHANNEL_LARVAL)
 		return;
 	/* shutdown failure is allowed if write failed already */
 	debug2("channel %d: close_write", c->self);
@@ -498,16 +380,17 @@
 			    "shutdown() failed for fd %d: %.100s",
 			    c->self, c->sock, strerror(errno));
 	} else {
-		if (channel_close_fd(&c->wfd) < 0)
+		if (channel_close_fd(ssh, &c->wfd) < 0)
 			logit("channel %d: chan_shutdown_write: "
 			    "close() failed for fd %d: %.100s",
 			    c->self, c->wfd, strerror(errno));
 	}
 }
+
 static void
-chan_shutdown_read(Channel *c)
+chan_shutdown_read(struct ssh *ssh, Channel *c)
 {
-	if (compat20 && c->type == SSH_CHANNEL_LARVAL)
+	if (c->type == SSH_CHANNEL_LARVAL)
 		return;
 	debug2("channel %d: close_read", c->self);
 	if (c->sock != -1) {
@@ -523,7 +406,7 @@
 			    c->self, c->sock, c->istate, c->ostate,
 			    strerror(errno));
 	} else {
-		if (channel_close_fd(&c->rfd) < 0)
+		if (channel_close_fd(ssh, &c->rfd) < 0)
 			logit("channel %d: chan_shutdown_read: "
 			    "close() failed for fd %d: %.100s",
 			    c->self, c->rfd, strerror(errno));
diff --git a/opacket.c b/opacket.c
index 5970dd3..e637d7a 100644
--- a/opacket.c
+++ b/opacket.c
@@ -1,7 +1,10 @@
+/* $OpenBSD: opacket.c,v 1.7 2017/10/20 01:56:39 djm Exp $ */
 /* Written by Markus Friedl. Placed in the public domain.  */
 
 #include "includes.h"
 
+#include <stdarg.h>
+
 #include "ssherr.h"
 #include "packet.h"
 #include "log.h"
@@ -74,16 +77,6 @@
 		fatal("%s: %s", __func__, ssh_err(r));
 }
 
-#ifdef WITH_SSH1
-void
-ssh_packet_put_bignum(struct ssh *ssh, BIGNUM * value)
-{
-	int r;
-
-	if ((r = sshpkt_put_bignum1(ssh, value)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-}
-#endif
 
 #ifdef WITH_OPENSSL
 void
@@ -150,16 +143,6 @@
 	return val;
 }
 
-#ifdef WITH_SSH1
-void
-ssh_packet_get_bignum(struct ssh *ssh, BIGNUM * value)
-{
-	int r;
-
-	if ((r = sshpkt_get_bignum1(ssh, value)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-}
-#endif
 
 #ifdef WITH_OPENSSL
 void
diff --git a/opacket.h b/opacket.h
index c487f4f..f92fe58 100644
--- a/opacket.h
+++ b/opacket.h
@@ -1,3 +1,4 @@
+/* $OpenBSD: opacket.h,v 1.13 2018/07/06 09:03:02 sf Exp $ */
 #ifndef _OPACKET_H
 /* Written by Markus Friedl. Placed in the public domain.  */
 
@@ -6,7 +7,6 @@
 void     ssh_packet_put_char(struct ssh *, int ch);
 void     ssh_packet_put_int(struct ssh *, u_int value);
 void     ssh_packet_put_int64(struct ssh *, u_int64_t value);
-void     ssh_packet_put_bignum(struct ssh *, BIGNUM * value);
 void     ssh_packet_put_bignum2(struct ssh *, BIGNUM * value);
 void     ssh_packet_put_ecpoint(struct ssh *, const EC_GROUP *, const EC_POINT *);
 void     ssh_packet_put_string(struct ssh *, const void *buf, u_int len);
@@ -17,7 +17,6 @@
 u_int	 ssh_packet_get_char(struct ssh *);
 u_int	 ssh_packet_get_int(struct ssh *);
 u_int64_t ssh_packet_get_int64(struct ssh *);
-void     ssh_packet_get_bignum(struct ssh *, BIGNUM * value);
 void     ssh_packet_get_bignum2(struct ssh *, BIGNUM * value);
 void	 ssh_packet_get_ecpoint(struct ssh *, const EC_GROUP *, EC_POINT *);
 void	*ssh_packet_get_string(struct ssh *, u_int *length_ptr);
@@ -60,10 +59,6 @@
 	ssh_packet_set_protocol_flags(active_state, (protocol_flags))
 #define packet_get_protocol_flags() \
 	ssh_packet_get_protocol_flags(active_state)
-#define packet_start_compression(level) \
-	ssh_packet_start_compression(active_state, (level))
-#define packet_set_encryption_key(key, keylen, number) \
-	ssh_packet_set_encryption_key(active_state, (key), (keylen), (number))
 #define packet_start(type) \
 	ssh_packet_start(active_state, (type))
 #define packet_put_char(value) \
@@ -78,8 +73,6 @@
 	ssh_packet_put_cstring(active_state, (str))
 #define packet_put_raw(buf, len) \
 	ssh_packet_put_raw(active_state, (buf), (len))
-#define packet_put_bignum(value) \
-	ssh_packet_put_bignum(active_state, (value))
 #define packet_put_bignum2(value) \
 	ssh_packet_put_bignum2(active_state, (value))
 #define packet_send() \
@@ -88,8 +81,6 @@
 	ssh_packet_read(active_state)
 #define packet_get_int64() \
 	ssh_packet_get_int64(active_state)
-#define packet_get_bignum(value) \
-	ssh_packet_get_bignum(active_state, (value))
 #define packet_get_bignum2(value) \
 	ssh_packet_get_bignum2(active_state, (value))
 #define packet_remaining() \
@@ -157,5 +148,7 @@
 	ssh_packet_set_mux(active_state)
 #define packet_get_mux() \
 	ssh_packet_get_mux(active_state)
+#define packet_clear_keys() \
+	ssh_packet_clear_keys(active_state)
 
 #endif /* _OPACKET_H */
diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in
index d51eacf..2fd9b95 100644
--- a/openbsd-compat/Makefile.in
+++ b/openbsd-compat/Makefile.in
@@ -1,5 +1,3 @@
-# $Id: Makefile.in,v 1.56 2014/09/30 23:43:08 djm Exp $
-
 sysconfdir=@sysconfdir@
 piddir=@piddir@
 srcdir=@srcdir@
@@ -16,11 +14,85 @@
 INSTALL=@INSTALL@
 LDFLAGS=-L. @LDFLAGS@
 
-OPENBSD=base64.o basename.o bcrypt_pbkdf.o bindresvport.o blowfish.o daemon.o dirname.o fmt_scaled.o getcwd.o getgrouplist.o getopt_long.o getrrsetbyname.o glob.o inet_aton.o inet_ntoa.o inet_ntop.o mktemp.o pwcache.o readpassphrase.o reallocarray.o realpath.o rresvport.o setenv.o setproctitle.o sha1.o sha2.o rmd160.o md5.o sigact.o strcasestr.o strlcat.o strlcpy.o strmode.o strnlen.o strptime.o strsep.o strtonum.o strtoll.o strtoul.o strtoull.o timingsafe_bcmp.o vis.o blowfish.o bcrypt_pbkdf.o explicit_bzero.o
+OPENBSD=base64.o \
+	basename.o \
+	bcrypt_pbkdf.o \
+	bcrypt_pbkdf.o \
+	bindresvport.o \
+	blowfish.o \
+	daemon.o \
+	dirname.o \
+	explicit_bzero.o \
+	fmt_scaled.o \
+	freezero.o \
+	getcwd.o \
+	getgrouplist.o \
+	getopt_long.o \
+	getrrsetbyname.o \
+	glob.o \
+	inet_aton.o \
+	inet_ntoa.o \
+	inet_ntop.o \
+	md5.o \
+	mktemp.o \
+	pwcache.o \
+	readpassphrase.o \
+	reallocarray.o \
+	realpath.o \
+	recallocarray.o \
+	rmd160.o \
+	rresvport.o \
+	setenv.o \
+	setproctitle.o \
+	sha1.o \
+	sha2.o \
+	sigact.o \
+	strcasestr.o \
+	strlcat.o \
+	strlcpy.o \
+	strmode.o \
+	strndup.o \
+	strnlen.o \
+	strptime.o \
+	strsep.o \
+	strtoll.o \
+	strtonum.o \
+	strtoull.o \
+	strtoul.o \
+	timingsafe_bcmp.o \
+	vis.o
 
-COMPAT=arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o getrrsetbyname-ldns.o bsd-err.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-setres_id.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xcrypt.o kludge-fd_set.o
+COMPAT=	arc4random.o \
+	bsd-asprintf.o \
+	bsd-closefrom.o \
+	bsd-cygwin_util.o \
+	bsd-err.o \
+	bsd-flock.o \
+	bsd-getline.o \
+	bsd-getpagesize.o \
+	bsd-getpeereid.o \
+	bsd-malloc.o \
+	bsd-misc.o \
+	bsd-nextstep.o \
+	bsd-openpty.o \
+	bsd-poll.o \
+	bsd-setres_id.o \
+	bsd-signal.o \
+	bsd-snprintf.o \
+	bsd-statvfs.o \
+	bsd-waitpid.o \
+	fake-rfc2553.o \
+	getrrsetbyname-ldns.o \
+	kludge-fd_set.o \
+	openssl-compat.o \
+	xcrypt.o
 
-PORTS=port-aix.o port-irix.o port-linux.o port-solaris.o port-tun.o port-uw.o
+PORTS=	port-aix.o \
+	port-irix.o \
+	port-linux.o \
+	port-solaris.o \
+	port-net.o \
+	port-uw.o
 
 .c.o:
 	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c
index b6256b4..578f69f 100644
--- a/openbsd-compat/arc4random.c
+++ b/openbsd-compat/arc4random.c
@@ -33,6 +33,10 @@
 #include <string.h>
 #include <unistd.h>
 
+#ifdef HAVE_SYS_RANDOM_H
+# include <sys/random.h>
+#endif
+
 #ifndef HAVE_ARC4RANDOM
 
 #ifdef WITH_OPENSSL
@@ -78,8 +82,9 @@
 }
 
 #ifndef WITH_OPENSSL
-#define SSH_RANDOM_DEV "/dev/urandom"
-/* XXX use getrandom() if supported on Linux */
+# ifndef SSH_RANDOM_DEV
+#  define SSH_RANDOM_DEV "/dev/urandom"
+# endif /* SSH_RANDOM_DEV */
 static void
 getrnd(u_char *s, size_t len)
 {
@@ -87,6 +92,11 @@
 	ssize_t r;
 	size_t o = 0;
 
+#ifdef HAVE_GETRANDOM
+	if ((r = getrandom(s, len, 0)) > 0 && (size_t)r == len)
+		return;
+#endif /* HAVE_GETRANDOM */
+
 	if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1)
 		fatal("Couldn't open %s: %s", SSH_RANDOM_DEV, strerror(errno));
 	while (o < len) {
@@ -101,7 +111,7 @@
 	}
 	close(fd);
 }
-#endif
+#endif /* WITH_OPENSSL */
 
 static void
 _rs_stir(void)
diff --git a/openbsd-compat/bcrypt_pbkdf.c b/openbsd-compat/bcrypt_pbkdf.c
index 17cb022..4e206cf 100644
--- a/openbsd-compat/bcrypt_pbkdf.c
+++ b/openbsd-compat/bcrypt_pbkdf.c
@@ -46,7 +46,7 @@
  * function with the following modifications:
  * 1. The input password and salt are preprocessed with SHA512.
  * 2. The output length is expanded to 256 bits.
- * 3. Subsequently the magic string to be encrypted is lengthened and modifed
+ * 3. Subsequently the magic string to be encrypted is lengthened and modified
  *    to "OxychromaticBlowfishSwatDynamite"
  * 4. The hash function is defined to perform 64 rounds of initial state
  *    expansion. (More rounds are performed by iterating the hash.)
diff --git a/openbsd-compat/bsd-closefrom.c b/openbsd-compat/bsd-closefrom.c
index bcc09a8..a6833d4 100644
--- a/openbsd-compat/bsd-closefrom.c
+++ b/openbsd-compat/bsd-closefrom.c
@@ -81,7 +81,7 @@
 
     /* Check for a /proc/$$/fd directory. */
     len = snprintf(fdpath, sizeof(fdpath), "/proc/%ld/fd", (long)getpid());
-    if (len > 0 && (size_t)len <= sizeof(fdpath) && (dirp = opendir(fdpath))) {
+    if (len > 0 && (size_t)len < sizeof(fdpath) && (dirp = opendir(fdpath))) {
 	while ((dent = readdir(dirp)) != NULL) {
 	    fd = strtol(dent->d_name, &endp, 10);
 	    if (dent->d_name != endp && *endp == '\0' &&
diff --git a/openbsd-compat/bsd-cray.c b/openbsd-compat/bsd-cray.c
deleted file mode 100644
index c02e632..0000000
--- a/openbsd-compat/bsd-cray.c
+++ /dev/null
@@ -1,816 +0,0 @@
-/*
- *
- * bsd-cray.c
- *
- * Copyright (c) 2002, Cray Inc.  (Wendy Palm <wendyp@cray.com>)
- * Significant portions provided by
- *          Wayne Schroeder, SDSC <schroeder@sdsc.edu>
- *          William Jones, UTexas <jones@tacc.utexas.edu>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Created: Apr 22 16.34:00 2002 wp
- *
- * This file contains functions required for proper execution
- * on UNICOS systems.
- *
- */
-#ifdef _UNICOS
-
-#include <udb.h>
-#include <tmpdir.h>
-#include <unistd.h>
-#include <sys/category.h>
-#include <utmp.h>
-#include <sys/jtab.h>
-#include <signal.h>
-#include <sys/priv.h>
-#include <sys/secparm.h>
-#include <sys/tfm.h>
-#include <sys/usrv.h>
-#include <sys/sysv.h>
-#include <sys/sectab.h>
-#include <sys/secstat.h>
-#include <sys/stat.h>
-#include <sys/session.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <ia.h>
-#include <urm.h>
-#include "ssh.h"
-
-#include "includes.h"
-#include "sys/types.h"
-
-#ifndef HAVE_STRUCT_SOCKADDR_STORAGE
-# define      _SS_MAXSIZE     128     /* Implementation specific max size */
-# define       _SS_PADSIZE     (_SS_MAXSIZE - sizeof (struct sockaddr))
-
-# define ss_family ss_sa.sa_family
-#endif /* !HAVE_STRUCT_SOCKADDR_STORAGE */
-
-#ifndef IN6_IS_ADDR_LOOPBACK
-# define IN6_IS_ADDR_LOOPBACK(a) \
-	(((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \
-	 ((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1))
-#endif /* !IN6_IS_ADDR_LOOPBACK */
-
-#ifndef AF_INET6
-/* Define it to something that should never appear */
-#define AF_INET6 AF_MAX
-#endif
-
-#include "log.h"
-#include "servconf.h"
-#include "bsd-cray.h"
-
-#define MAXACID 80
-
-extern ServerOptions options;
-
-char cray_tmpdir[TPATHSIZ + 1];		    /* job TMPDIR path */
-
-struct sysv sysv;	/* system security structure */
-struct usrv usrv;	/* user security structure */
-
-/*
- * Functions.
- */
-void cray_retain_utmp(struct utmp *, int);
-void cray_delete_tmpdir(char *, int, uid_t);
-void cray_init_job(struct passwd *);
-void cray_set_tmpdir(struct utmp *);
-void cray_login_failure(char *, int);
-int cray_setup(uid_t, char *, const char *);
-int cray_access_denied(char *);
-
-void
-cray_login_failure(char *username, int errcode)
-{
-	struct udb *ueptr;		/* UDB pointer for username */
-	ia_failure_t fsent;		/* ia_failure structure */
-	ia_failure_ret_t fret;		/* ia_failure return stuff */
-	struct jtab jtab;		/* job table structure */
-	int jid = 0;			/* job id */
-
-	if ((jid = getjtab(&jtab)) < 0)
-		debug("cray_login_failure(): getjtab error");
-
-	getsysudb();
-	if ((ueptr = getudbnam(username)) == UDB_NULL)
-		debug("cray_login_failure(): getudbname() returned NULL");
-	endudb();
-
-	memset(&fsent, '\0', sizeof(fsent));
-	fsent.revision = 0;
-	fsent.uname = username;
-	fsent.host = (char *)get_canonical_hostname(options.use_dns);
-	fsent.ttyn = "sshd";
-	fsent.caller = IA_SSHD;
-	fsent.flags = IA_INTERACTIVE;
-	fsent.ueptr = ueptr;
-	fsent.jid = jid;
-	fsent.errcode = errcode;
-	fsent.pwdp = NULL;
-	fsent.exitcode = 0;	/* dont exit in ia_failure() */
-
-	fret.revision = 0;
-	fret.normal = 0;
-
-	/*
-	 * Call ia_failure because of an login failure.
-	 */
-	ia_failure(&fsent, &fret);
-}
-
-/*
- *  Cray access denied
- */
-int
-cray_access_denied(char *username)
-{
-	struct udb *ueptr;		/* UDB pointer for username */
-	int errcode;			/* IA errorcode */
-
-	errcode = 0;
-	getsysudb();
-	if ((ueptr = getudbnam(username)) == UDB_NULL)
-		debug("cray_login_failure(): getudbname() returned NULL");
-	endudb();
-
-	if (ueptr != NULL && ueptr->ue_disabled)
-		errcode = IA_DISABLED;
-	if (errcode)
-		cray_login_failure(username, errcode);
-
-	return (errcode);
-}
-
-/*
- * record_failed_login: generic "login failed" interface function
- */
-void
-record_failed_login(const char *user, const char *hostname, const char *ttyname)
-{
-	cray_login_failure((char *)user, IA_UDBERR);
-}
-
-int
-cray_setup (uid_t uid, char *username, const char *command)
-{
-	extern struct udb *getudb();
-	extern char *setlimits();
-
-	int err;			/* error return */
-	time_t system_time;		/* current system clock */
-	time_t expiration_time;		/* password expiration time */
-	int maxattempts;		/* maximum no. of failed login attempts */
-	int SecureSys;			/* unicos security flag */
-	int minslevel = 0;		/* system minimum security level */
-	int i, j;
-	int valid_acct = -1;		/* flag for reading valid acct */
-	char acct_name[MAXACID] = { "" }; /* used to read acct name */
-	struct jtab jtab;		/* Job table struct */
-	struct udb ue;			/* udb entry for logging-in user */
-	struct udb *up;			/* pointer to UDB entry */
-	struct secstat secinfo;		/* file  security attributes */
-	struct servprov init_info;	/* used for sesscntl() call */
-	int jid;			/* job ID */
-	int pid;			/* process ID */
-	char *sr;			/* status return from setlimits() */
-	char *ttyn = NULL;		/* ttyname or command name*/
-	char hostname[MAXHOSTNAMELEN];
-	/* passwd stuff for ia_user */
-	passwd_t pwdacm, pwddialup, pwdudb, pwdwal, pwddce;
-	ia_user_ret_t uret;		/* stuff returned from ia_user */
-	ia_user_t usent;		/* ia_user main structure */
-	int ia_rcode;			/* ia_user return code */
-	ia_failure_t fsent;		/* ia_failure structure */
-	ia_failure_ret_t fret;		/* ia_failure return stuff */
-	ia_success_t ssent;		/* ia_success structure */
-	ia_success_ret_t sret;		/* ia_success return stuff */
-	int ia_mlsrcode;		/* ia_mlsuser return code */
-	int secstatrc;			/* [f]secstat return code */
-
-	if (SecureSys = (int)sysconf(_SC_CRAY_SECURE_SYS)) {
-		getsysv(&sysv, sizeof(struct sysv));
-		minslevel = sysv.sy_minlvl;
-		if (getusrv(&usrv) < 0)
-			fatal("getusrv() failed, errno = %d", errno);
-	}
-	hostname[0] = '\0';
-	strlcpy(hostname,
-	   (char *)get_canonical_hostname(options.use_dns),
-	   MAXHOSTNAMELEN);
-	/*
-	 *  Fetch user's UDB entry.
-	 */
-	getsysudb();
-	if ((up = getudbnam(username)) == UDB_NULL)
-		fatal("cannot fetch user's UDB entry");
-
-	/*
-	 *  Prevent any possible fudging so perform a data
-	 *  safety check and compare the supplied uid against
-	 *  the udb's uid.
-	 */
-	if (up->ue_uid != uid)
-		fatal("IA uid missmatch");
-	endudb();
-
-	if ((jid = getjtab(&jtab)) < 0) {
-		debug("getjtab");
-		return(-1);
-	}
-	pid = getpid();
-	ttyn = ttyname(0);
-	if (SecureSys) {
-		if (ttyn != NULL)
-			secstatrc = secstat(ttyn, &secinfo);
-		else
-			secstatrc = fsecstat(1, &secinfo);
-
-		if (secstatrc == 0)
-			debug("[f]secstat() successful");
-		else
-			fatal("[f]secstat() error, rc = %d", secstatrc);
-	}
-	if ((ttyn == NULL) && ((char *)command != NULL))
-		ttyn = (char *)command;
-	/*
-	 *  Initialize all structures to call ia_user
-	 */
-	usent.revision = 0;
-	usent.uname = username;
-	usent.host = hostname;
-	usent.ttyn = ttyn;
-	usent.caller = IA_SSHD;
-	usent.pswdlist = &pwdacm;
-	usent.ueptr = &ue;
-	usent.flags = IA_INTERACTIVE | IA_FFLAG;
-	pwdacm.atype = IA_SECURID;
-	pwdacm.pwdp = NULL;
-	pwdacm.next = &pwdudb;
-
-	pwdudb.atype = IA_UDB;
-	pwdudb.pwdp = NULL;
-	pwdudb.next = &pwddce;
-
-	pwddce.atype = IA_DCE;
-	pwddce.pwdp = NULL;
-	pwddce.next = &pwddialup;
-
-	pwddialup.atype = IA_DIALUP;
-	pwddialup.pwdp = NULL;
-	/* pwddialup.next = &pwdwal; */
-	pwddialup.next = NULL;
-
-	pwdwal.atype = IA_WAL;
-	pwdwal.pwdp = NULL;
-	pwdwal.next = NULL;
-
-	uret.revision = 0;
-	uret.pswd = NULL;
-	uret.normal = 0;
-
-	ia_rcode = ia_user(&usent, &uret);
-	switch (ia_rcode) {
-	/*
-	 *  These are acceptable return codes from ia_user()
-	 */
-	case IA_UDBWEEK:        /* Password Expires in 1 week */
-		expiration_time = ue.ue_pwage.time + ue.ue_pwage.maxage;
-		printf ("WARNING - your current password will expire %s\n",
-		ctime((const time_t *)&expiration_time));
-		break;
-	case IA_UDBEXPIRED:
-		if (ttyname(0) != NULL) {
-			/* Force a password change */
-			printf("Your password has expired; Choose a new one.\n");
-			execl("/bin/passwd", "passwd", username, 0);
-			exit(9);
-			}
-		break;
-	case IA_NORMAL:         /* Normal Return Code */
-		break;
-	case IA_BACKDOOR:
-		/* XXX: can we memset it to zero here so save some of this */
-		strlcpy(ue.ue_name, "root", sizeof(ue.ue_name));
-		strlcpy(ue.ue_dir, "/", sizeof(ue.ue_dir));
-		strlcpy(ue.ue_shell, "/bin/sh", sizeof(ue.ue_shell));
-
-		ue.ue_passwd[0] = '\0';
-		ue.ue_age[0] = '\0';
-		ue.ue_comment[0] = '\0';
-		ue.ue_loghost[0] = '\0';
-		ue.ue_logline[0] = '\0';
-
-		ue.ue_uid = -1;
-		ue.ue_nice[UDBRC_INTER] = 0;
-
-		for (i = 0; i < MAXVIDS; i++)
-			ue.ue_gids[i] = 0;
-
-		ue.ue_logfails = 0;
-		ue.ue_minlvl = ue.ue_maxlvl = ue.ue_deflvl = minslevel;
-		ue.ue_defcomps = 0;
-		ue.ue_comparts = 0;
-		ue.ue_permits = 0;
-		ue.ue_trap = 0;
-		ue.ue_disabled = 0;
-		ue.ue_logtime = 0;
-		break;
-	case IA_CONSOLE:        /* Superuser not from Console */
-	case IA_TRUSTED:	/* Trusted user */
-		if (options.permit_root_login > PERMIT_NO)
-			break;	/* Accept root login */
-	default:
-	/*
-	 *  These are failed return codes from ia_user()
-	 */
-		switch (ia_rcode)
-		{
-		case IA_BADAUTH:
-			printf("Bad authorization, access denied.\n");
-			break;
-		case IA_DISABLED:
-			printf("Your login has been disabled. Contact the system ");
-			printf("administrator for assistance.\n");
-			break;
-		case IA_GETSYSV:
-			printf("getsysv() failed - errno = %d\n", errno);
-			break;
-		case IA_MAXLOGS:
-			printf("Maximum number of failed login attempts exceeded.\n");
-			printf("Access denied.\n");
-			break;
-		case IA_UDBPWDNULL:
-			if (SecureSys)
-				printf("NULL Password not allowed on MLS systems.\n");
-			break;
-		default:
-			break;
-		}
-
-		/*
-		 *  Authentication failed.
-		 */
-		printf("sshd: Login incorrect, (0%o)\n",
-		    ia_rcode-IA_ERRORCODE);
-
-		/*
-		 *  Initialize structure for ia_failure
-		 *  which will exit.
-		 */
-		fsent.revision = 0;
-		fsent.uname = username;
-		fsent.host = hostname;
-		fsent.ttyn = ttyn;
-		fsent.caller = IA_SSHD;
-		fsent.flags = IA_INTERACTIVE;
-		fsent.ueptr = &ue;
-		fsent.jid = jid;
-		fsent.errcode = ia_rcode;
-		fsent.pwdp = uret.pswd;
-		fsent.exitcode = 1;
-
-		fret.revision = 0;
-		fret.normal = 0;
-
-		/*
-		*  Call ia_failure because of an IA failure.
-		*  There is no return because ia_failure exits.
-		*/
-		ia_failure(&fsent, &fret);
-
-		exit(1);
-	}
-
-	ia_mlsrcode = IA_NORMAL;
-	if (SecureSys) {
-		debug("calling ia_mlsuser()");
-		ia_mlsrcode = ia_mlsuser(&ue, &secinfo, &usrv, NULL, 0);
-	}
-	if (ia_mlsrcode != IA_NORMAL) {
-		printf("sshd: Login incorrect, (0%o)\n",
-		    ia_mlsrcode-IA_ERRORCODE);
-		/*
-		 *  Initialize structure for ia_failure
-		 *  which will exit.
-		 */
-		fsent.revision = 0;
-		fsent.uname = username;
-		fsent.host = hostname;
-		fsent.ttyn = ttyn;
-		fsent.caller = IA_SSHD;
-		fsent.flags = IA_INTERACTIVE;
-		fsent.ueptr = &ue;
-		fsent.jid  = jid;
-		fsent.errcode = ia_mlsrcode;
-		fsent.pwdp = uret.pswd;
-		fsent.exitcode = 1;
-		fret.revision = 0;
-		fret.normal = 0;
-
-		/*
-		 *  Call ia_failure because of an IA failure.
-		 *  There is no return because ia_failure exits.
-		 */
-		ia_failure(&fsent,&fret);
-		exit(1);
-	}
-
-	/* Provide login status information */
-	if (options.print_lastlog && ue.ue_logtime != 0) {
-		printf("Last successful login was : %.*s ", 19,
-		    (char *)ctime(&ue.ue_logtime));
-
-		if (*ue.ue_loghost != '\0') {
-			printf("from %.*s\n", sizeof(ue.ue_loghost),
-			    ue.ue_loghost);
-		} else {
-			printf("on %.*s\n", sizeof(ue.ue_logline),
-			    ue.ue_logline);
-		}
-
-		if (SecureSys && (ue.ue_logfails != 0)) {
-			printf("  followed by %d failed attempts\n",
-			    ue.ue_logfails);
-		}
-	}
-
-	/*
-	 * Call ia_success to process successful I/A.
-	 */
-	ssent.revision = 0;
-	ssent.uname = username;
-	ssent.host = hostname;
-	ssent.ttyn = ttyn;
-	ssent.caller = IA_SSHD;
-	ssent.flags = IA_INTERACTIVE;
-	ssent.ueptr = &ue;
-	ssent.jid = jid;
-	ssent.errcode = ia_rcode;
-	ssent.us = NULL;
-	ssent.time = 1;	/* Set ue_logtime */
-
-	sret.revision = 0;
-	sret.normal = 0;
-
-	ia_success(&ssent, &sret);
-
-	/*
-	 * Query for account, iff > 1 valid acid & askacid permbit
-	 */
-	if (((ue.ue_permbits & PERMBITS_ACCTID) ||
-	    (ue.ue_acids[0] >= 0) && (ue.ue_acids[1] >= 0)) &&
-	    ue.ue_permbits & PERMBITS_ASKACID) {
-		if (ttyname(0) != NULL) {
-			debug("cray_setup: ttyname true case, %.100s", ttyname);
-			while (valid_acct == -1) {
-				printf("Account (? for available accounts)"
-				    " [%s]: ", acid2nam(ue.ue_acids[0]));
-				fgets(acct_name, MAXACID, stdin);
-				switch (acct_name[0]) {
-				case EOF:
-					exit(0);
-					break;
-				case '\0':
-					valid_acct = ue.ue_acids[0];
-					strlcpy(acct_name, acid2nam(valid_acct), MAXACID);
-					break;
-				case '?':
-					/* Print the list 3 wide */
-					for (i = 0, j = 0; i < MAXVIDS; i++) {
-						if (ue.ue_acids[i] == -1) {
-							printf("\n");
-							break;
-						}
-						if (++j == 4) {
-							j = 1;
-							printf("\n");
-						}
-						printf(" %s",
-						    acid2nam(ue.ue_acids[i]));
-					}
-					if (ue.ue_permbits & PERMBITS_ACCTID) {
-						printf("\"acctid\" permbit also allows"
-						    " you to select any valid "
-						    "account name.\n");
-					}
-					printf("\n");
-					break;
-				default:
-					valid_acct = nam2acid(acct_name);
-					if (valid_acct == -1)
-						printf(
-						    "Account id not found for"
-						    " account name \"%s\"\n\n",
-						    acct_name);
-					break;
-				}
-				/*
-				 * If an account was given, search the user's
-				 * acids array to verify they can use this account.
-				 */
-				if ((valid_acct != -1) &&
-				    !(ue.ue_permbits & PERMBITS_ACCTID)) {
-					for (i = 0; i < MAXVIDS; i++) {
-						if (ue.ue_acids[i] == -1)
-							break;
-						if (valid_acct == ue.ue_acids[i])
-							break;
-					}
-					if (i == MAXVIDS ||
-					    ue.ue_acids[i] == -1) {
-						fprintf(stderr, "Cannot set"
-						    " account name to "
-						    "\"%s\", permission "
-						    "denied\n\n", acct_name);
-						valid_acct = -1;
-					}
-				}
-			}
-		} else {
-			/*
-			 * The client isn't connected to a terminal and can't
-			 * respond to an acid prompt.  Use default acid.
-			 */
-			debug("cray_setup: ttyname false case, %.100s",
-			    ttyname);
-			valid_acct = ue.ue_acids[0];
-		}
-	} else {
-		/*
-		 * The user doesn't have the askacid permbit set or
-		 * only has one valid account to use.
-		 */
-		valid_acct = ue.ue_acids[0];
-	}
-	if (acctid(0, valid_acct) < 0) {
-		printf ("Bad account id: %d\n", valid_acct);
-		exit(1);
-	}
-
-	/*
-	 * Now set shares, quotas, limits, including CPU time for the
-	 * (interactive) job and process, and set up permissions
-	 * (for chown etc), etc.
-	 */
-	if (setshares(ue.ue_uid, valid_acct, printf, 0, 0)) {
-		printf("Unable to give %d shares to <%s>(%d/%d)\n",
-		    ue.ue_shares, ue.ue_name, ue.ue_uid, valid_acct);
-		exit(1);
-	}
-
-	sr = setlimits(username, C_PROC, pid, UDBRC_INTER);
-	if (sr != NULL) {
-		debug("%.200s", sr);
-		exit(1);
-	}
-	sr = setlimits(username, C_JOB, jid, UDBRC_INTER);
-	if (sr != NULL) {
-		debug("%.200s", sr);
-		exit(1);
-	}
-	/*
-	 * Place the service provider information into
-	 * the session table (Unicos) or job table (Unicos/mk).
-	 * There exist double defines for the job/session table in
-	 * unicos/mk (jtab.h) so no need for a compile time switch.
-	 */
-	memset(&init_info, '\0', sizeof(init_info));
-	init_info.s_sessinit.si_id = URM_SPT_LOGIN;
-	init_info.s_sessinit.si_pid = getpid();
-	init_info.s_sessinit.si_sid = jid;
-	sesscntl(0, S_SETSERVPO, (int)&init_info);
-
-	/*
-	 * Set user and controlling tty security attributes.
-	 */
-	if (SecureSys) {
-		if (setusrv(&usrv) == -1) {
-			debug("setusrv() failed, errno = %d",errno);
-			exit(1);
-		}
-	}
-
-	return (0);
-}
-
-/*
- * The rc.* and /etc/sdaemon methods of starting a program on unicos/unicosmk
- * can have pal privileges that sshd can inherit which
- * could allow a user to su to root with out a password.
- * This subroutine clears all privileges.
- */
-void
-drop_cray_privs()
-{
-#if defined(_SC_CRAY_PRIV_SU)
-	priv_proc_t *privstate;
-	int result;
-	extern int priv_set_proc();
-	extern priv_proc_t *priv_init_proc();
-
-	/*
-	 * If ether of theses two flags are not set
-	 * then don't allow this version of ssh to run.
-	 */
-	if (!sysconf(_SC_CRAY_PRIV_SU))
-		fatal("Not PRIV_SU system.");
-	if (!sysconf(_SC_CRAY_POSIX_PRIV))
-		fatal("Not POSIX_PRIV.");
-
-	debug("Setting MLS labels.");;
-
-	if (sysconf(_SC_CRAY_SECURE_MAC)) {
-		usrv.sv_minlvl = SYSLOW;
-		usrv.sv_actlvl = SYSHIGH;
-		usrv.sv_maxlvl = SYSHIGH;
-	} else {
-		usrv.sv_minlvl = sysv.sy_minlvl;
-		usrv.sv_actlvl = sysv.sy_minlvl;
-		usrv.sv_maxlvl = sysv.sy_maxlvl;
-	}
-	usrv.sv_actcmp = 0;
-	usrv.sv_valcmp = sysv.sy_valcmp;
-
-	usrv.sv_intcat = TFM_SYSTEM;
-	usrv.sv_valcat |= (TFM_SYSTEM | TFM_SYSFILE);
-
-	if (setusrv(&usrv) < 0) {
-		fatal("%s(%d): setusrv(): %s", __FILE__, __LINE__,
-		    strerror(errno));
-	}
-
-	if ((privstate = priv_init_proc()) != NULL) {
-		result = priv_set_proc(privstate);
-		if (result != 0 ) {
-			fatal("%s(%d): priv_set_proc(): %s",
-			    __FILE__, __LINE__, strerror(errno));
-		}
-		priv_free_proc(privstate);
-	}
-	debug ("Privileges should be cleared...");
-#else
-	/* XXX: do this differently */
-#	error Cray systems must be run with _SC_CRAY_PRIV_SU on!
-#endif
-}
-
-
-/*
- *  Retain utmp/wtmp information - used by cray accounting.
- */
-void
-cray_retain_utmp(struct utmp *ut, int pid)
-{
-	int fd;
-	struct utmp utmp;
-
-	if ((fd = open(UTMP_FILE, O_RDONLY)) != -1) {
-		/* XXX use atomicio */
-		while (read(fd, (char *)&utmp, sizeof(utmp)) == sizeof(utmp)) {
-			if (pid == utmp.ut_pid) {
-				ut->ut_jid = utmp.ut_jid;
-				strncpy(ut->ut_tpath, utmp.ut_tpath, sizeof(utmp.ut_tpath));
-				strncpy(ut->ut_host, utmp.ut_host, sizeof(utmp.ut_host));
-				strncpy(ut->ut_name, utmp.ut_name, sizeof(utmp.ut_name));
-				break;
-			}
-		}
-		close(fd);
-	} else
-		fatal("Unable to open utmp file");
-}
-
-/*
- * tmpdir support.
- */
-
-/*
- * find and delete jobs tmpdir.
- */
-void
-cray_delete_tmpdir(char *login, int jid, uid_t uid)
-{
-	static char jtmp[TPATHSIZ];
-	struct stat statbuf;
-	int child, c, wstat;
-
-	for (c = 'a'; c <= 'z'; c++) {
-		snprintf(jtmp, TPATHSIZ, "%s/jtmp.%06d%c", JTMPDIR, jid, c);
-		if (stat(jtmp, &statbuf) == 0 && statbuf.st_uid == uid)
-			break;
-	}
-
-	if (c > 'z')
-		return;
-
-	if ((child = fork()) == 0) {
-		execl(CLEANTMPCMD, CLEANTMPCMD, login, jtmp, (char *)NULL);
-		fatal("cray_delete_tmpdir: execl of CLEANTMPCMD failed");
-	}
-
-	while (waitpid(child, &wstat, 0) == -1 && errno == EINTR)
-		;
-}
-
-/*
- * Remove tmpdir on job termination.
- */
-void
-cray_job_termination_handler(int sig)
-{
-	int jid;
-	char *login = NULL;
-	struct jtab jtab;
-
-	if ((jid = waitjob(&jtab)) == -1 ||
-	    (login = uid2nam(jtab.j_uid)) == NULL)
-		return;
-
-	cray_delete_tmpdir(login, jid, jtab.j_uid);
-}
-
-/*
- * Set job id and create tmpdir directory.
- */
-void
-cray_init_job(struct passwd *pw)
-{
-	int jid;
-	int c;
-
-	jid = setjob(pw->pw_uid, WJSIGNAL);
-	if (jid < 0)
-		fatal("System call setjob failure");
-
-	for (c = 'a'; c <= 'z'; c++) {
-		snprintf(cray_tmpdir, TPATHSIZ, "%s/jtmp.%06d%c", JTMPDIR, jid, c);
-		if (mkdir(cray_tmpdir, JTMPMODE) != 0)
-			continue;
-		if (chown(cray_tmpdir,	pw->pw_uid, pw->pw_gid) != 0) {
-			rmdir(cray_tmpdir);
-			continue;
-		}
-		break;
-	}
-
-	if (c > 'z')
-		cray_tmpdir[0] = '\0';
-}
-
-void
-cray_set_tmpdir(struct utmp *ut)
-{
-	int jid;
-	struct jtab jbuf;
-
-	if ((jid = getjtab(&jbuf)) < 0)
-		return;
-
-	/*
-	 * Set jid and tmpdir in utmp record.
-	 */
-	ut->ut_jid = jid;
-	strncpy(ut->ut_tpath, cray_tmpdir, TPATHSIZ);
-}
-#endif /* UNICOS */
-
-#ifdef _UNICOSMP
-#include <pwd.h>
-/*
- * Set job id and create tmpdir directory.
- */
-void
-cray_init_job(struct passwd *pw)
-{
-	initrm_silent(pw->pw_uid);
-	return;
-}
-#endif /* _UNICOSMP */
diff --git a/openbsd-compat/bsd-cray.h b/openbsd-compat/bsd-cray.h
deleted file mode 100644
index ca626a0..0000000
--- a/openbsd-compat/bsd-cray.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2002, Cray Inc.  (Wendy Palm <wendyp@cray.com>)
- * Significant portions provided by
- *          Wayne Schroeder, SDSC <schroeder@sdsc.edu>
- *          William Jones, UTexas <jones@tacc.utexas.edu>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Created: Apr 22 16.34:00 2002 wp
- *
- * This file contains functions required for proper execution
- * on UNICOS systems.
- *
- */
-
-#ifndef _BSD_CRAY_H
-#define _BSD_CRAY_H
-
-#ifdef _UNICOS
-
-void cray_init_job(struct passwd *);
-void cray_job_termination_handler(int);
-void cray_login_failure(char *, int );
-int cray_access_denied(char *);
-extern char cray_tmpdir[];
-
-#define CUSTOM_FAILED_LOGIN 1
-
-#ifndef IA_SSHD
-# define IA_SSHD IA_LOGIN
-#endif
-#ifndef MAXHOSTNAMELEN
-# define MAXHOSTNAMELEN  64
-#endif
-#ifndef _CRAYT3E
-# define TIOCGPGRP (tIOC|20)
-#endif
-
-#endif /* UNICOS */
-
-#endif /* _BSD_CRAY_H */
diff --git a/openbsd-compat/bsd-cygwin_util.c b/openbsd-compat/bsd-cygwin_util.c
index 398a5f6..fb49e30 100644
--- a/openbsd-compat/bsd-cygwin_util.c
+++ b/openbsd-compat/bsd-cygwin_util.c
@@ -36,6 +36,7 @@
 #include <fcntl.h>
 #include <string.h>
 #include <unistd.h>
+#include <stdarg.h>
 
 #include "xmalloc.h"
 
diff --git a/openbsd-compat/bsd-cygwin_util.h b/openbsd-compat/bsd-cygwin_util.h
index 9cef694..202c055 100644
--- a/openbsd-compat/bsd-cygwin_util.h
+++ b/openbsd-compat/bsd-cygwin_util.h
@@ -41,7 +41,7 @@
 #define UNLEN 256
 
 /* Cygwin functions for which declarations are only available when including
-   windows headers, so we have to define them here explicitely. */
+   windows headers, so we have to define them here explicitly. */
 extern HANDLE cygwin_logon_user (const struct passwd *, const char *);
 extern void cygwin_set_impersonation_token (const HANDLE);
 
diff --git a/openbsd-compat/bsd-err.c b/openbsd-compat/bsd-err.c
index ab10646..e4ed22b 100644
--- a/openbsd-compat/bsd-err.c
+++ b/openbsd-compat/bsd-err.c
@@ -27,6 +27,12 @@
 
 #include "includes.h"
 
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
 #ifndef HAVE_ERR
 void
 err(int r, const char *fmt, ...)
diff --git a/openbsd-compat/bsd-flock.c b/openbsd-compat/bsd-flock.c
new file mode 100644
index 0000000..9b15d1e
--- /dev/null
+++ b/openbsd-compat/bsd-flock.c
@@ -0,0 +1,81 @@
+/*	$NetBSD: flock.c,v 1.6 2008/04/28 20:24:12 martin Exp $	*/
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Todd Vierling.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Emulate flock() with fcntl(), where available.
+ * Otherwise, don't do locking; just pretend success.
+ */
+
+#include "includes.h"
+
+#ifndef HAVE_FLOCK
+#include <errno.h>
+#include <fcntl.h>
+
+int
+flock(int fd, int op)
+{
+	int rc = 0;
+
+#if defined(F_SETLK) && defined(F_SETLKW)
+	struct flock fl = {0};
+
+	switch (op & (LOCK_EX|LOCK_SH|LOCK_UN)) {
+	case LOCK_EX:
+		fl.l_type = F_WRLCK;
+		break;
+
+	case LOCK_SH:
+		fl.l_type = F_RDLCK;
+		break;
+
+	case LOCK_UN:
+		fl.l_type = F_UNLCK;
+		break;
+
+	default:
+		errno = EINVAL;
+		return -1;
+	}
+
+	fl.l_whence = SEEK_SET;
+	rc = fcntl(fd, op & LOCK_NB ? F_SETLK : F_SETLKW, &fl);
+
+	if (rc && (errno == EAGAIN))
+		errno = EWOULDBLOCK;
+#else
+	rc = -1;
+	errno = ENOSYS;
+#endif
+
+	return rc;
+}
+#endif
diff --git a/openbsd-compat/bsd-getline.c b/openbsd-compat/bsd-getline.c
new file mode 100644
index 0000000..d676f4c
--- /dev/null
+++ b/openbsd-compat/bsd-getline.c
@@ -0,0 +1,113 @@
+/*	$NetBSD: getline.c,v 1.1.1.6 2015/01/02 20:34:27 christos Exp $	*/
+
+/*	NetBSD: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp 	*/
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* NETBSD ORIGINAL: external/bsd/file/dist/src/getline.c */
+
+#include "includes.h"
+
+#if 0
+#include "file.h"
+#endif
+
+#if !HAVE_GETLINE
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+static ssize_t
+getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
+{
+	char *ptr, *eptr;
+
+
+	if (*buf == NULL || *bufsiz == 0) {
+		if ((*buf = malloc(BUFSIZ)) == NULL)
+			return -1;
+		*bufsiz = BUFSIZ;
+	}
+
+	for (ptr = *buf, eptr = *buf + *bufsiz;;) {
+		int c = fgetc(fp);
+		if (c == -1) {
+			if (feof(fp)) {
+				ssize_t diff = (ssize_t)(ptr - *buf);
+				if (diff != 0) {
+					*ptr = '\0';
+					return diff;
+				}
+			}
+			return -1;
+		}
+		*ptr++ = c;
+		if (c == delimiter) {
+			*ptr = '\0';
+			return ptr - *buf;
+		}
+		if (ptr + 2 >= eptr) {
+			char *nbuf;
+			size_t nbufsiz = *bufsiz * 2;
+			ssize_t d = ptr - *buf;
+			if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
+				return -1;
+			*buf = nbuf;
+			*bufsiz = nbufsiz;
+			eptr = nbuf + nbufsiz;
+			ptr = nbuf + d;
+		}
+	}
+}
+
+ssize_t
+getline(char **buf, size_t *bufsiz, FILE *fp)
+{
+	return getdelim(buf, bufsiz, '\n', fp);
+}
+
+#endif
+
+#ifdef TEST
+int
+main(int argc, char *argv[])
+{
+	char *p = NULL;
+	ssize_t len;
+	size_t n = 0;
+
+	while ((len = getline(&p, &n, stdin)) != -1)
+		(void)printf("%" SIZE_T_FORMAT "d %s", len, p);
+	free(p);
+	return 0;
+}
+#endif
diff --git a/openbsd-compat/bsd-getpagesize.c b/openbsd-compat/bsd-getpagesize.c
new file mode 100644
index 0000000..416a8d4
--- /dev/null
+++ b/openbsd-compat/bsd-getpagesize.c
@@ -0,0 +1,25 @@
+/* Placed in the public domain */
+
+#include "includes.h"
+
+#ifndef HAVE_GETPAGESIZE
+
+#include <unistd.h>
+#include <limits.h>
+
+int
+getpagesize(void)
+{
+#if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
+	long r = sysconf(_SC_PAGESIZE);
+	if (r > 0 && r < INT_MAX)
+		return (int)r;
+#endif
+	/*
+	 * This is at the lower end of common values and appropriate for
+	 * our current use of getpagesize() in recallocarray().
+	 */
+	return 4096;
+}
+
+#endif /* HAVE_GETPAGESIZE */
diff --git a/openbsd-compat/bsd-malloc.c b/openbsd-compat/bsd-malloc.c
new file mode 100644
index 0000000..482facd
--- /dev/null
+++ b/openbsd-compat/bsd-malloc.c
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2017 Darren Tucker (dtucker at zip com au).
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "config.h"
+#undef malloc
+#undef calloc
+#undef realloc
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+#if defined(HAVE_MALLOC) && HAVE_MALLOC == 0
+void *
+rpl_malloc(size_t size)
+{
+	if (size == 0)
+		size = 1;
+	return malloc(size);
+}
+#endif
+
+#if defined(HAVE_CALLOC) && HAVE_CALLOC == 0
+void *
+rpl_calloc(size_t nmemb, size_t size)
+{
+	if (nmemb == 0)
+		nmemb = 1;
+	if (size == 0)
+		size = 1;
+	return calloc(nmemb, size);
+}
+#endif
+
+#if defined (HAVE_REALLOC) && HAVE_REALLOC == 0
+void *
+rpl_realloc(void *ptr, size_t size)
+{
+	if (size == 0)
+		size = 1;
+	if (ptr == 0)
+		return malloc(size);
+	return realloc(ptr, size);
+}
+#endif
diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c
index 5a175cc..dd10484 100644
--- a/openbsd-compat/bsd-misc.c
+++ b/openbsd-compat/bsd-misc.c
@@ -28,6 +28,7 @@
 #include <string.h>
 #include <signal.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <time.h>
 #include <unistd.h>
 
@@ -211,35 +212,6 @@
 }
 #endif /* HAVE_TCSENDBREAK */
 
-#ifndef __Fuchsia__
-mysig_t
-mysignal(int sig, mysig_t act)
-{
-#ifdef HAVE_SIGACTION
-	struct sigaction sa, osa;
-
-	if (sigaction(sig, NULL, &osa) == -1)
-		return (mysig_t) -1;
-	if (osa.sa_handler != act) {
-		memset(&sa, 0, sizeof(sa));
-		sigemptyset(&sa.sa_mask);
-		sa.sa_flags = 0;
-#ifdef SA_INTERRUPT
-		if (sig == SIGALRM)
-			sa.sa_flags |= SA_INTERRUPT;
-#endif
-		sa.sa_handler = act;
-		if (sigaction(sig, &sa, NULL) == -1)
-			return (mysig_t) -1;
-	}
-	return (osa.sa_handler);
-#else
-	#undef signal
-	return (signal(sig, act));
-#endif
-}
-#endif
-
 #ifndef HAVE_STRDUP
 char *
 strdup(const char *str)
@@ -267,7 +239,7 @@
 pid_t
 getpgid(pid_t pid)
 {
-#if defined(HAVE_GETPGRP) && !defined(GETPGRP_VOID)
+#if defined(HAVE_GETPGRP) && !defined(GETPGRP_VOID) && GETPGRP_VOID == 0
 	return getpgrp(pid);
 #elif defined(HAVE_GETPGRP)
 	if (pid == 0)
@@ -303,3 +275,54 @@
 	return 1;
 }
 #endif
+
+#ifndef HAVE_LLABS
+long long
+llabs(long long j)
+{
+	return (j < 0 ? -j : j);
+}
+#endif
+
+#ifndef HAVE_BZERO
+void
+bzero(void *b, size_t n)
+{
+	(void)memset(b, 0, n);
+}
+#endif
+
+#ifndef HAVE_RAISE
+int
+raise(int sig)
+{
+	kill(getpid(), sig);
+        return 0;
+}
+#endif
+
+#ifndef HAVE_GETSID
+pid_t
+getsid(pid_t pid)
+{
+	errno = ENOSYS;
+	return -1;
+}
+#endif
+
+#ifdef FFLUSH_NULL_BUG
+#undef fflush
+int _ssh_compat_fflush(FILE *f)
+{
+	int r1, r2, r3;
+
+	if (f == NULL) {
+		r2 = fflush(stdout);
+		r3 = fflush(stderr);
+		if (r1 == -1 || r2 == -1 || r3 == -1)
+			return -1;
+		return 0;
+	}
+	return fflush(f);
+}
+#endif
diff --git a/openbsd-compat/bsd-misc.h b/openbsd-compat/bsd-misc.h
index 6f08b09..52ec528 100644
--- a/openbsd-compat/bsd-misc.h
+++ b/openbsd-compat/bsd-misc.h
@@ -94,12 +94,6 @@
 int unsetenv(const char *);
 #endif
 
-/* wrapper for signal interface */
-typedef void (*mysig_t)(int);
-mysig_t mysignal(int sig, mysig_t act);
-
-#define signal(a,b) mysignal(a,b)
-
 #ifndef HAVE_ISBLANK
 int	isblank(int);
 #endif
@@ -135,4 +129,32 @@
 void warn(const char *, ...) __attribute__((format(printf, 1, 2)));
 #endif
 
+#ifndef HAVE_LLABS
+long long llabs(long long);
+#endif
+
+#if defined(HAVE_DECL_BZERO) && HAVE_DECL_BZERO == 0
+void bzero(void *, size_t);
+#endif
+
+#ifndef HAVE_RAISE
+int raise(int);
+#endif
+
+#ifndef HAVE_GETSID
+pid_t getsid(pid_t);
+#endif
+
+#ifndef HAVE_FLOCK
+# define LOCK_SH		0x01
+# define LOCK_EX		0x02
+# define LOCK_NB		0x04
+# define LOCK_UN		0x08
+int flock(int, int);
+#endif
+
+#ifdef FFLUSH_NULL_BUG
+# define fflush(x)	(_ssh_compat_fflush(x))
+#endif
+
 #endif /* _BSD_MISC_H */
diff --git a/openbsd-compat/bsd-nextstep.h b/openbsd-compat/bsd-nextstep.h
index 610f9e3..4a45b15 100644
--- a/openbsd-compat/bsd-nextstep.h
+++ b/openbsd-compat/bsd-nextstep.h
@@ -36,7 +36,7 @@
 /* NeXT's readdir() is BSD (struct direct) not POSIX (struct dirent) */
 #define dirent direct
 
-/* Swap out NeXT's BSD wait() for a more POSIX complient one */
+/* Swap out NeXT's BSD wait() for a more POSIX compliant one */
 pid_t posix_wait(int *);
 #define wait(a) posix_wait(a)
 
diff --git a/openbsd-compat/bsd-openpty.c b/openbsd-compat/bsd-openpty.c
index b282358..e8ad542 100644
--- a/openbsd-compat/bsd-openpty.c
+++ b/openbsd-compat/bsd-openpty.c
@@ -147,31 +147,6 @@
 	}
 	return (0);
 
-#elif defined(_UNICOS)
-	char ptbuf[64], ttbuf[64];
-	int i;
-	int highpty;
-
-	highpty = 128;
-#ifdef _SC_CRAY_NPTY
-	if ((highpty = sysconf(_SC_CRAY_NPTY)) == -1)
-		highpty = 128;
-#endif /* _SC_CRAY_NPTY */
-
-	for (i = 0; i < highpty; i++) {
-		snprintf(ptbuf, sizeof(ptbuf), "/dev/pty/%03d", i);
-		snprintf(ttbuf, sizeof(ttbuf), "/dev/ttyp%03d", i);
-		if ((*amaster = open(ptbuf, O_RDWR|O_NOCTTY)) == -1)
-			continue;
-		/* Open the slave side. */
-		if ((*aslave = open(ttbuf, O_RDWR|O_NOCTTY)) == -1) {
-			close(*amaster);
-			return (-1);
-		}
-		return (0);
-	}
-	return (-1);
-
 #else
 	/* BSD-style pty code. */
 	char ptbuf[64], ttbuf[64];
diff --git a/openbsd-compat/bsd-signal.c b/openbsd-compat/bsd-signal.c
new file mode 100644
index 0000000..979010e
--- /dev/null
+++ b/openbsd-compat/bsd-signal.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "includes.h"
+
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "openbsd-compat/bsd-signal.h"
+
+#undef signal
+
+mysig_t
+mysignal(int sig, mysig_t act)
+{
+#ifdef HAVE_SIGACTION
+	struct sigaction sa, osa;
+
+	if (sigaction(sig, NULL, &osa) == -1)
+		return (mysig_t) -1;
+	if (osa.sa_handler != act) {
+		memset(&sa, 0, sizeof(sa));
+		sigemptyset(&sa.sa_mask);
+		sa.sa_flags = 0;
+#ifdef SA_INTERRUPT
+		if (sig == SIGALRM)
+			sa.sa_flags |= SA_INTERRUPT;
+#endif
+		sa.sa_handler = act;
+		if (sigaction(sig, &sa, NULL) == -1)
+			return (mysig_t) -1;
+	}
+	return (osa.sa_handler);
+#else
+	return (signal(sig, act));
+#endif
+}
+
+#if !defined(HAVE_STRSIGNAL)
+char *strsignal(int sig)
+{
+	static char buf[16];
+
+	(void)snprintf(buf, sizeof(buf), "%d", sig);
+	return buf;
+}
+#endif
+
diff --git a/openbsd-compat/port-tun.h b/openbsd-compat/bsd-signal.h
similarity index 63%
copy from openbsd-compat/port-tun.h
copy to openbsd-compat/bsd-signal.h
index c53df01..4cb8cb7 100644
--- a/openbsd-compat/port-tun.h
+++ b/openbsd-compat/bsd-signal.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 Reyk Floeter <reyk@openbsd.org>
+ * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -14,20 +14,26 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#ifndef _PORT_TUN_H
-#define _PORT_TUN_H
+#ifndef _BSD_SIGNAL_H
+#define _BSD_SIGNAL_H
 
-struct Channel;
+#include "includes.h"
 
-#if defined(SSH_TUN_LINUX) || defined(SSH_TUN_FREEBSD)
-# define CUSTOM_SYS_TUN_OPEN
-int	  sys_tun_open(int, int);
+#ifndef _NSIG
+# ifdef NSIG
+#  define _NSIG NSIG
+# else
+#  define _NSIG 128
+# endif
 #endif
 
-#if defined(SSH_TUN_COMPAT_AF) || defined(SSH_TUN_PREPEND_AF)
-# define SSH_TUN_FILTER
-int	 sys_tun_infilter(struct Channel *, char *, int);
-u_char	*sys_tun_outfilter(struct Channel *, u_char **, u_int *);
+/* wrapper for signal interface */
+typedef void (*mysig_t)(int);
+mysig_t mysignal(int sig, mysig_t act);
+#define signal(a,b) mysignal(a,b)
+
+#if !defined(HAVE_STRSIGNAL)
+char *strsignal(int);
 #endif
 
-#endif
+#endif /* _BSD_SIGNAL_H */
diff --git a/openbsd-compat/bsd-snprintf.c b/openbsd-compat/bsd-snprintf.c
index d95b6a4..f27b9d8 100644
--- a/openbsd-compat/bsd-snprintf.c
+++ b/openbsd-compat/bsd-snprintf.c
@@ -30,7 +30,7 @@
  *    probably requires libm on most operating systems.  Don't yet
  *    support the exponent (e,E) and sigfig (g,G).  Also, fmtint()
  *    was pretty badly broken, it just wasn't being exercised in ways
- *    which showed it, so that's been fixed.  Also, formated the code
+ *    which showed it, so that's been fixed.  Also, formatted the code
  *    to mutt conventions, and removed dead code left over from the
  *    original.  Also, there is now a builtin-test, just compile with:
  *           gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
diff --git a/openbsd-compat/bsd-statvfs.c b/openbsd-compat/bsd-statvfs.c
index 458dbe8..e3bd87d 100644
--- a/openbsd-compat/bsd-statvfs.c
+++ b/openbsd-compat/bsd-statvfs.c
@@ -25,6 +25,10 @@
 
 #include <errno.h>
 
+#ifndef MNAMELEN
+# define MNAMELEN 32
+#endif
+
 static void
 copy_statfs_to_statvfs(struct statvfs *to, struct statfs *from)
 {
@@ -37,7 +41,11 @@
 	to->f_ffree = from->f_ffree;
 	to->f_favail = from->f_ffree;	/* no exact equivalent */
 	to->f_fsid = 0;			/* XXX fix me */
+#ifdef HAVE_STRUCT_STATFS_F_FLAGS
 	to->f_flag = from->f_flags;
+#else
+	to->f_flag = 0;
+#endif
 	to->f_namemax = MNAMELEN;
 }
 
diff --git a/openbsd-compat/bsd-statvfs.h b/openbsd-compat/bsd-statvfs.h
index 815ec03..e2a4c15 100644
--- a/openbsd-compat/bsd-statvfs.h
+++ b/openbsd-compat/bsd-statvfs.h
@@ -26,6 +26,9 @@
 #ifdef HAVE_SYS_STATFS_H
 #include <sys/statfs.h>
 #endif
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#endif
 
 #ifndef HAVE_FSBLKCNT_T
 typedef unsigned long fsblkcnt_t;
diff --git a/openbsd-compat/bsd-waitpid.h b/openbsd-compat/bsd-waitpid.h
index 5ce3ee4..b551268 100644
--- a/openbsd-compat/bsd-waitpid.h
+++ b/openbsd-compat/bsd-waitpid.h
@@ -27,7 +27,7 @@
 #define _BSD_WAITPID_H
 
 #ifndef HAVE_WAITPID
-/* Clean out any potental issues */
+/* Clean out any potential issues */
 #undef WIFEXITED
 #undef WIFSTOPPED
 #undef WIFSIGNALED
diff --git a/openbsd-compat/explicit_bzero.c b/openbsd-compat/explicit_bzero.c
index 5078134..6ef9825 100644
--- a/openbsd-compat/explicit_bzero.c
+++ b/openbsd-compat/explicit_bzero.c
@@ -20,6 +20,8 @@
 void
 explicit_bzero(void *p, size_t n)
 {
+	if (n == 0)
+		return;
 	(void)memset_s(p, n, 0, n);
 }
 
@@ -34,10 +36,12 @@
 void
 explicit_bzero(void *p, size_t n)
 {
+	if (n == 0)
+		return;
 	/*
 	 * clang -fsanitize=memory needs to intercept memset-like functions
 	 * to correctly detect memory initialisation. Make sure one is called
-	 * directly since our indirection trick above sucessfully confuses it.
+	 * directly since our indirection trick above successfully confuses it.
 	 */
 #if defined(__has_feature)
 # if __has_feature(memory_sanitizer)
diff --git a/openbsd-compat/fmt_scaled.c b/openbsd-compat/fmt_scaled.c
index edd682a..2f76ef9 100644
--- a/openbsd-compat/fmt_scaled.c
+++ b/openbsd-compat/fmt_scaled.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: fmt_scaled.c,v 1.9 2007/03/20 03:42:52 tedu Exp $	*/
+/*	$OpenBSD: fmt_scaled.c,v 1.17 2018/05/14 04:39:04 djm Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003 Ian F. Darwin.  All rights reserved.
@@ -69,7 +69,7 @@
 
 #define MAX_DIGITS (SCALE_LENGTH * 3)	/* XXX strlen(sprintf("%lld", -1)? */
 
-/** Convert the given input string "scaled" into numeric in "result".
+/* Convert the given input string "scaled" into numeric in "result".
  * Return 0 on success, -1 and errno set on error.
  */
 int
@@ -81,7 +81,7 @@
 	long long scale_fact = 1, whole = 0, fpart = 0;
 
 	/* Skip leading whitespace */
-	while (isascii(*p) && isspace(*p))
+	while (isascii((unsigned char)*p) && isspace((unsigned char)*p))
 		++p;
 
 	/* Then at most one leading + or - */
@@ -108,7 +108,8 @@
 	 * (but note that E for Exa might look like e to some!).
 	 * Advance 'p' to end, to get scale factor.
 	 */
-	for (; isascii(*p) && (isdigit(*p) || *p=='.'); ++p) {
+	for (; isascii((unsigned char)*p) &&
+	    (isdigit((unsigned char)*p) || *p=='.'); ++p) {
 		if (*p == '.') {
 			if (fract_digits > 0) {	/* oops, more than one '.' */
 				errno = EINVAL;
@@ -124,14 +125,30 @@
 				/* ignore extra fractional digits */
 				continue;
 			fract_digits++;		/* for later scaling */
+			if (fpart > LLONG_MAX / 10) {
+				errno = ERANGE;
+				return -1;
+			}
 			fpart *= 10;
+			if (i > LLONG_MAX - fpart) {
+				errno = ERANGE;
+				return -1;
+			}
 			fpart += i;
 		} else {				/* normal digit */
 			if (++ndigits >= MAX_DIGITS) {
 				errno = ERANGE;
 				return -1;
 			}
+			if (whole > LLONG_MAX / 10) {
+				errno = ERANGE;
+				return -1;
+			}
 			whole *= 10;
+			if (i > LLONG_MAX - whole) {
+				errno = ERANGE;
+				return -1;
+			}
 			whole += i;
 		}
 	}
@@ -150,21 +167,28 @@
 	/* Validate scale factor, and scale whole and fraction by it. */
 	for (i = 0; i < SCALE_LENGTH; i++) {
 
-		/** Are we there yet? */
+		/* Are we there yet? */
 		if (*p == scale_chars[i] ||
-			*p == tolower(scale_chars[i])) {
+			*p == tolower((unsigned char)scale_chars[i])) {
 
 			/* If it ends with alphanumerics after the scale char, bad. */
-			if (isalnum(*(p+1))) {
+			if (isalnum((unsigned char)*(p+1))) {
 				errno = EINVAL;
 				return -1;
 			}
 			scale_fact = scale_factors[i];
 
+			/* check for overflow and underflow after scaling */
+			if (whole > LLONG_MAX / scale_fact ||
+			    whole < LLONG_MIN / scale_fact) {
+				errno = ERANGE;
+				return -1;
+			}
+
 			/* scale whole part */
 			whole *= scale_fact;
 
-			/* truncate fpart so it does't overflow.
+			/* truncate fpart so it doesn't overflow.
 			 * then scale fractional part.
 			 */
 			while (fpart >= LLONG_MAX / scale_fact) {
@@ -181,7 +205,9 @@
 			return 0;
 		}
 	}
-	errno = ERANGE;
+
+	/* Invalid unit or character */
+	errno = EINVAL;
 	return -1;
 }
 
@@ -196,7 +222,7 @@
 	unsigned int i;
 	unit_type unit = NONE;
 
-	abval = (number < 0LL) ? -number : number;	/* no long long_abs yet */
+	abval = llabs(number);
 
 	/* Not every negative long long has a positive representation.
 	 * Also check for numbers that are just too darned big to format
@@ -220,12 +246,15 @@
 
 	fract = (10 * fract + 512) / 1024;
 	/* if the result would be >= 10, round main number */
-	if (fract == 10) {
+	if (fract >= 10) {
 		if (number >= 0)
 			number++;
 		else
 			number--;
 		fract = 0;
+	} else if (fract < 0) {
+		/* shouldn't happen */
+		fract = 0;
 	}
 
 	if (number == 0)
diff --git a/openbsd-compat/port-tun.h b/openbsd-compat/freezero.c
similarity index 62%
copy from openbsd-compat/port-tun.h
copy to openbsd-compat/freezero.c
index c53df01..bad018f 100644
--- a/openbsd-compat/port-tun.h
+++ b/openbsd-compat/freezero.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 Reyk Floeter <reyk@openbsd.org>
+ * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -14,20 +14,21 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#ifndef _PORT_TUN_H
-#define _PORT_TUN_H
+#include "includes.h"
 
-struct Channel;
+#include <stdlib.h>
+#include <string.h>
 
-#if defined(SSH_TUN_LINUX) || defined(SSH_TUN_FREEBSD)
-# define CUSTOM_SYS_TUN_OPEN
-int	  sys_tun_open(int, int);
-#endif
+#ifndef HAVE_FREEZERO
 
-#if defined(SSH_TUN_COMPAT_AF) || defined(SSH_TUN_PREPEND_AF)
-# define SSH_TUN_FILTER
-int	 sys_tun_infilter(struct Channel *, char *, int);
-u_char	*sys_tun_outfilter(struct Channel *, u_char **, u_int *);
-#endif
+void
+freezero(void *ptr, size_t sz)
+{
+	if (ptr == NULL)
+		return;
+	explicit_bzero(ptr, sz);
+	free(ptr);
+}
 
-#endif
+#endif /* HAVE_FREEZERO */
+
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index cff5477..f5c833b 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -60,6 +60,14 @@
 void closefrom(int);
 #endif
 
+#ifndef HAVE_GETLINE
+ssize_t getline(char **, size_t *, FILE *);
+#endif
+
+#ifndef HAVE_GETPAGESIZE
+int getpagesize(void);
+#endif
+
 #ifndef HAVE_GETCWD
 char *getcwd(char *pt, size_t size);
 #endif
@@ -68,6 +76,10 @@
 void *reallocarray(void *, size_t, size_t);
 #endif
 
+#ifndef HAVE_RECALLOCARRAY
+void *recallocarray(void *, size_t, size_t, size_t);
+#endif
+
 #if !defined(HAVE_REALPATH) || defined(BROKEN_REALPATH)
 /*
  * glibc's FORTIFY_SOURCE can redefine this and prevent us picking up the
@@ -162,15 +174,24 @@
 #include "openbsd-compat/getopt.h"
 #endif
 
-#if defined(HAVE_DECL_WRITEV) && HAVE_DECL_WRITEV == 0
+#if ((defined(HAVE_DECL_READV) && HAVE_DECL_READV == 0) || \
+    (defined(HAVE_DECL_WRITEV) && HAVE_DECL_WRITEV == 0))
 # include <sys/types.h>
 # include <sys/uio.h>
+
+# if defined(HAVE_DECL_READV) && HAVE_DECL_READV == 0
+int readv(int, struct iovec *, int);
+# endif
+
+# if defined(HAVE_DECL_WRITEV) && HAVE_DECL_WRITEV == 0
 int writev(int, struct iovec *, int);
+# endif
 #endif
 
 /* Home grown routines */
 #include "bsd-misc.h"
 #include "bsd-setres_id.h"
+#include "bsd-signal.h"
 #include "bsd-statvfs.h"
 #include "bsd-waitpid.h"
 #include "bsd-poll.h"
@@ -296,6 +317,10 @@
 void explicit_bzero(void *p, size_t n);
 #endif
 
+#ifndef HAVE_FREEZERO
+void freezero(void *, size_t);
+#endif
+
 char *xcrypt(const char *password, const char *salt);
 char *shadow_pw(struct passwd *pw);
 
@@ -303,14 +328,13 @@
 #include "fake-rfc2553.h"
 
 /* Routines for a single OS platform */
-#include "bsd-cray.h"
 #include "bsd-cygwin_util.h"
 
 #include "port-aix.h"
 #include "port-irix.h"
 #include "port-linux.h"
 #include "port-solaris.h"
-#include "port-tun.h"
+#include "port-net.h"
 #include "port-uw.h"
 
 /* _FORTIFY_SOURCE breaks FD_ISSET(n)/FD_SET(n) for n > FD_SETSIZE. Avoid. */
diff --git a/openbsd-compat/port-aix.c b/openbsd-compat/port-aix.c
index c2970c4..943177c 100644
--- a/openbsd-compat/port-aix.c
+++ b/openbsd-compat/port-aix.c
@@ -27,11 +27,13 @@
 #include "includes.h"
 
 #include "xmalloc.h"
-#include "buffer.h"
-#include "key.h"
+#include "sshbuf.h"
+#include "ssherr.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "ssh.h"
+#include "ssh_api.h"
 #include "log.h"
 
 #ifdef _AIX
@@ -171,10 +173,11 @@
  * returns 0.
  */
 int
-sys_auth_passwd(Authctxt *ctxt, const char *password)
+sys_auth_passwd(struct ssh *ssh, const char *password)
 {
+	Authctxt *ctxt = ssh->authctxt;
 	char *authmsg = NULL, *msg = NULL, *name = ctxt->pw->pw_name;
-	int authsuccess = 0, expired, reenter, result;
+	int r, authsuccess = 0, expired, reenter, result;
 
 	do {
 		result = authenticate((char *)name, (char *)password, &reenter,
@@ -201,7 +204,10 @@
 		 */
 		expired = passwdexpired(name, &msg);
 		if (msg && *msg) {
-			buffer_append(ctxt->loginmsg, msg, strlen(msg));
+			if ((r = sshbuf_put(ctxt->loginmsg,
+			    msg, strlen(msg))) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			aix_remove_embedded_newlines(msg);
 		}
 		debug3("AIX/passwdexpired returned %d msg %.100s", expired, msg);
@@ -232,10 +238,10 @@
  * Returns 1 if login is allowed, 0 if not allowed.
  */
 int
-sys_auth_allowed_user(struct passwd *pw, Buffer *loginmsg)
+sys_auth_allowed_user(struct passwd *pw, struct sshbuf *loginmsg)
 {
 	char *msg = NULL;
-	int result, permitted = 0;
+	int r, result, permitted = 0;
 	struct stat st;
 
 	/*
@@ -258,8 +264,10 @@
 	 */
 	if (result == -1 && errno == EPERM && stat(_PATH_NOLOGIN, &st) == 0)
 		permitted = 1;
-	else if (msg != NULL)
-		buffer_append(loginmsg, msg, strlen(msg));
+	else if (msg != NULL) {
+		if ((r = sshbuf_put(loginmsg, msg, strlen(msg))) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
 	if (msg == NULL)
 		msg = xstrdup("(none)");
 	aix_remove_embedded_newlines(msg);
@@ -273,7 +281,7 @@
 
 int
 sys_auth_record_login(const char *user, const char *host, const char *ttynm,
-    Buffer *loginmsg)
+    struct sshbuf *loginmsg)
 {
 	char *msg = NULL;
 	int success = 0;
diff --git a/openbsd-compat/port-aix.h b/openbsd-compat/port-aix.h
index 9c0a4dd..748c0e4 100644
--- a/openbsd-compat/port-aix.h
+++ b/openbsd-compat/port-aix.h
@@ -30,7 +30,7 @@
 # include <sys/socket.h>
 #endif
 
-#include "buffer.h"
+struct sshbuf;
 
 /* These should be in the system headers but are not. */
 int usrinfo(int, char *, int);
@@ -87,9 +87,10 @@
 #ifdef WITH_AIXAUTHENTICATE
 # define CUSTOM_SYS_AUTH_PASSWD 1
 # define CUSTOM_SYS_AUTH_ALLOWED_USER 1
-int sys_auth_allowed_user(struct passwd *, Buffer *);
+int sys_auth_allowed_user(struct passwd *, struct sshbuf *);
 # define CUSTOM_SYS_AUTH_RECORD_LOGIN 1
-int sys_auth_record_login(const char *, const char *, const char *, Buffer *);
+int sys_auth_record_login(const char *, const char *,
+    const char *, struct sshbuf *);
 # define CUSTOM_SYS_AUTH_GET_LASTLOGIN_MSG
 char *sys_auth_get_lastlogin_msg(const char *, uid_t);
 # define CUSTOM_FAILED_LOGIN 1
diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c
index e4c5d1b..8c5325c 100644
--- a/openbsd-compat/port-linux.c
+++ b/openbsd-compat/port-linux.c
@@ -33,7 +33,6 @@
 
 #ifdef WITH_SELINUX
 #include <selinux/selinux.h>
-#include <selinux/flask.h>
 #include <selinux/get_context_list.h>
 
 #ifndef SSH_SELINUX_UNCONFINED_TYPE
@@ -139,6 +138,7 @@
 	security_context_t new_tty_ctx = NULL;
 	security_context_t user_ctx = NULL;
 	security_context_t old_tty_ctx = NULL;
+	security_class_t chrclass;
 
 	if (!ssh_selinux_enabled())
 		return;
@@ -153,9 +153,12 @@
 		error("%s: getfilecon: %s", __func__, strerror(errno));
 		goto out;
 	}
-
+	if ((chrclass = string_to_security_class("chr_file")) == 0) {
+		error("%s: couldn't get security class for chr_file", __func__);
+		goto out;
+	}
 	if (security_compute_relabel(user_ctx, old_tty_ctx,
-	    SECCLASS_CHR_FILE, &new_tty_ctx) != 0) {
+	    chrclass, &new_tty_ctx) != 0) {
 		error("%s: security_compute_relabel: %s",
 		    __func__, strerror(errno));
 		goto out;
diff --git a/openbsd-compat/port-tun.c b/openbsd-compat/port-net.c
similarity index 61%
rename from openbsd-compat/port-tun.c
rename to openbsd-compat/port-net.c
index a444adf..bb53562 100644
--- a/openbsd-compat/port-tun.c
+++ b/openbsd-compat/port-net.c
@@ -37,6 +37,90 @@
 #include "ssherr.h"
 
 /*
+ * This file contains various portability code for network support,
+ * including tun/tap forwarding and routing domains.
+ */
+
+#if defined(SYS_RDOMAIN_LINUX) || defined(SSH_TUN_LINUX)
+#include <linux/if.h>
+#endif
+
+#if defined(SYS_RDOMAIN_LINUX)
+char *
+sys_get_rdomain(int fd)
+{
+	char dev[IFNAMSIZ + 1];
+	socklen_t len = sizeof(dev) - 1;
+
+	if (getsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, dev, &len) == -1) {
+		error("%s: cannot determine VRF for fd=%d : %s",
+		    __func__, fd, strerror(errno));
+		return NULL;
+	}
+	dev[len] = '\0';
+	return strdup(dev);
+}
+
+int
+sys_set_rdomain(int fd, const char *name)
+{
+	if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,
+	    name, strlen(name)) == -1) {
+		error("%s: setsockopt(%d, SO_BINDTODEVICE, %s): %s",
+		      __func__, fd, name, strerror(errno));
+		return -1;
+	}
+	return 0;
+}
+
+int
+sys_valid_rdomain(const char *name)
+{
+	int fd;
+
+	/*
+	 * This is a pretty crappy way to test. It would be better to
+	 * check whether "name" represents a VRF device, but apparently
+	 * that requires an rtnetlink transaction.
+	 */
+	if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+		return 0;
+	if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,
+	    name, strlen(name)) == -1) {
+		close(fd);
+		return 0;
+	}
+	close(fd);
+	return 1;
+}
+#elif defined(SYS_RDOMAIN_XXX)
+/* XXX examples */
+char *
+sys_get_rdomain(int fd)
+{
+	return NULL;
+}
+
+int
+sys_set_rdomain(int fd, const char *name)
+{
+	return -1;
+}
+
+int
+valid_rdomain(const char *name)
+{
+	return 0;
+}
+
+void
+sys_set_process_rdomain(const char *name)
+{
+	fatal("%s: not supported", __func__);
+}
+#endif /* defined(SYS_RDOMAIN_XXX) */
+
+/*
  * This is the portable version of the SSH tunnel forwarding, it
  * uses some preprocessor definitions for various platform-specific
  * settings.
@@ -52,16 +136,18 @@
  */
 
 #if defined(SSH_TUN_LINUX)
-#include <linux/if.h>
 #include <linux/if_tun.h>
 
 int
-sys_tun_open(int tun, int mode)
+sys_tun_open(int tun, int mode, char **ifname)
 {
 	struct ifreq ifr;
 	int fd = -1;
 	const char *name = NULL;
 
+	if (ifname != NULL)
+		*ifname = NULL;
+
 	if ((fd = open("/dev/net/tun", O_RDWR)) == -1) {
 		debug("%s: failed to open tunnel control interface: %s",
 		    __func__, strerror(errno));
@@ -99,6 +185,9 @@
 	else
 		debug("%s: %s mode %d fd %d", __func__, ifr.ifr_name, mode, fd);
 
+	if (ifname != NULL && (*ifname = strdup(ifr.ifr_name)) == NULL)
+		goto failed;
+
 	return (fd);
 
  failed:
@@ -116,13 +205,16 @@
 #endif
 
 int
-sys_tun_open(int tun, int mode)
+sys_tun_open(int tun, int mode, char **ifname)
 {
 	struct ifreq ifr;
 	char name[100];
 	int fd = -1, sock, flag;
 	const char *tunbase = "tun";
 
+	if (ifname != NULL)
+		*ifname = NULL;
+
 	if (mode == SSH_TUNMODE_ETHERNET) {
 #ifdef SSH_TUN_NO_L2
 		debug("%s: no layer 2 tunnelling support", __func__);
@@ -180,6 +272,9 @@
 			goto failed;
 	}
 
+	if (ifname != NULL && (*ifname = strdup(ifr.ifr_name)) == NULL)
+		goto failed;
+
 	close(sock);
 	return (fd);
 
@@ -199,84 +294,81 @@
  */
 
 #if defined(SSH_TUN_FILTER)
+/*
+ * The tunnel forwarding protocol prepends the address family of forwarded
+ * IP packets using OpenBSD's numbers.
+ */
 #define OPENBSD_AF_INET		2
 #define OPENBSD_AF_INET6	24
 
 int
-sys_tun_infilter(struct Channel *c, char *buf, int len)
+sys_tun_infilter(struct ssh *ssh, struct Channel *c, char *buf, int _len)
 {
+	int r;
+	size_t len;
+	char *ptr = buf;
 #if defined(SSH_TUN_PREPEND_AF)
 	char rbuf[CHAN_RBUF];
-	struct ip *iph;
+	struct ip iph;
 #endif
-	u_int32_t *af;
-	char *ptr = buf;
-	int r;
+#if defined(SSH_TUN_PREPEND_AF) || defined(SSH_TUN_COMPAT_AF)
+	u_int32_t af;
+#endif
+
+	/* XXX update channel input filter API to use unsigned length */
+	if (_len < 0)
+		return -1;
+	len = _len;
 
 #if defined(SSH_TUN_PREPEND_AF)
-	if (len <= 0 || len > (int)(sizeof(rbuf) - sizeof(*af)))
-		return (-1);
-	ptr = (char *)&rbuf[0];
-	bcopy(buf, ptr + sizeof(u_int32_t), len);
-	len += sizeof(u_int32_t);
-	af = (u_int32_t *)ptr;
-
-	iph = (struct ip *)(ptr + sizeof(u_int32_t));
-	switch (iph->ip_v) {
-	case 6:
-		*af = AF_INET6;
-		break;
-	case 4:
-	default:
-		*af = AF_INET;
-		break;
-	}
+	if (len <= sizeof(iph) || len > sizeof(rbuf) - 4)
+		return -1;
+	/* Determine address family from packet IP header. */
+	memcpy(&iph, buf, sizeof(iph));
+	af = iph.ip_v == 6 ? OPENBSD_AF_INET6 : OPENBSD_AF_INET;
+	/* Prepend address family to packet using OpenBSD constants */
+	memcpy(rbuf + 4, buf, len);
+	len += 4;
+	POKE_U32(rbuf, af);
+	ptr = rbuf;
+#elif defined(SSH_TUN_COMPAT_AF)
+	/* Convert existing address family header to OpenBSD value */
+	if (len <= 4)
+		return -1;
+	af = PEEK_U32(buf);
+	/* Put it back */
+	POKE_U32(buf, af == AF_INET6 ? OPENBSD_AF_INET6 : OPENBSD_AF_INET);
 #endif
 
-#if defined(SSH_TUN_COMPAT_AF)
-	if (len < (int)sizeof(u_int32_t))
-		return (-1);
-
-	af = (u_int32_t *)ptr;
-	if (*af == htonl(AF_INET6))
-		*af = htonl(OPENBSD_AF_INET6);
-	else
-		*af = htonl(OPENBSD_AF_INET);
-#endif
-
-	if ((r = sshbuf_put_string(&c->input, ptr, len)) != 0)
+	if ((r = sshbuf_put_string(c->input, ptr, len)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	return (0);
 }
 
 u_char *
-sys_tun_outfilter(struct Channel *c, u_char **data, u_int *dlen)
+sys_tun_outfilter(struct ssh *ssh, struct Channel *c,
+    u_char **data, size_t *dlen)
 {
 	u_char *buf;
-	u_int32_t *af;
+	u_int32_t af;
 	int r;
-	size_t xxx_dlen;
 
 	/* XXX new API is incompatible with this signature. */
-	if ((r = sshbuf_get_string(&c->output, data, &xxx_dlen)) != 0)
+	if ((r = sshbuf_get_string(c->output, data, dlen)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	if (dlen != NULL)
-		*dlen = xxx_dlen;
-	if (*dlen < sizeof(*af))
+	if (*dlen < sizeof(af))
 		return (NULL);
 	buf = *data;
 
 #if defined(SSH_TUN_PREPEND_AF)
-	*dlen -= sizeof(u_int32_t);
-	buf = *data + sizeof(u_int32_t);
+	/* skip address family */
+	*dlen -= sizeof(af);
+	buf = *data + sizeof(af);
 #elif defined(SSH_TUN_COMPAT_AF)
-	af = ntohl(*(u_int32_t *)buf);
-	if (*af == OPENBSD_AF_INET6)
-		*af = htonl(AF_INET6);
-	else
-		*af = htonl(AF_INET);
+	/* translate address family */
+	af = (PEEK_U32(buf) == OPENBSD_AF_INET6) ? AF_INET6 : AF_INET;
+	POKE_U32(buf, af);
 #endif
-
 	return (buf);
 }
 #endif /* SSH_TUN_FILTER */
diff --git a/openbsd-compat/port-tun.h b/openbsd-compat/port-net.h
similarity index 64%
rename from openbsd-compat/port-tun.h
rename to openbsd-compat/port-net.h
index c53df01..3a0d110 100644
--- a/openbsd-compat/port-tun.h
+++ b/openbsd-compat/port-net.h
@@ -18,16 +18,31 @@
 #define _PORT_TUN_H
 
 struct Channel;
+struct ssh;
 
 #if defined(SSH_TUN_LINUX) || defined(SSH_TUN_FREEBSD)
 # define CUSTOM_SYS_TUN_OPEN
-int	  sys_tun_open(int, int);
+int	  sys_tun_open(int, int, char **);
 #endif
 
 #if defined(SSH_TUN_COMPAT_AF) || defined(SSH_TUN_PREPEND_AF)
 # define SSH_TUN_FILTER
-int	 sys_tun_infilter(struct Channel *, char *, int);
-u_char	*sys_tun_outfilter(struct Channel *, u_char **, u_int *);
+int	 sys_tun_infilter(struct ssh *, struct Channel *, char *, int);
+u_char	*sys_tun_outfilter(struct ssh *, struct Channel *, u_char **, size_t *);
+#endif
+
+#if defined(SYS_RDOMAIN_LINUX)
+# define HAVE_SYS_GET_RDOMAIN
+# define HAVE_SYS_SET_RDOMAIN
+# define HAVE_SYS_VALID_RDOMAIN
+char *sys_get_rdomain(int fd);
+int sys_set_rdomain(int fd, const char *name);
+int sys_valid_rdomain(const char *name);
+#endif
+
+#if defined(SYS_RDOMAIN_XXX)
+# define HAVE_SYS_SET_PROCESS_RDOMAIN
+void sys_set_process_rdomain(const char *name);
 #endif
 
 #endif
diff --git a/openbsd-compat/port-uw.c b/openbsd-compat/port-uw.c
index db24dbb..9edb1b4 100644
--- a/openbsd-compat/port-uw.c
+++ b/openbsd-compat/port-uw.c
@@ -38,8 +38,6 @@
 
 #include "xmalloc.h"
 #include "packet.h"
-#include "buffer.h"
-#include "key.h"
 #include "auth-options.h"
 #include "log.h"
 #include "misc.h"	/* servconf.h needs misc.h for struct ForwardOptions */
@@ -47,12 +45,14 @@
 #include "hostfile.h"
 #include "auth.h"
 #include "ssh.h"
+#include "ssh_api.h"
 
 int nischeck(char *);
 
 int
-sys_auth_passwd(Authctxt *authctxt, const char *password)
+sys_auth_passwd(struct ssh *ssh, const char *password)
 {
+	Authctxt *authctxt = ssh->authctxt;
 	struct passwd *pw = authctxt->pw;
 	char *salt;
 	int result;
@@ -97,7 +97,7 @@
 
 	if ((fd = fopen (password_file, "r")) == NULL) {
 		/*
-		 * If the passwd file has dissapeared we are in a bad state.
+		 * If the passwd file has disappeared we are in a bad state.
 		 * However, returning 0 will send us back through the
 		 * authentication scheme that has checked the ia database for
 		 * passwords earlier.
diff --git a/openbsd-compat/readpassphrase.c b/openbsd-compat/readpassphrase.c
index 24aed6e..ff8ff3d 100644
--- a/openbsd-compat/readpassphrase.c
+++ b/openbsd-compat/readpassphrase.c
@@ -46,14 +46,6 @@
 #  define _POSIX_VDISABLE       VDISABLE
 #endif
 
-#ifndef _NSIG
-# ifdef NSIG
-#  define _NSIG NSIG
-# else
-#  define _NSIG 128
-# endif
-#endif
-
 static volatile sig_atomic_t signo[_NSIG];
 
 static void handler(int);
diff --git a/openbsd-compat/recallocarray.c b/openbsd-compat/recallocarray.c
new file mode 100644
index 0000000..3e1156c
--- /dev/null
+++ b/openbsd-compat/recallocarray.c
@@ -0,0 +1,90 @@
+/*	$OpenBSD: recallocarray.c,v 1.1 2017/03/06 18:44:21 otto Exp $	*/
+/*
+ * Copyright (c) 2008, 2017 Otto Moerbeek <otto@drijf.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* OPENBSD ORIGINAL: lib/libc/stdlib/recallocarray.c */
+
+#include "includes.h"
+#ifndef HAVE_RECALLOCARRAY
+
+#include <errno.h>
+#include <stdlib.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include <string.h>
+#include <unistd.h>
+
+/*
+ * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
+ * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
+ */
+#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
+
+void *
+recallocarray(void *ptr, size_t oldnmemb, size_t newnmemb, size_t size)
+{
+	size_t oldsize, newsize;
+	void *newptr;
+
+	if (ptr == NULL)
+		return calloc(newnmemb, size);
+
+	if ((newnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
+	    newnmemb > 0 && SIZE_MAX / newnmemb < size) {
+		errno = ENOMEM;
+		return NULL;
+	}
+	newsize = newnmemb * size;
+
+	if ((oldnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
+	    oldnmemb > 0 && SIZE_MAX / oldnmemb < size) {
+		errno = EINVAL;
+		return NULL;
+	}
+	oldsize = oldnmemb * size;
+	
+	/*
+	 * Don't bother too much if we're shrinking just a bit,
+	 * we do not shrink for series of small steps, oh well.
+	 */
+	if (newsize <= oldsize) {
+		size_t d = oldsize - newsize;
+
+		if (d < oldsize / 2 && d < (size_t)getpagesize()) {
+			memset((char *)ptr + newsize, 0, d);
+			return ptr;
+		}
+	}
+
+	newptr = malloc(newsize);
+	if (newptr == NULL)
+		return NULL;
+
+	if (newsize > oldsize) {
+		memcpy(newptr, ptr, oldsize);
+		memset((char *)newptr + oldsize, 0, newsize - oldsize);
+	} else
+		memcpy(newptr, ptr, newsize);
+
+	explicit_bzero(ptr, oldsize);
+	free(ptr);
+
+	return newptr;
+}
+/* DEF_WEAK(recallocarray); */
+
+#endif /* HAVE_RECALLOCARRAY */
diff --git a/openbsd-compat/regress/Makefile.in b/openbsd-compat/regress/Makefile.in
index dabdb09..529331b 100644
--- a/openbsd-compat/regress/Makefile.in
+++ b/openbsd-compat/regress/Makefile.in
@@ -1,5 +1,3 @@
-# $Id: Makefile.in,v 1.5 2014/06/17 13:06:08 dtucker Exp $
-
 sysconfdir=@sysconfdir@
 piddir=@piddir@
 srcdir=@srcdir@
diff --git a/openbsd-compat/setproctitle.c b/openbsd-compat/setproctitle.c
index 2b15c6e..50f4b4c 100644
--- a/openbsd-compat/setproctitle.c
+++ b/openbsd-compat/setproctitle.c
@@ -36,6 +36,7 @@
 #ifndef HAVE_SETPROCTITLE
 
 #include <stdarg.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #ifdef HAVE_SYS_PSTAT_H
diff --git a/openbsd-compat/sha2.c b/openbsd-compat/sha2.c
index a22099b..b55ea30 100644
--- a/openbsd-compat/sha2.c
+++ b/openbsd-compat/sha2.c
@@ -72,7 +72,7 @@
  * Please make sure that your system defines BYTE_ORDER.  If your
  * architecture is little-endian, make sure it also defines
  * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
- * equivilent.
+ * equivalent.
  *
  * If your system does not define the above, then you can do so by
  * hand like this:
diff --git a/openbsd-compat/strndup.c b/openbsd-compat/strndup.c
new file mode 100644
index 0000000..30ac6f0
--- /dev/null
+++ b/openbsd-compat/strndup.c
@@ -0,0 +1,43 @@
+/*	$OpenBSD: strndup.c,v 1.2 2015/08/31 02:53:57 guenther Exp $	*/
+
+/*
+ * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "includes.h"
+#if !defined(HAVE_STRNDUP) || defined(BROKEN_STRNDUP)
+#include <sys/types.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *
+strndup(const char *str, size_t maxlen)
+{
+	char *copy;
+	size_t len;
+
+	len = strnlen(str, maxlen);
+	copy = malloc(len + 1);
+	if (copy != NULL) {
+		(void)memcpy(copy, str, len);
+		copy[len] = '\0';
+	}
+
+	return copy;
+}
+DEF_WEAK(strndup);
+#endif  /* HAVE_STRNDUP */
diff --git a/openbsd-compat/strnlen.c b/openbsd-compat/strnlen.c
index 93d5155..7ad3573 100644
--- a/openbsd-compat/strnlen.c
+++ b/openbsd-compat/strnlen.c
@@ -18,8 +18,8 @@
 
 /* OPENBSD ORIGINAL: lib/libc/string/strnlen.c */
 
-#include "config.h"
-#ifndef HAVE_STRNLEN
+#include "includes.h"
+#if !defined(HAVE_STRNLEN) || defined(BROKEN_STRNLEN)
 #include <sys/types.h>
 
 #include <string.h>
diff --git a/openbsd-compat/sys-queue.h b/openbsd-compat/sys-queue.h
index 28aaaa3..af93d68 100644
--- a/openbsd-compat/sys-queue.h
+++ b/openbsd-compat/sys-queue.h
@@ -45,6 +45,7 @@
 #undef SLIST_HEAD_INITIALIZER
 #undef SLIST_ENTRY
 #undef SLIST_FOREACH_PREVPTR
+#undef SLIST_FOREACH_SAFE
 #undef SLIST_FIRST
 #undef SLIST_END
 #undef SLIST_EMPTY
@@ -54,6 +55,7 @@
 #undef SLIST_INSERT_AFTER
 #undef SLIST_INSERT_HEAD
 #undef SLIST_REMOVE_HEAD
+#undef SLIST_REMOVE_AFTER
 #undef SLIST_REMOVE
 #undef SLIST_REMOVE_NEXT
 #undef LIST_HEAD
@@ -64,6 +66,7 @@
 #undef LIST_EMPTY
 #undef LIST_NEXT
 #undef LIST_FOREACH
+#undef LIST_FOREACH_SAFE
 #undef LIST_INIT
 #undef LIST_INSERT_AFTER
 #undef LIST_INSERT_BEFORE
@@ -94,6 +97,8 @@
 #undef TAILQ_EMPTY
 #undef TAILQ_FOREACH
 #undef TAILQ_FOREACH_REVERSE
+#undef TAILQ_FOREACH_SAFE
+#undef TAILQ_FOREACH_REVERSE_SAFE
 #undef TAILQ_INIT
 #undef TAILQ_INSERT_HEAD
 #undef TAILQ_INSERT_TAIL
diff --git a/opensshd.init.in b/opensshd.init.in
index 3908566..99e5a51 100755
--- a/opensshd.init.in
+++ b/opensshd.init.in
@@ -17,7 +17,6 @@
 PidFile=`grep "^PidFile" ${sysconfdir}/sshd_config | tr "=" " " | awk '{print $2}'`
 [ X$PidFile = X ]  ||  PIDFILE=$PidFile
 SSH_KEYGEN=$prefix/bin/ssh-keygen
-HOST_KEY_RSA1=$sysconfdir/ssh_host_key
 HOST_KEY_DSA=$sysconfdir/ssh_host_dsa_key
 HOST_KEY_RSA=$sysconfdir/ssh_host_rsa_key
 @COMMENT_OUT_ECC@HOST_KEY_ECDSA=$sysconfdir/ssh_host_ecdsa_key
@@ -25,9 +24,6 @@
 
 
 checkkeys() {
-@COMMENT_OUT_RSA1@    if [ ! -f $HOST_KEY_RSA1 ]; then
-@COMMENT_OUT_RSA1@	${SSH_KEYGEN} -t rsa1 -f ${HOST_KEY_RSA1} -N ""
-@COMMENT_OUT_RSA1@    fi
     if [ ! -f $HOST_KEY_DSA ]; then
 	${SSH_KEYGEN} -t dsa -f ${HOST_KEY_DSA} -N ""
     fi
diff --git a/packet.c b/packet.c
index 5cc3113..a28a7ba 100644
--- a/packet.c
+++ b/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.246 2017/02/28 06:10:08 djm Exp $ */
+/* $OpenBSD: packet.c,v 1.277 2018/07/16 03:09:13 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -61,16 +61,23 @@
 #include <signal.h>
 #include <time.h>
 
-#include <zlib.h>
+/*
+ * Explicitly include OpenSSL before zlib as some versions of OpenSSL have
+ * "free_func" in their headers, which zlib typedefs.
+ */
+#ifdef WITH_OPENSSL
+# include <openssl/bn.h>
+# include <openssl/evp.h>
+# ifdef OPENSSL_HAS_ECC
+#  include <openssl/ec.h>
+# endif
+#endif
 
-#include "buffer.h"	/* typedefs XXX */
-#include "key.h"	/* typedefs XXX */
+#include <zlib.h>
 
 #include "xmalloc.h"
 #include "crc32.h"
-#include "deattack.h"
 #include "compat.h"
-#include "ssh1.h"
 #include "ssh2.h"
 #include "cipher.h"
 #include "sshkey.h"
@@ -149,12 +156,6 @@
 	int compression_in_failures;
 	int compression_out_failures;
 
-	/*
-	 * Flag indicating whether packet compression/decompression is
-	 * enabled.
-	 */
-	int packet_compression;
-
 	/* default maximum packet size */
 	u_int max_packet_size;
 
@@ -186,10 +187,6 @@
 	u_int32_t rekey_interval;	/* how often in seconds */
 	time_t rekey_time;	/* time of last rekeying */
 
-	/* Session key for protocol v1 */
-	u_char ssh1_key[SSH_SESSION_KEY_LENGTH];
-	u_int ssh1_keylen;
-
 	/* roundup current message to extra_pad bytes */
 	u_char extra_pad;
 
@@ -216,9 +213,6 @@
 	/* One-off warning about weak ciphers */
 	int cipher_warning_done;
 
-	/* SSH1 CRC compensation attack detector */
-	struct deattack_ctx deattack;
-
 	/* Hook for fuzzing inbound packets */
 	ssh_packet_hook_fn *hook_in;
 	void *hook_in_ctx;
@@ -278,13 +272,12 @@
 int
 ssh_packet_is_rekeying(struct ssh *ssh)
 {
-	return compat20 &&
-	    (ssh->state->rekeying || (ssh->kex != NULL && ssh->kex->done == 0));
+	return ssh->state->rekeying ||
+	    (ssh->kex != NULL && ssh->kex->done == 0);
 }
 
 /*
- * Sets the descriptors used for communication.  Disables encryption until
- * packet_set_encryption_key is called.
+ * Sets the descriptors used for communication.
  */
 struct ssh *
 ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out)
@@ -315,7 +308,6 @@
 		return NULL;
 	}
 	state->newkeys[MODE_IN] = state->newkeys[MODE_OUT] = NULL;
-	deattack_init(&state->deattack);
 	/*
 	 * Cache the IP address of the remote connection for use in error
 	 * messages that might be generated after the connection has closed.
@@ -429,13 +421,16 @@
 int
 ssh_packet_connection_is_on_socket(struct ssh *ssh)
 {
-	struct session_state *state = ssh->state;
+	struct session_state *state;
 	struct sockaddr_storage from, to;
 	socklen_t fromlen, tolen;
 
-	if (state->connection_in == -1 || state->connection_out == -1)
+	if (ssh == NULL || ssh->state == NULL)
 		return 0;
 
+	state = ssh->state;
+	if (state->connection_in == -1 || state->connection_out == -1)
+		return 0;
 	/* filedescriptors in and out are the same, so it's a socket */
 	if (state->connection_in == state->connection_out)
 		return 1;
@@ -519,11 +514,12 @@
 const char *
 ssh_remote_ipaddr(struct ssh *ssh)
 {
-	const int sock = ssh->state->connection_in;
+	int sock;
 
 	/* Check whether we have cached the ipaddr. */
 	if (ssh->remote_ipaddr == NULL) {
 		if (ssh_packet_connection_is_on_socket(ssh)) {
+			sock = ssh->state->connection_in;
 			ssh->remote_ipaddr = get_peer_ipaddr(sock);
 			ssh->remote_port = get_peer_port(sock);
 			ssh->local_ipaddr = get_local_ipaddr(sock);
@@ -568,10 +564,22 @@
 	return ssh->local_port;
 }
 
+/* Returns the routing domain of the input socket, or NULL if unavailable */
+const char *
+ssh_packet_rdomain_in(struct ssh *ssh)
+{
+	if (ssh->rdomain_in != NULL)
+		return ssh->rdomain_in;
+	if (!ssh_packet_connection_is_on_socket(ssh))
+		return NULL;
+	ssh->rdomain_in = get_rdomain(ssh->state->connection_in);
+	return ssh->rdomain_in;
+}
+
 /* Closes the connection and clears and frees internal data structures. */
 
-void
-ssh_packet_close(struct ssh *ssh)
+static void
+ssh_packet_close_internal(struct ssh *ssh, int do_close)
 {
 	struct session_state *state = ssh->state;
 	u_int mode;
@@ -579,20 +587,25 @@
 	if (!state->initialized)
 		return;
 	state->initialized = 0;
-	if (state->connection_in == state->connection_out) {
-		shutdown(state->connection_out, SHUT_RDWR);
-		close(state->connection_out);
-	} else {
-		close(state->connection_in);
-		close(state->connection_out);
+	if (do_close) {
+		if (state->connection_in == state->connection_out) {
+			close(state->connection_out);
+		} else {
+			close(state->connection_in);
+			close(state->connection_out);
+		}
 	}
 	sshbuf_free(state->input);
 	sshbuf_free(state->output);
 	sshbuf_free(state->outgoing_packet);
 	sshbuf_free(state->incoming_packet);
-	for (mode = 0; mode < MODE_MAX; mode++)
-		kex_free_newkeys(state->newkeys[mode]);
-	if (state->compression_buffer) {
+	for (mode = 0; mode < MODE_MAX; mode++) {
+		kex_free_newkeys(state->newkeys[mode]);	/* current keys */
+		state->newkeys[mode] = NULL;
+		ssh_clear_newkeys(ssh, mode);		/* next keys */
+	}
+	/* compression state is in shared mem, so we can only release it once */
+	if (do_close && state->compression_buffer) {
 		sshbuf_free(state->compression_buffer);
 		if (state->compression_out_started) {
 			z_streamp stream = &state->compression_out_stream;
@@ -606,7 +619,7 @@
 				deflateEnd(stream);
 		}
 		if (state->compression_in_started) {
-			z_streamp stream = &state->compression_out_stream;
+			z_streamp stream = &state->compression_in_stream;
 			debug("compress incoming: "
 			    "raw data %llu, compressed %llu, factor %.2f",
 			    (unsigned long long)stream->total_out,
@@ -620,10 +633,26 @@
 	cipher_free(state->send_context);
 	cipher_free(state->receive_context);
 	state->send_context = state->receive_context = NULL;
-	free(ssh->remote_ipaddr);
-	ssh->remote_ipaddr = NULL;
-	free(ssh->state);
-	ssh->state = NULL;
+	if (do_close) {
+		free(ssh->local_ipaddr);
+		ssh->local_ipaddr = NULL;
+		free(ssh->remote_ipaddr);
+		ssh->remote_ipaddr = NULL;
+		free(ssh->state);
+		ssh->state = NULL;
+	}
+}
+
+void
+ssh_packet_close(struct ssh *ssh)
+{
+	ssh_packet_close_internal(ssh, 1);
+}
+
+void
+ssh_packet_clear_keys(struct ssh *ssh)
+{
+	ssh_packet_close_internal(ssh, 0);
 }
 
 /* Sets remote side protocol flags. */
@@ -693,21 +722,6 @@
 	return 0;
 }
 
-int
-ssh_packet_start_compression(struct ssh *ssh, int level)
-{
-	int r;
-
-	if (ssh->state->packet_compression && !compat20)
-		return SSH_ERR_INTERNAL_ERROR;
-	ssh->state->packet_compression = 1;
-	if ((r = ssh_packet_init_compression(ssh)) != 0 ||
-	    (r = start_compression_in(ssh)) != 0 ||
-	    (r = start_compression_out(ssh, level)) != 0)
-		return r;
-	return 0;
-}
-
 /* XXX remove need for separate compression buffer */
 static int
 compress_buffer(struct ssh *ssh, struct sshbuf *in, struct sshbuf *out)
@@ -802,136 +816,13 @@
 	/* NOTREACHED */
 }
 
-/*
- * Causes any further packets to be encrypted using the given key.  The same
- * key is used for both sending and reception.  However, both directions are
- * encrypted independently of each other.
- */
-
 void
-ssh_packet_set_encryption_key(struct ssh *ssh, const u_char *key, u_int keylen, int number)
+ssh_clear_newkeys(struct ssh *ssh, int mode)
 {
-#ifndef WITH_SSH1
-	fatal("no SSH protocol 1 support");
-#else /* WITH_SSH1 */
-	struct session_state *state = ssh->state;
-	const struct sshcipher *cipher = cipher_by_number(number);
-	int r;
-	const char *wmsg;
-
-	if (cipher == NULL)
-		fatal("%s: unknown cipher number %d", __func__, number);
-	if (keylen < 20)
-		fatal("%s: keylen too small: %d", __func__, keylen);
-	if (keylen > SSH_SESSION_KEY_LENGTH)
-		fatal("%s: keylen too big: %d", __func__, keylen);
-	memcpy(state->ssh1_key, key, keylen);
-	state->ssh1_keylen = keylen;
-	if ((r = cipher_init(&state->send_context, cipher, key, keylen,
-	    NULL, 0, CIPHER_ENCRYPT)) != 0 ||
-	    (r = cipher_init(&state->receive_context, cipher, key, keylen,
-	    NULL, 0, CIPHER_DECRYPT) != 0))
-		fatal("%s: cipher_init failed: %s", __func__, ssh_err(r));
-	if (!state->cipher_warning_done &&
-	    ((wmsg = cipher_warning_message(state->send_context)) != NULL ||
-	    (wmsg = cipher_warning_message(state->send_context)) != NULL)) {
-		error("Warning: %s", wmsg);
-		state->cipher_warning_done = 1;
+	if (ssh->kex && ssh->kex->newkeys[mode]) {
+		kex_free_newkeys(ssh->kex->newkeys[mode]);
+		ssh->kex->newkeys[mode] = NULL;
 	}
-#endif /* WITH_SSH1 */
-}
-
-/*
- * Finalizes and sends the packet.  If the encryption key has been set,
- * encrypts the packet before sending.
- */
-
-int
-ssh_packet_send1(struct ssh *ssh)
-{
-	struct session_state *state = ssh->state;
-	u_char buf[8], *cp;
-	int r, padding, len;
-	u_int checksum;
-
-	/*
-	 * If using packet compression, compress the payload of the outgoing
-	 * packet.
-	 */
-	if (state->packet_compression) {
-		sshbuf_reset(state->compression_buffer);
-		/* Skip padding. */
-		if ((r = sshbuf_consume(state->outgoing_packet, 8)) != 0)
-			goto out;
-		/* padding */
-		if ((r = sshbuf_put(state->compression_buffer,
-		    "\0\0\0\0\0\0\0\0", 8)) != 0)
-			goto out;
-		if ((r = compress_buffer(ssh, state->outgoing_packet,
-		    state->compression_buffer)) != 0)
-			goto out;
-		sshbuf_reset(state->outgoing_packet);
-                if ((r = sshbuf_putb(state->outgoing_packet,
-                    state->compression_buffer)) != 0)
-			goto out;
-	}
-	/* Compute packet length without padding (add checksum, remove padding). */
-	len = sshbuf_len(state->outgoing_packet) + 4 - 8;
-
-	/* Insert padding. Initialized to zero in packet_start1() */
-	padding = 8 - len % 8;
-	if (!cipher_ctx_is_plaintext(state->send_context)) {
-		cp = sshbuf_mutable_ptr(state->outgoing_packet);
-		if (cp == NULL) {
-			r = SSH_ERR_INTERNAL_ERROR;
-			goto out;
-		}
-		arc4random_buf(cp + 8 - padding, padding);
-	}
-	if ((r = sshbuf_consume(state->outgoing_packet, 8 - padding)) != 0)
-		goto out;
-
-	/* Add check bytes. */
-	checksum = ssh_crc32(sshbuf_ptr(state->outgoing_packet),
-	    sshbuf_len(state->outgoing_packet));
-	POKE_U32(buf, checksum);
-	if ((r = sshbuf_put(state->outgoing_packet, buf, 4)) != 0)
-		goto out;
-
-#ifdef PACKET_DEBUG
-	fprintf(stderr, "packet_send plain: ");
-	sshbuf_dump(state->outgoing_packet, stderr);
-#endif
-
-	/* Append to output. */
-	POKE_U32(buf, len);
-	if ((r = sshbuf_put(state->output, buf, 4)) != 0)
-		goto out;
-	if ((r = sshbuf_reserve(state->output,
-	    sshbuf_len(state->outgoing_packet), &cp)) != 0)
-		goto out;
-	if ((r = cipher_crypt(state->send_context, 0, cp,
-	    sshbuf_ptr(state->outgoing_packet),
-	    sshbuf_len(state->outgoing_packet), 0, 0)) != 0)
-		goto out;
-
-#ifdef PACKET_DEBUG
-	fprintf(stderr, "encrypted: ");
-	sshbuf_dump(state->output, stderr);
-#endif
-	state->p_send.packets++;
-	state->p_send.bytes += len +
-	    sshbuf_len(state->outgoing_packet);
-	sshbuf_reset(state->outgoing_packet);
-
-	/*
-	 * Note that the packet is now only buffered in output.  It won't be
-	 * actually sent until ssh_packet_write_wait or ssh_packet_write_poll
-	 * is called.
-	 */
-	r = 0;
- out:
-	return r;
 }
 
 int
@@ -944,45 +835,33 @@
 	struct sshcipher_ctx **ccp;
 	struct packet_state *ps;
 	u_int64_t *max_blocks;
-	const char *wmsg, *dir;
+	const char *wmsg;
 	int r, crypt_type;
 
 	debug2("set_newkeys: mode %d", mode);
 
 	if (mode == MODE_OUT) {
-		dir = "output";
 		ccp = &state->send_context;
 		crypt_type = CIPHER_ENCRYPT;
 		ps = &state->p_send;
 		max_blocks = &state->max_blocks_out;
 	} else {
-		dir = "input";
 		ccp = &state->receive_context;
 		crypt_type = CIPHER_DECRYPT;
 		ps = &state->p_read;
 		max_blocks = &state->max_blocks_in;
 	}
 	if (state->newkeys[mode] != NULL) {
-		debug("%s: rekeying after %llu %s blocks"
-		    " (%llu bytes total)", __func__,
-		    (unsigned long long)ps->blocks, dir,
-		    (unsigned long long)ps->bytes);
+		debug("set_newkeys: rekeying, input %llu bytes %llu blocks, "
+		   "output %llu bytes %llu blocks",
+		   (unsigned long long)state->p_read.bytes,
+		   (unsigned long long)state->p_read.blocks,
+		   (unsigned long long)state->p_send.bytes,
+		   (unsigned long long)state->p_send.blocks);
 		cipher_free(*ccp);
 		*ccp = NULL;
-		enc  = &state->newkeys[mode]->enc;
-		mac  = &state->newkeys[mode]->mac;
-		comp = &state->newkeys[mode]->comp;
-		mac_clear(mac);
-		explicit_bzero(enc->iv,  enc->iv_len);
-		explicit_bzero(enc->key, enc->key_len);
-		explicit_bzero(mac->key, mac->key_len);
-		free(enc->name);
-		free(enc->iv);
-		free(enc->key);
-		free(mac->name);
-		free(mac->key);
-		free(comp->name);
-		free(state->newkeys[mode]);
+		kex_free_newkeys(state->newkeys[mode]);
+		state->newkeys[mode] = NULL;
 	}
 	/* note that both bytes and the seqnr are not reset */
 	ps->packets = ps->blocks = 0;
@@ -1027,7 +906,8 @@
 	}
 	/*
 	 * The 2^(blocksize*2) limit is too expensive for 3DES,
-	 * blowfish, etc, so enforce a 1GB limit for small blocksizes.
+	 * so enforce a 1GB limit for small blocksizes.
+	 * See RFC4344 section 3.2.
 	 */
 	if (enc->block_size >= 16)
 		*max_blocks = (u_int64_t)1 << (enc->block_size*2);
@@ -1071,12 +951,15 @@
 	    (int64_t)state->rekey_time + state->rekey_interval <= monotime())
 		return 1;
 
-	/* Always rekey when MAX_PACKETS sent in either direction */
+	/*
+	 * Always rekey when MAX_PACKETS sent in either direction 
+	 * As per RFC4344 section 3.1 we do this after 2^31 packets.
+	 */
 	if (state->p_send.packets > MAX_PACKETS ||
 	    state->p_read.packets > MAX_PACKETS)
 		return 1;
 
-	/* Rekey after (cipher-specific) maxiumum blocks */
+	/* Rekey after (cipher-specific) maximum blocks */
 	out_blocks = ROUNDUP(outbound_packet_len,
 	    state->newkeys[MODE_OUT]->enc.block_size);
 	return (state->max_blocks_out &&
@@ -1424,13 +1307,6 @@
 		r = ssh_packet_read_poll_seqnr(ssh, typep, seqnr_p);
 		if (r != 0)
 			break;
-		if (!compat20 && (
-		    *typep == SSH_SMSG_SUCCESS
-		    || *typep == SSH_SMSG_FAILURE
-		    || *typep == SSH_CMSG_EOF
-		    || *typep == SSH_CMSG_EXIT_CONFIRMATION))
-			if ((r = sshpkt_get_end(ssh)) != 0)
-				break;
 		/* If we got a packet, return it. */
 		if (*typep != SSH_MSG_NONE)
 			break;
@@ -1450,7 +1326,7 @@
 		for (;;) {
 			if (state->packet_timeout_ms != -1) {
 				ms_to_timeval(&timeout, ms_remain);
-				gettimeofday(&start, NULL);
+				monotime_tv(&start);
 			}
 #ifdef __Fuchsia__
             /* TODO: Just do a wait for readable on the state->connection_in fd */
@@ -1463,8 +1339,10 @@
 				break;
 #endif
 			if (errno != EAGAIN && errno != EINTR &&
-			    errno != EWOULDBLOCK)
-				break;
+			    errno != EWOULDBLOCK) {
+				r = SSH_ERR_SYSTEM_ERROR;
+				goto out;
+			}
 			if (state->packet_timeout_ms == -1)
 				continue;
 			ms_subtract_diff(&start, &ms_remain);
@@ -1531,153 +1409,6 @@
 	return 0;
 }
 
-/* Checks if a full packet is available in the data received so far via
- * packet_process_incoming.  If so, reads the packet; otherwise returns
- * SSH_MSG_NONE.  This does not wait for data from the connection.
- *
- * SSH_MSG_DISCONNECT is handled specially here.  Also,
- * SSH_MSG_IGNORE messages are skipped by this function and are never returned
- * to higher levels.
- */
-
-int
-ssh_packet_read_poll1(struct ssh *ssh, u_char *typep)
-{
-	struct session_state *state = ssh->state;
-	u_int len, padded_len;
-	const char *emsg;
-	const u_char *cp;
-	u_char *p;
-	u_int checksum, stored_checksum;
-	int r;
-
-	*typep = SSH_MSG_NONE;
-
-	/* Check if input size is less than minimum packet size. */
-	if (sshbuf_len(state->input) < 4 + 8)
-		return 0;
-	/* Get length of incoming packet. */
-	len = PEEK_U32(sshbuf_ptr(state->input));
-	if (len < 1 + 2 + 2 || len > 256 * 1024) {
-		if ((r = sshpkt_disconnect(ssh, "Bad packet length %u",
-		    len)) != 0)
-			return r;
-		return SSH_ERR_CONN_CORRUPT;
-	}
-	padded_len = (len + 8) & ~7;
-
-	/* Check if the packet has been entirely received. */
-	if (sshbuf_len(state->input) < 4 + padded_len)
-		return 0;
-
-	/* The entire packet is in buffer. */
-
-	/* Consume packet length. */
-	if ((r = sshbuf_consume(state->input, 4)) != 0)
-		goto out;
-
-	/*
-	 * Cryptographic attack detector for ssh
-	 * (C)1998 CORE-SDI, Buenos Aires Argentina
-	 * Ariel Futoransky(futo@core-sdi.com)
-	 */
-	if (!cipher_ctx_is_plaintext(state->receive_context)) {
-		emsg = NULL;
-		switch (detect_attack(&state->deattack,
-		    sshbuf_ptr(state->input), padded_len)) {
-		case DEATTACK_OK:
-			break;
-		case DEATTACK_DETECTED:
-			emsg = "crc32 compensation attack detected";
-			break;
-		case DEATTACK_DOS_DETECTED:
-			emsg = "deattack denial of service detected";
-			break;
-		default:
-			emsg = "deattack error";
-			break;
-		}
-		if (emsg != NULL) {
-			error("%s", emsg);
-			if ((r = sshpkt_disconnect(ssh, "%s", emsg)) != 0 ||
-			    (r = ssh_packet_write_wait(ssh)) != 0)
-					return r;
-			return SSH_ERR_CONN_CORRUPT;
-		}
-	}
-
-	/* Decrypt data to incoming_packet. */
-	sshbuf_reset(state->incoming_packet);
-	if ((r = sshbuf_reserve(state->incoming_packet, padded_len, &p)) != 0)
-		goto out;
-	if ((r = cipher_crypt(state->receive_context, 0, p,
-	    sshbuf_ptr(state->input), padded_len, 0, 0)) != 0)
-		goto out;
-
-	if ((r = sshbuf_consume(state->input, padded_len)) != 0)
-		goto out;
-
-#ifdef PACKET_DEBUG
-	fprintf(stderr, "read_poll plain: ");
-	sshbuf_dump(state->incoming_packet, stderr);
-#endif
-
-	/* Compute packet checksum. */
-	checksum = ssh_crc32(sshbuf_ptr(state->incoming_packet),
-	    sshbuf_len(state->incoming_packet) - 4);
-
-	/* Skip padding. */
-	if ((r = sshbuf_consume(state->incoming_packet, 8 - len % 8)) != 0)
-		goto out;
-
-	/* Test check bytes. */
-	if (len != sshbuf_len(state->incoming_packet)) {
-		error("%s: len %d != sshbuf_len %zd", __func__,
-		    len, sshbuf_len(state->incoming_packet));
-		if ((r = sshpkt_disconnect(ssh, "invalid packet length")) != 0 ||
-		    (r = ssh_packet_write_wait(ssh)) != 0)
-			return r;
-		return SSH_ERR_CONN_CORRUPT;
-	}
-
-	cp = sshbuf_ptr(state->incoming_packet) + len - 4;
-	stored_checksum = PEEK_U32(cp);
-	if (checksum != stored_checksum) {
-		error("Corrupted check bytes on input");
-		if ((r = sshpkt_disconnect(ssh, "connection corrupted")) != 0 ||
-		    (r = ssh_packet_write_wait(ssh)) != 0)
-			return r;
-		return SSH_ERR_CONN_CORRUPT;
-	}
-	if ((r = sshbuf_consume_end(state->incoming_packet, 4)) < 0)
-		goto out;
-
-	if (state->packet_compression) {
-		sshbuf_reset(state->compression_buffer);
-		if ((r = uncompress_buffer(ssh, state->incoming_packet,
-		    state->compression_buffer)) != 0)
-			goto out;
-		sshbuf_reset(state->incoming_packet);
-		if ((r = sshbuf_putb(state->incoming_packet,
-		    state->compression_buffer)) != 0)
-			goto out;
-	}
-	state->p_read.packets++;
-	state->p_read.bytes += padded_len + 4;
-	if ((r = sshbuf_get_u8(state->incoming_packet, typep)) != 0)
-		goto out;
-	if (*typep < SSH_MSG_MIN || *typep > SSH_MSG_MAX) {
-		error("Invalid ssh1 packet type: %d", *typep);
-		if ((r = sshpkt_disconnect(ssh, "invalid packet type")) != 0 ||
-		    (r = ssh_packet_write_wait(ssh)) != 0)
-			return r;
-		return SSH_ERR_PROTOCOL_ERROR;
-	}
-	r = 0;
- out:
-	return r;
-}
-
 static int
 ssh_packet_read_poll2_mux(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
 {
@@ -1857,11 +1588,11 @@
 			if (r != SSH_ERR_MAC_INVALID)
 				goto out;
 			logit("Corrupted MAC on input.");
-			if (need > PACKET_MAX_SIZE)
+			if (need + block_size > PACKET_MAX_SIZE)
 				return SSH_ERR_INTERNAL_ERROR;
 			return ssh_packet_start_discard(ssh, enc, mac,
 			    sshbuf_len(state->incoming_packet),
-			    PACKET_MAX_SIZE - need);
+			    PACKET_MAX_SIZE - need - block_size);
 		}
 		/* Remove MAC from input buffer */
 		DBG(debug("MAC #%d ok", state->p_read.seqnr));
@@ -1958,75 +1689,48 @@
 
 	for (;;) {
 		msg = NULL;
-		if (compat20) {
-			r = ssh_packet_read_poll2(ssh, typep, seqnr_p);
-			if (r != 0)
+		r = ssh_packet_read_poll2(ssh, typep, seqnr_p);
+		if (r != 0)
+			return r;
+		if (*typep) {
+			state->keep_alive_timeouts = 0;
+			DBG(debug("received packet type %d", *typep));
+		}
+		switch (*typep) {
+		case SSH2_MSG_IGNORE:
+			debug3("Received SSH2_MSG_IGNORE");
+			break;
+		case SSH2_MSG_DEBUG:
+			if ((r = sshpkt_get_u8(ssh, NULL)) != 0 ||
+			    (r = sshpkt_get_string(ssh, &msg, NULL)) != 0 ||
+			    (r = sshpkt_get_string(ssh, NULL, NULL)) != 0) {
+				free(msg);
 				return r;
-			if (*typep) {
-				state->keep_alive_timeouts = 0;
-				DBG(debug("received packet type %d", *typep));
 			}
-			switch (*typep) {
-			case SSH2_MSG_IGNORE:
-				debug3("Received SSH2_MSG_IGNORE");
-				break;
-			case SSH2_MSG_DEBUG:
-				if ((r = sshpkt_get_u8(ssh, NULL)) != 0 ||
-				    (r = sshpkt_get_string(ssh, &msg, NULL)) != 0 ||
-				    (r = sshpkt_get_string(ssh, NULL, NULL)) != 0) {
-					free(msg);
-					return r;
-				}
-				debug("Remote: %.900s", msg);
-				free(msg);
-				break;
-			case SSH2_MSG_DISCONNECT:
-				if ((r = sshpkt_get_u32(ssh, &reason)) != 0 ||
-				    (r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
-					return r;
-				/* Ignore normal client exit notifications */
-				do_log2(ssh->state->server_side &&
-				    reason == SSH2_DISCONNECT_BY_APPLICATION ?
-				    SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_ERROR,
-				    "Received disconnect from %s port %d:"
-				    "%u: %.400s", ssh_remote_ipaddr(ssh),
-				    ssh_remote_port(ssh), reason, msg);
-				free(msg);
-				return SSH_ERR_DISCONNECTED;
-			case SSH2_MSG_UNIMPLEMENTED:
-				if ((r = sshpkt_get_u32(ssh, &seqnr)) != 0)
-					return r;
-				debug("Received SSH2_MSG_UNIMPLEMENTED for %u",
-				    seqnr);
-				break;
-			default:
-				return 0;
-			}
-		} else {
-			r = ssh_packet_read_poll1(ssh, typep);
-			switch (*typep) {
-			case SSH_MSG_NONE:
-				return SSH_MSG_NONE;
-			case SSH_MSG_IGNORE:
-				break;
-			case SSH_MSG_DEBUG:
-				if ((r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
-					return r;
-				debug("Remote: %.900s", msg);
-				free(msg);
-				break;
-			case SSH_MSG_DISCONNECT:
-				if ((r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
-					return r;
-				error("Received disconnect from %s port %d: "
-				    "%.400s", ssh_remote_ipaddr(ssh),
-				    ssh_remote_port(ssh), msg);
-				free(msg);
-				return SSH_ERR_DISCONNECTED;
-			default:
-				DBG(debug("received packet type %d", *typep));
-				return 0;
-			}
+			debug("Remote: %.900s", msg);
+			free(msg);
+			break;
+		case SSH2_MSG_DISCONNECT:
+			if ((r = sshpkt_get_u32(ssh, &reason)) != 0 ||
+			    (r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
+				return r;
+			/* Ignore normal client exit notifications */
+			do_log2(ssh->state->server_side &&
+			    reason == SSH2_DISCONNECT_BY_APPLICATION ?
+			    SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_ERROR,
+			    "Received disconnect from %s port %d:"
+			    "%u: %.400s", ssh_remote_ipaddr(ssh),
+			    ssh_remote_port(ssh), reason, msg);
+			free(msg);
+			return SSH_ERR_DISCONNECTED;
+		case SSH2_MSG_UNIMPLEMENTED:
+			if ((r = sshpkt_get_u32(ssh, &seqnr)) != 0)
+				return r;
+			debug("Received SSH2_MSG_UNIMPLEMENTED for %u",
+			    seqnr);
+			break;
+		default:
+			return 0;
 		}
 	}
 }
@@ -2078,32 +1782,26 @@
 	va_list args;
 	int r;
 
-	if (compat20 && (ssh->compat & SSH_BUG_DEBUG))
+	if ((ssh->compat & SSH_BUG_DEBUG))
 		return;
 
 	va_start(args, fmt);
 	vsnprintf(buf, sizeof(buf), fmt, args);
 	va_end(args);
 
-	if (compat20) {
-		if ((r = sshpkt_start(ssh, SSH2_MSG_DEBUG)) != 0 ||
-		    (r = sshpkt_put_u8(ssh, 0)) != 0 || /* always display */
-		    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
-		    (r = sshpkt_put_cstring(ssh, "")) != 0 ||
-		    (r = sshpkt_send(ssh)) != 0)
-			fatal("%s: %s", __func__, ssh_err(r));
-	} else {
-		if ((r = sshpkt_start(ssh, SSH_MSG_DEBUG)) != 0 ||
-		    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
-		    (r = sshpkt_send(ssh)) != 0)
-			fatal("%s: %s", __func__, ssh_err(r));
-	}
-	if ((r = ssh_packet_write_wait(ssh)) != 0)
+	debug3("sending debug message: %s", buf);
+
+	if ((r = sshpkt_start(ssh, SSH2_MSG_DEBUG)) != 0 ||
+	    (r = sshpkt_put_u8(ssh, 0)) != 0 || /* always display */
+	    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, "")) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0 ||
+	    (r = ssh_packet_write_wait(ssh)) != 0)
 		fatal("%s: %s", __func__, ssh_err(r));
 }
 
-static void
-fmt_connection_id(struct ssh *ssh, char *s, size_t l)
+void
+sshpkt_fmt_connection_id(struct ssh *ssh, char *s, size_t l)
 {
 	snprintf(s, l, "%.200s%s%s port %d",
 	    ssh->log_preamble ? ssh->log_preamble : "",
@@ -2119,19 +1817,24 @@
 {
 	char remote_id[512];
 
-	fmt_connection_id(ssh, remote_id, sizeof(remote_id));
+	sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
 
 	switch (r) {
 	case SSH_ERR_CONN_CLOSED:
+		ssh_packet_clear_keys(ssh);
 		logdie("Connection closed by %s", remote_id);
 	case SSH_ERR_CONN_TIMEOUT:
+		ssh_packet_clear_keys(ssh);
 		logdie("Connection %s %s timed out",
 		    ssh->state->server_side ? "from" : "to", remote_id);
 	case SSH_ERR_DISCONNECTED:
+		ssh_packet_clear_keys(ssh);
 		logdie("Disconnected from %s", remote_id);
 	case SSH_ERR_SYSTEM_ERROR:
-		if (errno == ECONNRESET)
+		if (errno == ECONNRESET) {
+			ssh_packet_clear_keys(ssh);
 			logdie("Connection reset by %s", remote_id);
+		}
 		/* FALLTHROUGH */
 	case SSH_ERR_NO_CIPHER_ALG_MATCH:
 	case SSH_ERR_NO_MAC_ALG_MATCH:
@@ -2139,12 +1842,14 @@
 	case SSH_ERR_NO_KEX_ALG_MATCH:
 	case SSH_ERR_NO_HOSTKEY_ALG_MATCH:
 		if (ssh && ssh->kex && ssh->kex->failed_choice) {
+			ssh_packet_clear_keys(ssh);
 			logdie("Unable to negotiate with %s: %s. "
 			    "Their offer: %s", remote_id, ssh_err(r),
 			    ssh->kex->failed_choice);
 		}
 		/* FALLTHROUGH */
 	default:
+		ssh_packet_clear_keys(ssh);
 		logdie("%s%sConnection %s %s: %s",
 		    tag != NULL ? tag : "", tag != NULL ? ": " : "",
 		    ssh->state->server_side ? "from" : "to",
@@ -2174,7 +1879,7 @@
 	 * Format the message.  Note that the caller must make sure the
 	 * message is of limited size.
 	 */
-	fmt_connection_id(ssh, remote_id, sizeof(remote_id));
+	sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
 	va_start(args, fmt);
 	vsnprintf(buf, sizeof(buf), fmt, args);
 	va_end(args);
@@ -2257,7 +1962,7 @@
 		for (;;) {
 			if (state->packet_timeout_ms != -1) {
 				ms_to_timeval(&timeout, ms_remain);
-				gettimeofday(&start, NULL);
+				monotime_tv(&start);
 			}
 #ifdef __Fuchsia__
             /* TODO: Just do a wait for writable on the state->connection_out fd */
@@ -2317,7 +2022,7 @@
 ssh_packet_set_tos(struct ssh *ssh, int tos)
 {
 #ifndef IP_TOS_IS_BROKEN
-	if (!ssh_packet_connection_is_on_socket(ssh))
+	if (!ssh_packet_connection_is_on_socket(ssh) || tos == INT_MAX)
 		return;
 	switch (ssh_packet_connection_af(ssh)) {
 # ifdef IP_TOS
@@ -2410,36 +2115,6 @@
 	return ssh->state->max_packet_size;
 }
 
-/*
- * 9.2.  Ignored Data Message
- *
- *   byte      SSH_MSG_IGNORE
- *   string    data
- *
- * All implementations MUST understand (and ignore) this message at any
- * time (after receiving the protocol version). No implementation is
- * required to send them. This message can be used as an additional
- * protection measure against advanced traffic analysis techniques.
- */
-void
-ssh_packet_send_ignore(struct ssh *ssh, int nbytes)
-{
-	u_int32_t rnd = 0;
-	int r, i;
-
-	if ((r = sshpkt_start(ssh, compat20 ?
-	    SSH2_MSG_IGNORE : SSH_MSG_IGNORE)) != 0 ||
-	    (r = sshpkt_put_u32(ssh, nbytes)) != 0)
-		fatal("%s: %s", __func__, ssh_err(r));
-	for (i = 0; i < nbytes; i++) {
-		if (i % 4 == 0)
-			rnd = arc4random();
-		if ((r = sshpkt_put_u8(ssh, (u_char)rnd & 0xff)) != 0)
-			fatal("%s: %s", __func__, ssh_err(r));
-		rnd >>= 8;
-	}
-}
-
 void
 ssh_packet_set_rekey_limits(struct ssh *ssh, u_int64_t bytes, u_int32_t seconds)
 {
@@ -2509,7 +2184,9 @@
 	if ((r = sshbuf_put_string(m, kex->session_id,
 	    kex->session_id_len)) != 0 ||
 	    (r = sshbuf_put_u32(m, kex->we_need)) != 0 ||
+	    (r = sshbuf_put_cstring(m, kex->hostkey_alg)) != 0 ||
 	    (r = sshbuf_put_u32(m, kex->hostkey_type)) != 0 ||
+	    (r = sshbuf_put_u32(m, kex->hostkey_nid)) != 0 ||
 	    (r = sshbuf_put_u32(m, kex->kex_type)) != 0 ||
 	    (r = sshbuf_put_stringb(m, kex->my)) != 0 ||
 	    (r = sshbuf_put_stringb(m, kex->peer)) != 0 ||
@@ -2543,9 +2220,7 @@
 		return r;
 	if ((b = sshbuf_new()) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
-	/* The cipher struct is constant and shared, you export pointer */
 	if ((r = sshbuf_put_cstring(b, enc->name)) != 0 ||
-	    (r = sshbuf_put(b, &enc->cipher, sizeof(enc->cipher))) != 0 ||
 	    (r = sshbuf_put_u32(b, enc->enabled)) != 0 ||
 	    (r = sshbuf_put_u32(b, enc->block_size)) != 0 ||
 	    (r = sshbuf_put_string(b, enc->key, enc->key_len)) != 0 ||
@@ -2571,54 +2246,22 @@
 ssh_packet_get_state(struct ssh *ssh, struct sshbuf *m)
 {
 	struct session_state *state = ssh->state;
-	u_char *p;
-	size_t slen, rlen;
-	int r, ssh1cipher;
+	int r;
 
-	if (!compat20) {
-		ssh1cipher = cipher_ctx_get_number(state->receive_context);
-		slen = cipher_get_keyiv_len(state->send_context);
-		rlen = cipher_get_keyiv_len(state->receive_context);
-		if ((r = sshbuf_put_u32(m, state->remote_protocol_flags)) != 0 ||
-		    (r = sshbuf_put_u32(m, ssh1cipher)) != 0 ||
-		    (r = sshbuf_put_string(m, state->ssh1_key, state->ssh1_keylen)) != 0 ||
-		    (r = sshbuf_put_u32(m, slen)) != 0 ||
-		    (r = sshbuf_reserve(m, slen, &p)) != 0 ||
-		    (r = cipher_get_keyiv(state->send_context, p, slen)) != 0 ||
-		    (r = sshbuf_put_u32(m, rlen)) != 0 ||
-		    (r = sshbuf_reserve(m, rlen, &p)) != 0 ||
-		    (r = cipher_get_keyiv(state->receive_context, p, rlen)) != 0)
-			return r;
-	} else {
-		if ((r = kex_to_blob(m, ssh->kex)) != 0 ||
-		    (r = newkeys_to_blob(m, ssh, MODE_OUT)) != 0 ||
-		    (r = newkeys_to_blob(m, ssh, MODE_IN)) != 0 ||
-		    (r = sshbuf_put_u64(m, state->rekey_limit)) != 0 ||
-		    (r = sshbuf_put_u32(m, state->rekey_interval)) != 0 ||
-		    (r = sshbuf_put_u32(m, state->p_send.seqnr)) != 0 ||
-		    (r = sshbuf_put_u64(m, state->p_send.blocks)) != 0 ||
-		    (r = sshbuf_put_u32(m, state->p_send.packets)) != 0 ||
-		    (r = sshbuf_put_u64(m, state->p_send.bytes)) != 0 ||
-		    (r = sshbuf_put_u32(m, state->p_read.seqnr)) != 0 ||
-		    (r = sshbuf_put_u64(m, state->p_read.blocks)) != 0 ||
-		    (r = sshbuf_put_u32(m, state->p_read.packets)) != 0 ||
-		    (r = sshbuf_put_u64(m, state->p_read.bytes)) != 0)
-			return r;
-	}
-
-	slen = cipher_get_keycontext(state->send_context, NULL);
-	rlen = cipher_get_keycontext(state->receive_context, NULL);
-	if ((r = sshbuf_put_u32(m, slen)) != 0 ||
-	    (r = sshbuf_reserve(m, slen, &p)) != 0)
-		return r;
-	if (cipher_get_keycontext(state->send_context, p) != (int)slen)
-		return SSH_ERR_INTERNAL_ERROR;
-	if ((r = sshbuf_put_u32(m, rlen)) != 0 ||
-	    (r = sshbuf_reserve(m, rlen, &p)) != 0)
-		return r;
-	if (cipher_get_keycontext(state->receive_context, p) != (int)rlen)
-		return SSH_ERR_INTERNAL_ERROR;
-	if ((r = sshbuf_put_stringb(m, state->input)) != 0 ||
+	if ((r = kex_to_blob(m, ssh->kex)) != 0 ||
+	    (r = newkeys_to_blob(m, ssh, MODE_OUT)) != 0 ||
+	    (r = newkeys_to_blob(m, ssh, MODE_IN)) != 0 ||
+	    (r = sshbuf_put_u64(m, state->rekey_limit)) != 0 ||
+	    (r = sshbuf_put_u32(m, state->rekey_interval)) != 0 ||
+	    (r = sshbuf_put_u32(m, state->p_send.seqnr)) != 0 ||
+	    (r = sshbuf_put_u64(m, state->p_send.blocks)) != 0 ||
+	    (r = sshbuf_put_u32(m, state->p_send.packets)) != 0 ||
+	    (r = sshbuf_put_u64(m, state->p_send.bytes)) != 0 ||
+	    (r = sshbuf_put_u32(m, state->p_read.seqnr)) != 0 ||
+	    (r = sshbuf_put_u64(m, state->p_read.blocks)) != 0 ||
+	    (r = sshbuf_put_u32(m, state->p_read.packets)) != 0 ||
+	    (r = sshbuf_put_u64(m, state->p_read.bytes)) != 0 ||
+	    (r = sshbuf_put_stringb(m, state->input)) != 0 ||
 	    (r = sshbuf_put_stringb(m, state->output)) != 0)
 		return r;
 
@@ -2651,12 +2294,15 @@
 	comp = &newkey->comp;
 
 	if ((r = sshbuf_get_cstring(b, &enc->name, NULL)) != 0 ||
-	    (r = sshbuf_get(b, &enc->cipher, sizeof(enc->cipher))) != 0 ||
 	    (r = sshbuf_get_u32(b, (u_int *)&enc->enabled)) != 0 ||
 	    (r = sshbuf_get_u32(b, &enc->block_size)) != 0 ||
 	    (r = sshbuf_get_string(b, &enc->key, &keylen)) != 0 ||
 	    (r = sshbuf_get_string(b, &enc->iv, &ivlen)) != 0)
 		goto out;
+	if ((enc->cipher = cipher_by_name(enc->name)) == NULL) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
 	if (cipher_authlen(enc->cipher) == 0) {
 		if ((r = sshbuf_get_cstring(b, &mac->name, NULL)) != 0)
 			goto out;
@@ -2674,11 +2320,6 @@
 	if ((r = sshbuf_get_u32(b, &comp->type)) != 0 ||
 	    (r = sshbuf_get_cstring(b, &comp->name, NULL)) != 0)
 		goto out;
-	if (enc->name == NULL ||
-	    cipher_by_name(enc->name) != enc->cipher) {
-		r = SSH_ERR_INVALID_FORMAT;
-		goto out;
-	}
 	if (sshbuf_len(b) != 0) {
 		r = SSH_ERR_INVALID_FORMAT;
 		goto out;
@@ -2709,7 +2350,9 @@
 	}
 	if ((r = sshbuf_get_string(m, &kex->session_id, &kex->session_id_len)) != 0 ||
 	    (r = sshbuf_get_u32(m, &kex->we_need)) != 0 ||
+	    (r = sshbuf_get_cstring(m, &kex->hostkey_alg, NULL)) != 0 ||
 	    (r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_type)) != 0 ||
+	    (r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_nid)) != 0 ||
 	    (r = sshbuf_get_u32(m, &kex->kex_type)) != 0 ||
 	    (r = sshbuf_get_stringb(m, kex->my)) != 0 ||
 	    (r = sshbuf_get_stringb(m, kex->peer)) != 0 ||
@@ -2743,61 +2386,33 @@
 ssh_packet_set_state(struct ssh *ssh, struct sshbuf *m)
 {
 	struct session_state *state = ssh->state;
-	const u_char *ssh1key, *ivin, *ivout, *keyin, *keyout, *input, *output;
-	size_t ssh1keylen, rlen, slen, ilen, olen;
+	const u_char *input, *output;
+	size_t ilen, olen;
 	int r;
-	u_int ssh1cipher = 0;
 
-	if (!compat20) {
-		if ((r = sshbuf_get_u32(m, &state->remote_protocol_flags)) != 0 ||
-		    (r = sshbuf_get_u32(m, &ssh1cipher)) != 0 ||
-		    (r = sshbuf_get_string_direct(m, &ssh1key, &ssh1keylen)) != 0 ||
-		    (r = sshbuf_get_string_direct(m, &ivout, &slen)) != 0 ||
-		    (r = sshbuf_get_string_direct(m, &ivin, &rlen)) != 0)
-			return r;
-		if (ssh1cipher > INT_MAX)
-			return SSH_ERR_KEY_UNKNOWN_CIPHER;
-		ssh_packet_set_encryption_key(ssh, ssh1key, ssh1keylen,
-		    (int)ssh1cipher);
-		if (cipher_get_keyiv_len(state->send_context) != (int)slen ||
-		    cipher_get_keyiv_len(state->receive_context) != (int)rlen)
-			return SSH_ERR_INVALID_FORMAT;
-		if ((r = cipher_set_keyiv(state->send_context, ivout)) != 0 ||
-		    (r = cipher_set_keyiv(state->receive_context, ivin)) != 0)
-			return r;
-	} else {
-		if ((r = kex_from_blob(m, &ssh->kex)) != 0 ||
-		    (r = newkeys_from_blob(m, ssh, MODE_OUT)) != 0 ||
-		    (r = newkeys_from_blob(m, ssh, MODE_IN)) != 0 ||
-		    (r = sshbuf_get_u64(m, &state->rekey_limit)) != 0 ||
-		    (r = sshbuf_get_u32(m, &state->rekey_interval)) != 0 ||
-		    (r = sshbuf_get_u32(m, &state->p_send.seqnr)) != 0 ||
-		    (r = sshbuf_get_u64(m, &state->p_send.blocks)) != 0 ||
-		    (r = sshbuf_get_u32(m, &state->p_send.packets)) != 0 ||
-		    (r = sshbuf_get_u64(m, &state->p_send.bytes)) != 0 ||
-		    (r = sshbuf_get_u32(m, &state->p_read.seqnr)) != 0 ||
-		    (r = sshbuf_get_u64(m, &state->p_read.blocks)) != 0 ||
-		    (r = sshbuf_get_u32(m, &state->p_read.packets)) != 0 ||
-		    (r = sshbuf_get_u64(m, &state->p_read.bytes)) != 0)
-			return r;
-		/*
-		 * We set the time here so that in post-auth privsep slave we
-		 * count from the completion of the authentication.
-		 */
-		state->rekey_time = monotime();
-		/* XXX ssh_set_newkeys overrides p_read.packets? XXX */
-		if ((r = ssh_set_newkeys(ssh, MODE_IN)) != 0 ||
-		    (r = ssh_set_newkeys(ssh, MODE_OUT)) != 0)
-			return r;
-	}
-	if ((r = sshbuf_get_string_direct(m, &keyout, &slen)) != 0 ||
-	    (r = sshbuf_get_string_direct(m, &keyin, &rlen)) != 0)
+	if ((r = kex_from_blob(m, &ssh->kex)) != 0 ||
+	    (r = newkeys_from_blob(m, ssh, MODE_OUT)) != 0 ||
+	    (r = newkeys_from_blob(m, ssh, MODE_IN)) != 0 ||
+	    (r = sshbuf_get_u64(m, &state->rekey_limit)) != 0 ||
+	    (r = sshbuf_get_u32(m, &state->rekey_interval)) != 0 ||
+	    (r = sshbuf_get_u32(m, &state->p_send.seqnr)) != 0 ||
+	    (r = sshbuf_get_u64(m, &state->p_send.blocks)) != 0 ||
+	    (r = sshbuf_get_u32(m, &state->p_send.packets)) != 0 ||
+	    (r = sshbuf_get_u64(m, &state->p_send.bytes)) != 0 ||
+	    (r = sshbuf_get_u32(m, &state->p_read.seqnr)) != 0 ||
+	    (r = sshbuf_get_u64(m, &state->p_read.blocks)) != 0 ||
+	    (r = sshbuf_get_u32(m, &state->p_read.packets)) != 0 ||
+	    (r = sshbuf_get_u64(m, &state->p_read.bytes)) != 0)
 		return r;
-	if (cipher_get_keycontext(state->send_context, NULL) != (int)slen ||
-	    cipher_get_keycontext(state->receive_context, NULL) != (int)rlen)
-		return SSH_ERR_INVALID_FORMAT;
-	cipher_set_keycontext(state->send_context, keyout);
-	cipher_set_keycontext(state->receive_context, keyin);
+	/*
+	 * We set the time here so that in post-auth privsep slave we
+	 * count from the completion of the authentication.
+	 */
+	state->rekey_time = monotime();
+	/* XXX ssh_set_newkeys overrides p_read.packets? XXX */
+	if ((r = ssh_set_newkeys(ssh, MODE_IN)) != 0 ||
+	    (r = ssh_set_newkeys(ssh, MODE_OUT)) != 0)
+		return r;
 
 	if ((r = ssh_packet_set_postauth(ssh)) != 0)
 		return r;
@@ -2877,13 +2492,6 @@
 }
 #endif /* OPENSSL_HAS_ECC */
 
-#ifdef WITH_SSH1
-int
-sshpkt_put_bignum1(struct ssh *ssh, const BIGNUM *v)
-{
-	return sshbuf_put_bignum1(ssh->state->outgoing_packet, v);
-}
-#endif /* WITH_SSH1 */
 
 int
 sshpkt_put_bignum2(struct ssh *ssh, const BIGNUM *v)
@@ -2931,6 +2539,12 @@
 }
 
 int
+sshpkt_peek_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp)
+{
+	return sshbuf_peek_string_direct(ssh->state->incoming_packet, valp, lenp);
+}
+
+int
 sshpkt_get_cstring(struct ssh *ssh, char **valp, size_t *lenp)
 {
 	return sshbuf_get_cstring(ssh->state->incoming_packet, valp, lenp);
@@ -2945,13 +2559,6 @@
 }
 #endif /* OPENSSL_HAS_ECC */
 
-#ifdef WITH_SSH1
-int
-sshpkt_get_bignum1(struct ssh *ssh, BIGNUM *v)
-{
-	return sshbuf_get_bignum1(ssh->state->incoming_packet, v);
-}
-#endif /* WITH_SSH1 */
 
 int
 sshpkt_get_bignum2(struct ssh *ssh, BIGNUM *v)
@@ -2981,15 +2588,13 @@
 int
 sshpkt_start(struct ssh *ssh, u_char type)
 {
-	u_char buf[9];
-	int len;
+	u_char buf[6]; /* u32 packet length, u8 pad len, u8 type */
 
 	DBG(debug("packet_start[%d]", type));
-	len = compat20 ? 6 : 9;
-	memset(buf, 0, len - 1);
-	buf[len - 1] = type;
+	memset(buf, 0, sizeof(buf));
+	buf[sizeof(buf) - 1] = type;
 	sshbuf_reset(ssh->state->outgoing_packet);
-	return sshbuf_put(ssh->state->outgoing_packet, buf, len);
+	return sshbuf_put(ssh->state->outgoing_packet, buf, sizeof(buf));
 }
 
 static int
@@ -3022,6 +2627,37 @@
 	return 0;
 }
 
+/*
+ * 9.2.  Ignored Data Message
+ *
+ *   byte      SSH_MSG_IGNORE
+ *   string    data
+ *
+ * All implementations MUST understand (and ignore) this message at any
+ * time (after receiving the protocol version). No implementation is
+ * required to send them. This message can be used as an additional
+ * protection measure against advanced traffic analysis techniques.
+ */
+int
+sshpkt_msg_ignore(struct ssh *ssh, u_int nbytes)
+{
+	u_int32_t rnd = 0;
+	int r;
+	u_int i;
+
+	if ((r = sshpkt_start(ssh, SSH2_MSG_IGNORE)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, nbytes)) != 0)
+		return r;
+	for (i = 0; i < nbytes; i++) {
+		if (i % 4 == 0)
+			rnd = arc4random();
+		if ((r = sshpkt_put_u8(ssh, (u_char)rnd & 0xff)) != 0)
+			return r;
+		rnd >>= 8;
+	}
+	return 0;
+}
+
 /* send it */
 
 int
@@ -3029,10 +2665,7 @@
 {
 	if (ssh->state && ssh->state->mux)
 		return ssh_packet_send_mux(ssh);
-	if (compat20)
-		return ssh_packet_send2(ssh);
-	else
-		return ssh_packet_send1(ssh);
+	return ssh_packet_send2(ssh);
 }
 
 int
@@ -3046,19 +2679,12 @@
 	vsnprintf(buf, sizeof(buf), fmt, args);
 	va_end(args);
 
-	if (compat20) {
-		if ((r = sshpkt_start(ssh, SSH2_MSG_DISCONNECT)) != 0 ||
-		    (r = sshpkt_put_u32(ssh, SSH2_DISCONNECT_PROTOCOL_ERROR)) != 0 ||
-		    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
-		    (r = sshpkt_put_cstring(ssh, "")) != 0 ||
-		    (r = sshpkt_send(ssh)) != 0)
-			return r;
-	} else {
-		if ((r = sshpkt_start(ssh, SSH_MSG_DISCONNECT)) != 0 ||
-		    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
-		    (r = sshpkt_send(ssh)) != 0)
-			return r;
-	}
+	if ((r = sshpkt_start(ssh, SSH2_MSG_DISCONNECT)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, SSH2_DISCONNECT_PROTOCOL_ERROR)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, "")) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		return r;
 	return 0;
 }
 
diff --git a/packet.h b/packet.h
index 0d25b35..170203c 100644
--- a/packet.h
+++ b/packet.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.h,v 1.76 2017/02/03 23:03:33 djm Exp $ */
+/* $OpenBSD: packet.h,v 1.86 2018/07/09 21:20:26 markus Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -61,6 +61,7 @@
 	int remote_port;
 	char *local_ipaddr;
 	int local_port;
+	char *rdomain_in;
 
 	/* Optional preamble for log messages (e.g. username) */
 	char *log_preamble;
@@ -77,6 +78,12 @@
 	TAILQ_HEAD(, key_entry) private_keys;
 	TAILQ_HEAD(, key_entry) public_keys;
 
+	/* Client/Server authentication context */
+	void *authctxt;
+
+	/* Channels context */
+	struct ssh_channels *chanctxt;
+
 	/* APP data */
 	void *app_data;
 };
@@ -93,13 +100,13 @@
 int      ssh_packet_get_connection_in(struct ssh *);
 int      ssh_packet_get_connection_out(struct ssh *);
 void     ssh_packet_close(struct ssh *);
-void	 ssh_packet_set_encryption_key(struct ssh *, const u_char *, u_int, int);
 void	 ssh_packet_set_input_hook(struct ssh *, ssh_packet_hook_fn *, void *);
+void	 ssh_packet_clear_keys(struct ssh *);
+void	 ssh_clear_newkeys(struct ssh *, int);
 
 int	 ssh_packet_is_rekeying(struct ssh *);
 void     ssh_packet_set_protocol_flags(struct ssh *, u_int);
 u_int	 ssh_packet_get_protocol_flags(struct ssh *);
-int      ssh_packet_start_compression(struct ssh *, int);
 void	 ssh_packet_set_tos(struct ssh *, int);
 void     ssh_packet_set_interactive(struct ssh *, int, int, int);
 int      ssh_packet_is_interactive(struct ssh *);
@@ -112,14 +119,12 @@
 
 int	 ssh_packet_log_type(u_char);
 
-int	 ssh_packet_send1(struct ssh *);
 int	 ssh_packet_send2_wrapped(struct ssh *);
 int	 ssh_packet_send2(struct ssh *);
 
 int      ssh_packet_read(struct ssh *);
 int	 ssh_packet_read_expect(struct ssh *, u_int type);
 int      ssh_packet_read_poll(struct ssh *);
-int ssh_packet_read_poll1(struct ssh *, u_char *);
 int ssh_packet_read_poll2(struct ssh *, u_char *, u_int32_t *seqnr_p);
 int	 ssh_packet_process_incoming(struct ssh *, const char *buf, u_int len);
 int      ssh_packet_read_seqnr(struct ssh *, u_char *, u_int32_t *seqnr_p);
@@ -141,10 +146,9 @@
 
 int	 ssh_packet_connection_is_on_socket(struct ssh *);
 int	 ssh_packet_remaining(struct ssh *);
-void	 ssh_packet_send_ignore(struct ssh *, int);
 
-void	 tty_make_modes(int, struct termios *);
-void	 tty_parse_modes(int, int *);
+void	 ssh_tty_make_modes(struct ssh *, int, struct termios *);
+void	 ssh_tty_parse_modes(struct ssh *, int);
 
 void	 ssh_packet_set_alive_timeouts(struct ssh *, int);
 int	 ssh_packet_inc_alive_timeouts(struct ssh *);
@@ -158,6 +162,7 @@
 int	 ssh_remote_port(struct ssh *);
 const char *ssh_local_ipaddr(struct ssh *);
 int	 ssh_local_port(struct ssh *);
+const char *ssh_packet_rdomain_in(struct ssh *);
 
 void	 ssh_packet_set_rekey_limits(struct ssh *, u_int64_t, u_int32_t);
 time_t	 ssh_packet_get_rekey_timeout(struct ssh *);
@@ -172,6 +177,7 @@
 	    __attribute__((format(printf, 2, 3)));
 int	sshpkt_add_padding(struct ssh *, u_char);
 void	sshpkt_fatal(struct ssh *ssh, const char *tag, int r);
+int	sshpkt_msg_ignore(struct ssh *, u_int);
 
 int	sshpkt_put(struct ssh *ssh, const void *v, size_t len);
 int	sshpkt_putb(struct ssh *ssh, const struct sshbuf *b);
@@ -182,7 +188,6 @@
 int	sshpkt_put_cstring(struct ssh *ssh, const void *v);
 int	sshpkt_put_stringb(struct ssh *ssh, const struct sshbuf *v);
 int	sshpkt_put_ec(struct ssh *ssh, const EC_POINT *v, const EC_GROUP *g);
-int	sshpkt_put_bignum1(struct ssh *ssh, const BIGNUM *v);
 int	sshpkt_put_bignum2(struct ssh *ssh, const BIGNUM *v);
 
 int	sshpkt_get(struct ssh *ssh, void *valp, size_t len);
@@ -191,11 +196,12 @@
 int	sshpkt_get_u64(struct ssh *ssh, u_int64_t *valp);
 int	sshpkt_get_string(struct ssh *ssh, u_char **valp, size_t *lenp);
 int	sshpkt_get_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp);
+int	sshpkt_peek_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp);
 int	sshpkt_get_cstring(struct ssh *ssh, char **valp, size_t *lenp);
 int	sshpkt_get_ec(struct ssh *ssh, EC_POINT *v, const EC_GROUP *g);
-int	sshpkt_get_bignum1(struct ssh *ssh, BIGNUM *v);
 int	sshpkt_get_bignum2(struct ssh *ssh, BIGNUM *v);
 int	sshpkt_get_end(struct ssh *ssh);
+void	sshpkt_fmt_connection_id(struct ssh *ssh, char *s, size_t l);
 const u_char	*sshpkt_ptr(struct ssh *, size_t *lenp);
 
 /* OLD API */
diff --git a/pathnames.h b/pathnames.h
index a8deb9f..cb44caa 100644
--- a/pathnames.h
+++ b/pathnames.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pathnames.h,v 1.25 2016/03/31 05:24:06 dtucker Exp $ */
+/* $OpenBSD: pathnames.h,v 1.28 2018/02/23 15:58:37 markus Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -36,10 +36,10 @@
  */
 #define _PATH_SERVER_CONFIG_FILE	SSHDIR "/sshd_config"
 #define _PATH_HOST_CONFIG_FILE		SSHDIR "/ssh_config"
-#define _PATH_HOST_KEY_FILE		SSHDIR "/ssh_host_key"
 #define _PATH_HOST_DSA_KEY_FILE		SSHDIR "/ssh_host_dsa_key"
 #define _PATH_HOST_ECDSA_KEY_FILE	SSHDIR "/ssh_host_ecdsa_key"
 #define _PATH_HOST_ED25519_KEY_FILE	SSHDIR "/ssh_host_ed25519_key"
+#define _PATH_HOST_XMSS_KEY_FILE	SSHDIR "/ssh_host_xmss_key"
 #define _PATH_HOST_RSA_KEY_FILE		SSHDIR "/ssh_host_rsa_key"
 #define _PATH_DH_MODULI			SSHDIR "/moduli"
 
@@ -72,11 +72,11 @@
  * Name of the default file containing client-side authentication key. This
  * file should only be readable by the user him/herself.
  */
-#define _PATH_SSH_CLIENT_IDENTITY	_PATH_SSH_USER_DIR "/identity"
 #define _PATH_SSH_CLIENT_ID_DSA		_PATH_SSH_USER_DIR "/id_dsa"
 #define _PATH_SSH_CLIENT_ID_ECDSA	_PATH_SSH_USER_DIR "/id_ecdsa"
 #define _PATH_SSH_CLIENT_ID_RSA		_PATH_SSH_USER_DIR "/id_rsa"
 #define _PATH_SSH_CLIENT_ID_ED25519	_PATH_SSH_USER_DIR "/id_ed25519"
+#define _PATH_SSH_CLIENT_ID_XMSS	_PATH_SSH_USER_DIR "/id_xmss"
 
 /*
  * Configuration file in user's home directory.  This file need not be
diff --git a/openbsd-compat/port-tun.h b/platform-misc.c
similarity index 62%
copy from openbsd-compat/port-tun.h
copy to platform-misc.c
index c53df01..3f39670 100644
--- a/openbsd-compat/port-tun.h
+++ b/platform-misc.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 Reyk Floeter <reyk@openbsd.org>
+ * Copyright (c) 2006 Darren Tucker.  All rights reserved.
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -14,20 +14,22 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#ifndef _PORT_TUN_H
-#define _PORT_TUN_H
+#include "includes.h"
 
-struct Channel;
+#include "openbsd-compat/openbsd-compat.h"
 
-#if defined(SSH_TUN_LINUX) || defined(SSH_TUN_FREEBSD)
-# define CUSTOM_SYS_TUN_OPEN
-int	  sys_tun_open(int, int);
+/*
+ * return 1 if the specified uid is a uid that may own a system directory
+ * otherwise 0.
+ */
+int
+platform_sys_dir_uid(uid_t uid)
+{
+	if (uid == 0)
+		return 1;
+#ifdef PLATFORM_SYS_DIR_UID
+	if (uid == PLATFORM_SYS_DIR_UID)
+		return 1;
 #endif
-
-#if defined(SSH_TUN_COMPAT_AF) || defined(SSH_TUN_PREPEND_AF)
-# define SSH_TUN_FILTER
-int	 sys_tun_infilter(struct Channel *, char *, int);
-u_char	*sys_tun_outfilter(struct Channel *, u_char **, u_int *);
-#endif
-
-#endif
+	return 0;
+}
diff --git a/platform.c b/platform.c
index 973a63e..41acc93 100644
--- a/platform.c
+++ b/platform.c
@@ -20,10 +20,9 @@
 #include <unistd.h>
 
 #include "log.h"
-#include "buffer.h"
 #include "misc.h"
 #include "servconf.h"
-#include "key.h"
+#include "sshkey.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "auth-pam.h"
@@ -197,19 +196,3 @@
 	return NULL;
 #endif
 }
-
-/*
- * return 1 if the specified uid is a uid that may own a system directory
- * otherwise 0.
- */
-int
-platform_sys_dir_uid(uid_t uid)
-{
-	if (uid == 0)
-		return 1;
-#ifdef PLATFORM_SYS_DIR_UID
-	if (uid == PLATFORM_SYS_DIR_UID)
-		return 1;
-#endif
-	return 0;
-}
diff --git a/readconf.c b/readconf.c
index e51481b..db5f2d5 100644
--- a/readconf.c
+++ b/readconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: readconf.c,v 1.268 2017/02/03 23:01:19 djm Exp $ */
+/* $OpenBSD: readconf.c,v 1.297 2018/08/12 20:19:13 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -53,6 +53,7 @@
 
 #include "xmalloc.h"
 #include "ssh.h"
+#include "ssherr.h"
 #include "compat.h"
 #include "cipher.h"
 #include "pathnames.h"
@@ -152,18 +153,19 @@
 	oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,
 	oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,
 	oCompressionLevel, oTCPKeepAlive, oNumberOfPasswordPrompts,
-	oUsePrivilegedPort, oLogLevel, oCiphers, oProtocol, oMacs,
+	oUsePrivilegedPort, oLogFacility, oLogLevel, oCiphers, oMacs,
 	oPubkeyAuthentication,
 	oKbdInteractiveAuthentication, oKbdInteractiveDevices, oHostKeyAlias,
 	oDynamicForward, oPreferredAuthentications, oHostbasedAuthentication,
-	oHostKeyAlgorithms, oBindAddress, oPKCS11Provider,
+	oHostKeyAlgorithms, oBindAddress, oBindInterface, oPKCS11Provider,
 	oClearAllForwardings, oNoHostAuthenticationForLocalhost,
 	oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout,
 	oAddressFamily, oGssAuthentication, oGssDelegateCreds,
 	oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly,
-	oSendEnv, oControlPath, oControlMaster, oControlPersist,
+	oSendEnv, oSetEnv, oControlPath, oControlMaster, oControlPersist,
 	oHashKnownHosts,
-	oTunnel, oTunnelDevice, oLocalCommand, oPermitLocalCommand,
+	oTunnel, oTunnelDevice,
+	oLocalCommand, oPermitLocalCommand, oRemoteCommand,
 	oVisualHostKey,
 	oKexAlgorithms, oIPQoS, oRequestTTY, oIgnoreUnknown, oProxyUseFdpass,
 	oCanonicalDomains, oCanonicalizeHostname, oCanonicalizeMaxDots,
@@ -171,7 +173,7 @@
 	oStreamLocalBindMask, oStreamLocalBindUnlink, oRevokedHostKeys,
 	oFingerprintHash, oUpdateHostkeys, oHostbasedKeyTypes,
 	oPubkeyAcceptedKeyTypes, oProxyJump,
-	oIgnoredUnknownOption, oDeprecated, oUnsupported
+	oIgnore, oIgnoredUnknownOption, oDeprecated, oUnsupported
 } OpCodes;
 
 /* Textual representations of the tokens. */
@@ -181,12 +183,15 @@
 	OpCodes opcode;
 } keywords[] = {
 	/* Deprecated options */
+	{ "protocol", oIgnore }, /* NB. silently ignored */
+	{ "cipher", oDeprecated },
 	{ "fallbacktorsh", oDeprecated },
 	{ "globalknownhostsfile2", oDeprecated },
 	{ "rhostsauthentication", oDeprecated },
 	{ "userknownhostsfile2", oDeprecated },
 	{ "useroaming", oDeprecated },
 	{ "usersh", oDeprecated },
+	{ "useprivilegedport", oDeprecated },
 
 	/* Unsupported options */
 	{ "afstokenpassing", oUnsupported },
@@ -208,15 +213,9 @@
 	{ "smartcarddevice", oUnsupported },
 	{ "pkcs11provider", oUnsupported },
 #endif
-#ifdef WITH_SSH1
-	{ "rsaauthentication", oRSAAuthentication },
-	{ "rhostsrsaauthentication", oRhostsRSAAuthentication },
-	{ "compressionlevel", oCompressionLevel },
-# else
 	{ "rsaauthentication", oUnsupported },
 	{ "rhostsrsaauthentication", oUnsupported },
 	{ "compressionlevel", oUnsupported },
-#endif
 
 	{ "forwardagent", oForwardAgent },
 	{ "forwardx11", oForwardX11 },
@@ -225,7 +224,6 @@
 	{ "exitonforwardfailure", oExitOnForwardFailure },
 	{ "xauthlocation", oXAuthLocation },
 	{ "gatewayports", oGatewayPorts },
-	{ "useprivilegedport", oUsePrivilegedPort },
 	{ "passwordauthentication", oPasswordAuthentication },
 	{ "kbdinteractiveauthentication", oKbdInteractiveAuthentication },
 	{ "kbdinteractivedevices", oKbdInteractiveDevices },
@@ -233,7 +231,7 @@
 	{ "dsaauthentication", oPubkeyAuthentication },		    /* alias */
 	{ "hostbasedauthentication", oHostbasedAuthentication },
 	{ "challengeresponseauthentication", oChallengeResponseAuthentication },
-	{ "skeyauthentication", oChallengeResponseAuthentication }, /* alias */
+	{ "skeyauthentication", oUnsupported },
 	{ "tisauthentication", oChallengeResponseAuthentication },  /* alias */
 	{ "identityfile", oIdentityFile },
 	{ "identityfile2", oIdentityFile },			/* obsolete */
@@ -245,10 +243,8 @@
 	{ "hostkeyalias", oHostKeyAlias },
 	{ "proxycommand", oProxyCommand },
 	{ "port", oPort },
-	{ "cipher", oCipher },
 	{ "ciphers", oCiphers },
 	{ "macs", oMacs },
-	{ "protocol", oProtocol },
 	{ "remoteforward", oRemoteForward },
 	{ "localforward", oLocalForward },
 	{ "user", oUser },
@@ -265,11 +261,13 @@
 	{ "tcpkeepalive", oTCPKeepAlive },
 	{ "keepalive", oTCPKeepAlive },				/* obsolete */
 	{ "numberofpasswordprompts", oNumberOfPasswordPrompts },
+	{ "syslogfacility", oLogFacility },
 	{ "loglevel", oLogLevel },
 	{ "dynamicforward", oDynamicForward },
 	{ "preferredauthentications", oPreferredAuthentications },
 	{ "hostkeyalgorithms", oHostKeyAlgorithms },
 	{ "bindaddress", oBindAddress },
+	{ "bindinterface", oBindInterface },
 	{ "clearallforwardings", oClearAllForwardings },
 	{ "enablesshkeysign", oEnableSSHKeysign },
 	{ "verifyhostkeydns", oVerifyHostKeyDNS },
@@ -280,6 +278,7 @@
 	{ "serveraliveinterval", oServerAliveInterval },
 	{ "serveralivecountmax", oServerAliveCountMax },
 	{ "sendenv", oSendEnv },
+	{ "setenv", oSetEnv },
 	{ "controlpath", oControlPath },
 	{ "controlmaster", oControlMaster },
 	{ "controlpersist", oControlPersist },
@@ -289,6 +288,7 @@
 	{ "tunneldevice", oTunnelDevice },
 	{ "localcommand", oLocalCommand },
 	{ "permitlocalcommand", oPermitLocalCommand },
+	{ "remotecommand", oRemoteCommand },
 	{ "visualhostkey", oVisualHostKey },
 	{ "kexalgorithms", oKexAlgorithms },
 	{ "ipqos", oIPQoS },
@@ -321,12 +321,8 @@
 add_local_forward(Options *options, const struct Forward *newfwd)
 {
 	struct Forward *fwd;
-	extern uid_t original_real_uid;
 	int i;
 
-	if (!bind_permitted(newfwd->listen_port, original_real_uid) &&
-	    newfwd->listen_path == NULL)
-		fatal("Privileged ports can only be forwarded by root.");
 	/* Don't add duplicates */
 	for (i = 0; i < options->num_local_forwards; i++) {
 		if (forward_equals(newfwd, options->local_forwards + i))
@@ -443,8 +439,8 @@
 
 	if (dir == NULL) /* no dir, filename is absolute */
 		path = xstrdup(filename);
-	else
-		(void)xasprintf(&path, "%.100s%.100s", dir, filename);
+	else if (xasprintf(&path, "%s%s", dir, filename) >= PATH_MAX)
+		fatal("Identity file path %s too long", path);
 
 	/* Avoid registering duplicates */
 	for (i = 0; i < options->num_identity_files; i++) {
@@ -484,7 +480,6 @@
 	char *shell;
 	pid_t pid;
 	int devnull, status;
-	extern uid_t original_real_uid;
 
 	if ((shell = getenv("SHELL")) == NULL)
 		shell = _PATH_BSHELL;
@@ -499,9 +494,6 @@
 	if ((pid = fork()) == 0) {
 		char *argv[4];
 
-		/* Child.  Permanently give up superuser privileges. */
-		permanently_drop_suid(original_real_uid);
-
 		/* Redirect child stdin and stdout. Leave stderr */
 		if (dup2(devnull, STDIN_FILENO) == -1)
 			fatal("dup2: %s", strerror(errno));
@@ -553,6 +545,7 @@
 	const char *ruser;
 	int r, port, this_result, result = 1, attributes = 0, negate;
 	char thishost[NI_MAXHOST], shorthost[NI_MAXHOST], portstr[NI_MAXSERV];
+	char uidstr[32];
 
 	/*
 	 * Configuration is likely to be incomplete at this point so we
@@ -633,6 +626,8 @@
 			strlcpy(shorthost, thishost, sizeof(shorthost));
 			shorthost[strcspn(thishost, ".")] = '\0';
 			snprintf(portstr, sizeof(portstr), "%d", port);
+			snprintf(uidstr, sizeof(uidstr), "%llu",
+			    (unsigned long long)pw->pw_uid);
 
 			cmd = percent_expand(arg,
 			    "L", shorthost,
@@ -643,6 +638,7 @@
 			    "p", portstr,
 			    "r", ruser,
 			    "u", pw->pw_name,
+			    "i", uidstr,
 			    (char *)NULL);
 			if (result != 1) {
 				/* skip execution if prior predicate failed */
@@ -686,32 +682,33 @@
 	return result;
 }
 
-/* Check and prepare a domain name: removes trailing '.' and lowercases */
+/* Remove environment variable by pattern */
 static void
-valid_domain(char *name, const char *filename, int linenum)
+rm_env(Options *options, const char *arg, const char *filename, int linenum)
 {
-	size_t i, l = strlen(name);
-	u_char c, last = '\0';
+	int i, j;
+	char *cp;
 
-	if (l == 0)
-		fatal("%s line %d: empty hostname suffix", filename, linenum);
-	if (!isalpha((u_char)name[0]) && !isdigit((u_char)name[0]))
-		fatal("%s line %d: hostname suffix \"%.100s\" "
-		    "starts with invalid character", filename, linenum, name);
-	for (i = 0; i < l; i++) {
-		c = tolower((u_char)name[i]);
-		name[i] = (char)c;
-		if (last == '.' && c == '.')
-			fatal("%s line %d: hostname suffix \"%.100s\" contains "
-			    "consecutive separators", filename, linenum, name);
-		if (c != '.' && c != '-' && !isalnum(c) &&
-		    c != '_') /* technically invalid, but common */
-			fatal("%s line %d: hostname suffix \"%.100s\" contains "
-			    "invalid characters", filename, linenum, name);
-		last = c;
+	/* Remove an environment variable */
+	for (i = 0; i < options->num_send_env; ) {
+		cp = xstrdup(options->send_env[i]);
+		if (!match_pattern(cp, arg + 1)) {
+			free(cp);
+			i++;
+			continue;
+		}
+		debug3("%s line %d: removing environment %s",
+		    filename, linenum, cp);
+		free(cp);
+		free(options->send_env[i]);
+		options->send_env[i] = NULL;
+		for (j = i; j < options->num_send_env - 1; j++) {
+			options->send_env[j] = options->send_env[j + 1];
+			options->send_env[j + 1] = NULL;
+		}
+		options->num_send_env--;
+		/* NB. don't increment i */
 	}
-	if (name[l - 1] == '.')
-		name[l - 1] = '\0';
 }
 
 /*
@@ -754,6 +751,16 @@
 	{ "ask",			2 },
 	{ NULL, -1 }
 };
+static const struct multistate multistate_strict_hostkey[] = {
+	{ "true",			SSH_STRICT_HOSTKEY_YES },
+	{ "false",			SSH_STRICT_HOSTKEY_OFF },
+	{ "yes",			SSH_STRICT_HOSTKEY_YES },
+	{ "no",				SSH_STRICT_HOSTKEY_OFF },
+	{ "ask",			SSH_STRICT_HOSTKEY_ASK },
+	{ "off",			SSH_STRICT_HOSTKEY_OFF },
+	{ "accept-new",			SSH_STRICT_HOSTKEY_NEW },
+	{ NULL, -1 }
+};
 static const struct multistate multistate_yesnoaskconfirm[] = {
 	{ "true",			1 },
 	{ "false",			0 },
@@ -829,13 +836,16 @@
 	char **cpptr, fwdarg[256];
 	u_int i, *uintptr, max_entries = 0;
 	int r, oactive, negated, opcode, *intptr, value, value2, cmdline = 0;
+	int remotefwd, dynamicfwd;
 	LogLevel *log_level_ptr;
+	SyslogFacility *log_facility_ptr;
 	long long val64;
 	size_t len;
 	struct Forward fwd;
 	const struct multistate *multistate_ptr;
 	struct allowed_cname *cname;
 	glob_t gl;
+	const char *errstr;
 
 	if (activep == NULL) { /* We are processing a command line directive */
 		cmdline = 1;
@@ -870,6 +880,8 @@
 	case oBadOption:
 		/* don't panic, but count bad options */
 		return -1;
+	case oIgnore:
+		return 0;
 	case oIgnoredUnknownOption:
 		debug("%s line %d: Ignored unknown option \"%s\"",
 		    filename, linenum, keyword);
@@ -933,10 +945,6 @@
 		intptr = &options->exit_on_forward_failure;
 		goto parse_flag;
 
-	case oUsePrivilegedPort:
-		intptr = &options->use_privileged_port;
-		goto parse_flag;
-
 	case oPasswordAuthentication:
 		intptr = &options->password_authentication;
 		goto parse_flag;
@@ -953,14 +961,6 @@
 		intptr = &options->pubkey_authentication;
 		goto parse_flag;
 
-	case oRSAAuthentication:
-		intptr = &options->rsa_authentication;
-		goto parse_flag;
-
-	case oRhostsRSAAuthentication:
-		intptr = &options->rhosts_rsa_authentication;
-		goto parse_flag;
-
 	case oHostbasedAuthentication:
 		intptr = &options->hostbased_authentication;
 		goto parse_flag;
@@ -992,7 +992,7 @@
 
 	case oStrictHostKeyChecking:
 		intptr = &options->strict_host_key_checking;
-		multistate_ptr = multistate_yesnoask;
+		multistate_ptr = multistate_strict_hostkey;
 		goto parse_multistate;
 
 	case oCompression:
@@ -1011,10 +1011,6 @@
 		intptr = &options->number_of_password_prompts;
 		goto parse_int;
 
-	case oCompressionLevel:
-		intptr = &options->compression_level;
-		goto parse_int;
-
 	case oRekeyLimit:
 		arg = strdelim(&s);
 		if (!arg || *arg == '\0')
@@ -1127,6 +1123,10 @@
 		charptr = &options->bind_address;
 		goto parse_string;
 
+	case oBindInterface:
+		charptr = &options->bind_interface;
+		goto parse_string;
+
 	case oPKCS11Provider:
 		charptr = &options->pkcs11_provider;
 		goto parse_string;
@@ -1160,15 +1160,9 @@
 		intptr = &options->port;
 parse_int:
 		arg = strdelim(&s);
-		if (!arg || *arg == '\0')
-			fatal("%.200s line %d: Missing argument.", filename, linenum);
-		if (arg[0] < '0' || arg[0] > '9')
-			fatal("%.200s line %d: Bad number.", filename, linenum);
-
-		/* Octal, decimal, or hex format? */
-		value = strtol(arg, &endofnumber, 0);
-		if (arg == endofnumber)
-			fatal("%.200s line %d: Bad number.", filename, linenum);
+		if ((errstr = atoi_err(arg, &value)) != NULL)
+			fatal("%s line %d: integer value %s.",
+			    filename, linenum, errstr);
 		if (*activep && *intptr == -1)
 			*intptr = value;
 		break;
@@ -1177,19 +1171,6 @@
 		intptr = &options->connection_attempts;
 		goto parse_int;
 
-	case oCipher:
-		intptr = &options->cipher;
-		arg = strdelim(&s);
-		if (!arg || *arg == '\0')
-			fatal("%.200s line %d: Missing argument.", filename, linenum);
-		value = cipher_number(arg);
-		if (value == -1)
-			fatal("%.200s line %d: Bad cipher '%s'.",
-			    filename, linenum, arg ? arg : "<NONE>");
-		if (*activep && *intptr == -1)
-			*intptr = value;
-		break;
-
 	case oCiphers:
 		arg = strdelim(&s);
 		if (!arg || *arg == '\0')
@@ -1240,19 +1221,6 @@
 			*charptr = xstrdup(arg);
 		break;
 
-	case oProtocol:
-		intptr = &options->protocol;
-		arg = strdelim(&s);
-		if (!arg || *arg == '\0')
-			fatal("%.200s line %d: Missing argument.", filename, linenum);
-		value = proto_spec(arg);
-		if (value == SSH_PROTO_UNKNOWN)
-			fatal("%.200s line %d: Bad protocol spec '%s'.",
-			    filename, linenum, arg ? arg : "<NONE>");
-		if (*activep && *intptr == SSH_PROTO_UNKNOWN)
-			*intptr = value;
-		break;
-
 	case oLogLevel:
 		log_level_ptr = &options->log_level;
 		arg = strdelim(&s);
@@ -1264,6 +1232,17 @@
 			*log_level_ptr = (LogLevel) value;
 		break;
 
+	case oLogFacility:
+		log_facility_ptr = &options->log_facility;
+		arg = strdelim(&s);
+		value = log_facility_number(arg);
+		if (value == SYSLOG_FACILITY_NOT_SET)
+			fatal("%.200s line %d: unsupported log facility '%s'",
+			    filename, linenum, arg ? arg : "<NONE>");
+		if (*log_facility_ptr == -1)
+			*log_facility_ptr = (SyslogFacility) value;
+		break;
+
 	case oLocalForward:
 	case oRemoteForward:
 	case oDynamicForward:
@@ -1272,31 +1251,36 @@
 			fatal("%.200s line %d: Missing port argument.",
 			    filename, linenum);
 
-		if (opcode == oLocalForward ||
-		    opcode == oRemoteForward) {
+		remotefwd = (opcode == oRemoteForward);
+		dynamicfwd = (opcode == oDynamicForward);
+
+		if (!dynamicfwd) {
 			arg2 = strdelim(&s);
-			if (arg2 == NULL || *arg2 == '\0')
-				fatal("%.200s line %d: Missing target argument.",
-				    filename, linenum);
-
-			/* construct a string for parse_forward */
-			snprintf(fwdarg, sizeof(fwdarg), "%s:%s", arg, arg2);
-		} else if (opcode == oDynamicForward) {
-			strlcpy(fwdarg, arg, sizeof(fwdarg));
+			if (arg2 == NULL || *arg2 == '\0') {
+				if (remotefwd)
+					dynamicfwd = 1;
+				else
+					fatal("%.200s line %d: Missing target "
+					    "argument.", filename, linenum);
+			} else {
+				/* construct a string for parse_forward */
+				snprintf(fwdarg, sizeof(fwdarg), "%s:%s", arg,
+				    arg2);
+			}
 		}
+		if (dynamicfwd)
+			strlcpy(fwdarg, arg, sizeof(fwdarg));
 
-		if (parse_forward(&fwd, fwdarg,
-		    opcode == oDynamicForward ? 1 : 0,
-		    opcode == oRemoteForward ? 1 : 0) == 0)
+		if (parse_forward(&fwd, fwdarg, dynamicfwd, remotefwd) == 0)
 			fatal("%.200s line %d: Bad forwarding specification.",
 			    filename, linenum);
 
 		if (*activep) {
-			if (opcode == oLocalForward ||
-			    opcode == oDynamicForward)
-				add_local_forward(options, &fwd);
-			else if (opcode == oRemoteForward)
+			if (remotefwd) {
 				add_remote_forward(options, &fwd);
+			} else {
+				add_local_forward(options, &fwd);
+			}
 		}
 		break;
 
@@ -1398,11 +1382,41 @@
 				    filename, linenum);
 			if (!*activep)
 				continue;
-			if (options->num_send_env >= MAX_SEND_ENV)
-				fatal("%s line %d: too many send env.",
+			if (*arg == '-') {
+				/* Removing an env var */
+				rm_env(options, arg, filename, linenum);
+				continue;
+			} else {
+				/* Adding an env var */
+				if (options->num_send_env >= INT_MAX)
+					fatal("%s line %d: too many send env.",
+					    filename, linenum);
+				options->send_env = xrecallocarray(
+				    options->send_env, options->num_send_env,
+				    options->num_send_env + 1,
+				    sizeof(*options->send_env));
+				options->send_env[options->num_send_env++] =
+				    xstrdup(arg);
+			}
+		}
+		break;
+
+	case oSetEnv:
+		value = options->num_setenv;
+		while ((arg = strdelimw(&s)) != NULL && *arg != '\0') {
+			if (strchr(arg, '=') == NULL)
+				fatal("%s line %d: Invalid SetEnv.",
 				    filename, linenum);
-			options->send_env[options->num_send_env++] =
-			    xstrdup(arg);
+			if (!*activep || value != 0)
+				continue;
+			/* Adding a setenv var */
+			if (options->num_setenv >= INT_MAX)
+				fatal("%s line %d: too many SetEnv.",
+				    filename, linenum);
+			options->setenv = xrecallocarray(
+			    options->setenv, options->num_setenv,
+			    options->num_setenv + 1, sizeof(*options->setenv));
+			options->setenv[options->num_setenv++] = xstrdup(arg);
 		}
 		break;
 
@@ -1469,6 +1483,10 @@
 		intptr = &options->permit_local_command;
 		goto parse_flag;
 
+	case oRemoteCommand:
+		charptr = &options->remote_command;
+		goto parse_command;
+
 	case oVisualHostKey:
 		intptr = &options->visual_host_key;
 		goto parse_flag;
@@ -1500,6 +1518,7 @@
 			if (r == GLOB_NOMATCH) {
 				debug("%.200s line %d: include %s matched no "
 				    "files",filename, linenum, arg2);
+				free(arg2);
 				continue;
 			} else if (r != 0 || gl.gl_pathc < 0)
 				fatal("%.200s line %d: glob failed for %s.",
@@ -1568,7 +1587,10 @@
 	case oCanonicalDomains:
 		value = options->num_canonical_domains != 0;
 		while ((arg = strdelim(&s)) != NULL && *arg != '\0') {
-			valid_domain(arg, filename, linenum);
+			if (!valid_domain(arg, 1, &errstr)) {
+				fatal("%s line %d: %s", filename, linenum,
+				    errstr);
+			}
 			if (!*activep || value)
 				continue;
 			if (options->num_canonical_domains >= MAX_CANON_DOMAINS)
@@ -1719,7 +1741,8 @@
     int flags, int *activep, int depth)
 {
 	FILE *f;
-	char line[1024];
+	char *line = NULL;
+	size_t linesize = 0;
 	int linenum;
 	int bad_options = 0;
 
@@ -1746,13 +1769,14 @@
 	 * on/off by Host specifications.
 	 */
 	linenum = 0;
-	while (fgets(line, sizeof(line), f)) {
+	while (getline(&line, &linesize, f) != -1) {
 		/* Update line number counter. */
 		linenum++;
 		if (process_config_line_depth(options, pw, host, original_host,
 		    line, filename, linenum, activep, flags, depth) != 0)
 			bad_options++;
 	}
+	free(line);
 	fclose(f);
 	if (bad_options > 0)
 		fatal("%s: terminating, %d bad configuration options",
@@ -1790,8 +1814,6 @@
 	options->fwd_opts.gateway_ports = -1;
 	options->fwd_opts.streamlocal_bind_mask = (mode_t)-1;
 	options->fwd_opts.streamlocal_bind_unlink = -1;
-	options->use_privileged_port = -1;
-	options->rsa_authentication = -1;
 	options->pubkey_authentication = -1;
 	options->challenge_response_authentication = -1;
 	options->gss_authentication = -1;
@@ -1799,25 +1821,21 @@
 	options->password_authentication = -1;
 	options->kbd_interactive_authentication = -1;
 	options->kbd_interactive_devices = NULL;
-	options->rhosts_rsa_authentication = -1;
 	options->hostbased_authentication = -1;
 	options->batch_mode = -1;
 	options->check_host_ip = -1;
 	options->strict_host_key_checking = -1;
 	options->compression = -1;
 	options->tcp_keep_alive = -1;
-	options->compression_level = -1;
 	options->port = -1;
 	options->address_family = -1;
 	options->connection_attempts = -1;
 	options->connection_timeout = -1;
 	options->number_of_password_prompts = -1;
-	options->cipher = -1;
 	options->ciphers = NULL;
 	options->macs = NULL;
 	options->kex_algorithms = NULL;
 	options->hostkeyalgorithms = NULL;
-	options->protocol = SSH_PROTO_UNKNOWN;
 	options->num_identity_files = 0;
 	options->num_certificate_files = 0;
 	options->hostname = NULL;
@@ -1835,9 +1853,11 @@
 	options->num_local_forwards = 0;
 	options->remote_forwards = NULL;
 	options->num_remote_forwards = 0;
+	options->log_facility = SYSLOG_FACILITY_NOT_SET;
 	options->log_level = SYSLOG_LEVEL_NOT_SET;
 	options->preferred_authentications = NULL;
 	options->bind_address = NULL;
+	options->bind_interface = NULL;
 	options->pkcs11_provider = NULL;
 	options->enable_ssh_keysign = - 1;
 	options->no_host_authentication_for_localhost = - 1;
@@ -1847,7 +1867,10 @@
 	options->verify_host_key_dns = -1;
 	options->server_alive_interval = -1;
 	options->server_alive_count_max = -1;
+	options->send_env = NULL;
 	options->num_send_env = 0;
+	options->setenv = NULL;
+	options->num_setenv = 0;
 	options->control_path = NULL;
 	options->control_master = -1;
 	options->control_persist = -1;
@@ -1858,6 +1881,7 @@
 	options->tun_remote = -1;
 	options->local_command = NULL;
 	options->permit_local_command = -1;
+	options->remote_command = NULL;
 	options->add_keys_to_agent = -1;
 	options->identity_agent = NULL;
 	options->visual_host_key = -1;
@@ -1900,6 +1924,9 @@
 void
 fill_default_options(Options * options)
 {
+	char *all_cipher, *all_mac, *all_kex, *all_key;
+	int r;
+
 	if (options->forward_agent == -1)
 		options->forward_agent = 0;
 	if (options->forward_x11 == -1)
@@ -1929,10 +1956,6 @@
 		options->fwd_opts.streamlocal_bind_mask = 0177;
 	if (options->fwd_opts.streamlocal_bind_unlink == -1)
 		options->fwd_opts.streamlocal_bind_unlink = 0;
-	if (options->use_privileged_port == -1)
-		options->use_privileged_port = 0;
-	if (options->rsa_authentication == -1)
-		options->rsa_authentication = 1;
 	if (options->pubkey_authentication == -1)
 		options->pubkey_authentication = 1;
 	if (options->challenge_response_authentication == -1)
@@ -1945,8 +1968,6 @@
 		options->password_authentication = 1;
 	if (options->kbd_interactive_authentication == -1)
 		options->kbd_interactive_authentication = 1;
-	if (options->rhosts_rsa_authentication == -1)
-		options->rhosts_rsa_authentication = 0;
 	if (options->hostbased_authentication == -1)
 		options->hostbased_authentication = 0;
 	if (options->batch_mode == -1)
@@ -1954,13 +1975,11 @@
 	if (options->check_host_ip == -1)
 		options->check_host_ip = 1;
 	if (options->strict_host_key_checking == -1)
-		options->strict_host_key_checking = 2;	/* 2 is default */
+		options->strict_host_key_checking = SSH_STRICT_HOSTKEY_ASK;
 	if (options->compression == -1)
 		options->compression = 0;
 	if (options->tcp_keep_alive == -1)
 		options->tcp_keep_alive = 1;
-	if (options->compression_level == -1)
-		options->compression_level = 6;
 	if (options->port == -1)
 		options->port = 0;	/* Filled in ssh_connect. */
 	if (options->address_family == -1)
@@ -1969,31 +1988,18 @@
 		options->connection_attempts = 1;
 	if (options->number_of_password_prompts == -1)
 		options->number_of_password_prompts = 3;
-	/* Selected in ssh_login(). */
-	if (options->cipher == -1)
-		options->cipher = SSH_CIPHER_NOT_SET;
 	/* options->hostkeyalgorithms, default set in myproposals.h */
-	if (options->protocol == SSH_PROTO_UNKNOWN)
-		options->protocol = SSH_PROTO_2;
 	if (options->add_keys_to_agent == -1)
 		options->add_keys_to_agent = 0;
 	if (options->num_identity_files == 0) {
-		if (options->protocol & SSH_PROTO_1) {
-			add_identity_file(options, "~/",
-			    _PATH_SSH_CLIENT_IDENTITY, 0);
-		}
-		if (options->protocol & SSH_PROTO_2) {
-			add_identity_file(options, "~/",
-			    _PATH_SSH_CLIENT_ID_RSA, 0);
-			add_identity_file(options, "~/",
-			    _PATH_SSH_CLIENT_ID_DSA, 0);
+		add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_RSA, 0);
+		add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_DSA, 0);
 #ifdef OPENSSL_HAS_ECC
-			add_identity_file(options, "~/",
-			    _PATH_SSH_CLIENT_ID_ECDSA, 0);
+		add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_ECDSA, 0);
 #endif
-			add_identity_file(options, "~/",
-			    _PATH_SSH_CLIENT_ID_ED25519, 0);
-		}
+		add_identity_file(options, "~/",
+		    _PATH_SSH_CLIENT_ID_ED25519, 0);
+		add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_XMSS, 0);
 	}
 	if (options->escape_char == -1)
 		options->escape_char = '~';
@@ -2011,6 +2017,8 @@
 	}
 	if (options->log_level == SYSLOG_LEVEL_NOT_SET)
 		options->log_level = SYSLOG_LEVEL_INFO;
+	if (options->log_facility == SYSLOG_FACILITY_NOT_SET)
+		options->log_facility = SYSLOG_FACILITY_USER;
 	if (options->no_host_authentication_for_localhost == - 1)
 		options->no_host_authentication_for_localhost = 0;
 	if (options->identities_only == -1)
@@ -2046,9 +2054,9 @@
 	if (options->visual_host_key == -1)
 		options->visual_host_key = 0;
 	if (options->ip_qos_interactive == -1)
-		options->ip_qos_interactive = IPTOS_LOWDELAY;
+		options->ip_qos_interactive = IPTOS_DSCP_AF21;
 	if (options->ip_qos_bulk == -1)
-		options->ip_qos_bulk = IPTOS_THROUGHPUT;
+		options->ip_qos_bulk = IPTOS_DSCP_CS1;
 	if (options->request_tty == -1)
 		options->request_tty = REQUEST_TTY_AUTO;
 	if (options->proxy_use_fdpass == -1)
@@ -2063,14 +2071,28 @@
 		options->fingerprint_hash = SSH_FP_HASH_DEFAULT;
 	if (options->update_hostkeys == -1)
 		options->update_hostkeys = 0;
-	if (kex_assemble_names(KEX_CLIENT_ENCRYPT, &options->ciphers) != 0 ||
-	    kex_assemble_names(KEX_CLIENT_MAC, &options->macs) != 0 ||
-	    kex_assemble_names(KEX_CLIENT_KEX, &options->kex_algorithms) != 0 ||
-	    kex_assemble_names(KEX_DEFAULT_PK_ALG,
-	    &options->hostbased_key_types) != 0 ||
-	    kex_assemble_names(KEX_DEFAULT_PK_ALG,
-	    &options->pubkey_key_types) != 0)
-		fatal("%s: kex_assemble_names failed", __func__);
+
+	/* Expand KEX name lists */
+	all_cipher = cipher_alg_list(',', 0);
+	all_mac = mac_alg_list(',');
+	all_kex = kex_alg_list(',');
+	all_key = sshkey_alg_list(0, 0, 1, ',');
+#define ASSEMBLE(what, defaults, all) \
+	do { \
+		if ((r = kex_assemble_names(&options->what, \
+		    defaults, all)) != 0) \
+			fatal("%s: %s: %s", __func__, #what, ssh_err(r)); \
+	} while (0)
+	ASSEMBLE(ciphers, KEX_SERVER_ENCRYPT, all_cipher);
+	ASSEMBLE(macs, KEX_SERVER_MAC, all_mac);
+	ASSEMBLE(kex_algorithms, KEX_SERVER_KEX, all_kex);
+	ASSEMBLE(hostbased_key_types, KEX_DEFAULT_PK_ALG, all_key);
+	ASSEMBLE(pubkey_key_types, KEX_DEFAULT_PK_ALG, all_key);
+#undef ASSEMBLE
+	free(all_cipher);
+	free(all_mac);
+	free(all_kex);
+	free(all_key);
 
 #define CLEAR_ON_NONE(v) \
 	do { \
@@ -2080,9 +2102,16 @@
 		} \
 	} while(0)
 	CLEAR_ON_NONE(options->local_command);
+	CLEAR_ON_NONE(options->remote_command);
 	CLEAR_ON_NONE(options->proxy_command);
 	CLEAR_ON_NONE(options->control_path);
 	CLEAR_ON_NONE(options->revoked_host_keys);
+	if (options->jump_host != NULL &&
+	    strcmp(options->jump_host, "none") == 0 &&
+	    options->jump_port == 0 && options->jump_user == NULL) {
+		free(options->jump_host);
+		options->jump_host = NULL;
+	}
 	/* options->identity_agent distinguishes NULL from 'none' */
 	/* options->user will be set in the main program if appropriate */
 	/* options->hostname will be set in the main program if appropriate */
@@ -2311,6 +2340,8 @@
 	orig = sdup = xstrdup(s);
 	first = active;
 	do {
+		if (strcasecmp(s, "none") == 0)
+			break;
 		if ((cp = strrchr(sdup, ',')) == NULL)
 			cp = sdup; /* last */
 		else
@@ -2318,25 +2349,32 @@
 
 		if (first) {
 			/* First argument and configuration is active */
-			if (parse_user_host_port(cp, &user, &host, &port) != 0)
+			if (parse_ssh_uri(cp, &user, &host, &port) == -1 ||
+			    parse_user_host_port(cp, &user, &host, &port) != 0)
 				goto out;
 		} else {
 			/* Subsequent argument or inactive configuration */
-			if (parse_user_host_port(cp, NULL, NULL, NULL) != 0)
+			if (parse_ssh_uri(cp, NULL, NULL, NULL) == -1 ||
+			    parse_user_host_port(cp, NULL, NULL, NULL) != 0)
 				goto out;
 		}
 		first = 0; /* only check syntax for subsequent hosts */
 	} while (cp != sdup);
 	/* success */
 	if (active) {
-		o->jump_user = user;
-		o->jump_host = host;
-		o->jump_port = port;
-		o->proxy_command = xstrdup("none");
-		user = host = NULL;
-		if ((cp = strrchr(s, ',')) != NULL && cp != s) {
-			o->jump_extra = xstrdup(s);
-			o->jump_extra[cp - s] = '\0';
+		if (strcasecmp(s, "none") == 0) {
+			o->jump_host = xstrdup("none");
+			o->jump_port = 0;
+		} else {
+			o->jump_user = user;
+			o->jump_host = host;
+			o->jump_port = port;
+			o->proxy_command = xstrdup("none");
+			user = host = NULL;
+			if ((cp = strrchr(s, ',')) != NULL && cp != s) {
+				o->jump_extra = xstrdup(s);
+				o->jump_extra[cp - s] = '\0';
+			}
 		}
 	}
 	ret = 0;
@@ -2347,6 +2385,18 @@
 	return ret;
 }
 
+int
+parse_ssh_uri(const char *uri, char **userp, char **hostp, int *portp)
+{
+	char *path;
+	int r;
+
+	r = parse_uri("ssh", uri, userp, hostp, portp, &path);
+	if (r == 0 && path != NULL)
+		r = -1;		/* path not allowed */
+	return r;
+}
+
 /* XXX the following is a near-vebatim copy from servconf.c; refactor */
 static const char *
 fmt_multistate_int(int val, const struct multistate *m)
@@ -2369,9 +2419,10 @@
 	case oAddressFamily:
 		return fmt_multistate_int(val, multistate_addressfamily);
 	case oVerifyHostKeyDNS:
-	case oStrictHostKeyChecking:
 	case oUpdateHostkeys:
 		return fmt_multistate_int(val, multistate_yesnoask);
+	case oStrictHostKeyChecking:
+		return fmt_multistate_int(val, multistate_strict_hostkey);
 	case oControlMaster:
 		return fmt_multistate_int(val, multistate_controlmaster);
 	case oTunnel:
@@ -2380,19 +2431,10 @@
 		return fmt_multistate_int(val, multistate_requesttty);
 	case oCanonicalizeHostname:
 		return fmt_multistate_int(val, multistate_canonicalizehostname);
+	case oAddKeysToAgent:
+		return fmt_multistate_int(val, multistate_yesnoaskconfirm);
 	case oFingerprintHash:
 		return ssh_digest_alg_name(val);
-	case oProtocol:
-		switch (val) {
-		case SSH_PROTO_1:
-			return "1";
-		case SSH_PROTO_2:
-			return "2";
-		case (SSH_PROTO_1|SSH_PROTO_2):
-			return "2,1";
-		default:
-			return "UNKNOWN";
-		}
 	default:
 		switch (val) {
 		case 0:
@@ -2498,11 +2540,14 @@
 dump_client_config(Options *o, const char *host)
 {
 	int i;
-	char buf[8];
+	char buf[8], *all_key;
 
 	/* This is normally prepared in ssh_kex2 */
-	if (kex_assemble_names(KEX_DEFAULT_PK_ALG, &o->hostkeyalgorithms) != 0)
+	all_key = sshkey_alg_list(0, 0, 1, ',');
+	if (kex_assemble_names( &o->hostkeyalgorithms,
+	    KEX_DEFAULT_PK_ALG, all_key) != 0)
 		fatal("%s: kex_assemble_names failed", __func__);
+	free(all_key);
 
 	/* Most interesting options first: user, host, port */
 	dump_cfg_string(oUser, o->user);
@@ -2510,6 +2555,7 @@
 	dump_cfg_int(oPort, o->port);
 
 	/* Flag options */
+	dump_cfg_fmtint(oAddKeysToAgent, o->add_keys_to_agent);
 	dump_cfg_fmtint(oAddressFamily, o->address_family);
 	dump_cfg_fmtint(oBatchMode, o->batch_mode);
 	dump_cfg_fmtint(oCanonicalizeFallbackLocal, o->canonicalize_fallback_local);
@@ -2537,28 +2583,19 @@
 	dump_cfg_fmtint(oNoHostAuthenticationForLocalhost, o->no_host_authentication_for_localhost);
 	dump_cfg_fmtint(oPasswordAuthentication, o->password_authentication);
 	dump_cfg_fmtint(oPermitLocalCommand, o->permit_local_command);
-	dump_cfg_fmtint(oProtocol, o->protocol);
 	dump_cfg_fmtint(oProxyUseFdpass, o->proxy_use_fdpass);
 	dump_cfg_fmtint(oPubkeyAuthentication, o->pubkey_authentication);
 	dump_cfg_fmtint(oRequestTTY, o->request_tty);
-#ifdef WITH_RSA1
-	dump_cfg_fmtint(oRhostsRSAAuthentication, o->rhosts_rsa_authentication);
-	dump_cfg_fmtint(oRSAAuthentication, o->rsa_authentication);
-#endif
 	dump_cfg_fmtint(oStreamLocalBindUnlink, o->fwd_opts.streamlocal_bind_unlink);
 	dump_cfg_fmtint(oStrictHostKeyChecking, o->strict_host_key_checking);
 	dump_cfg_fmtint(oTCPKeepAlive, o->tcp_keep_alive);
 	dump_cfg_fmtint(oTunnel, o->tun_open);
-	dump_cfg_fmtint(oUsePrivilegedPort, o->use_privileged_port);
 	dump_cfg_fmtint(oVerifyHostKeyDNS, o->verify_host_key_dns);
 	dump_cfg_fmtint(oVisualHostKey, o->visual_host_key);
 	dump_cfg_fmtint(oUpdateHostkeys, o->update_hostkeys);
 
 	/* Integer options */
 	dump_cfg_int(oCanonicalizeMaxDots, o->canonicalize_max_dots);
-#ifdef WITH_SSH1
-	dump_cfg_int(oCompressionLevel, o->compression_level);
-#endif
 	dump_cfg_int(oConnectionAttempts, o->connection_attempts);
 	dump_cfg_int(oForwardX11Timeout, o->forward_x11_timeout);
 	dump_cfg_int(oNumberOfPasswordPrompts, o->number_of_password_prompts);
@@ -2567,15 +2604,18 @@
 
 	/* String options */
 	dump_cfg_string(oBindAddress, o->bind_address);
+	dump_cfg_string(oBindInterface, o->bind_interface);
 	dump_cfg_string(oCiphers, o->ciphers ? o->ciphers : KEX_CLIENT_ENCRYPT);
 	dump_cfg_string(oControlPath, o->control_path);
 	dump_cfg_string(oHostKeyAlgorithms, o->hostkeyalgorithms);
 	dump_cfg_string(oHostKeyAlias, o->host_key_alias);
 	dump_cfg_string(oHostbasedKeyTypes, o->hostbased_key_types);
 	dump_cfg_string(oIdentityAgent, o->identity_agent);
+	dump_cfg_string(oIgnoreUnknown, o->ignored_unknown);
 	dump_cfg_string(oKbdInteractiveDevices, o->kbd_interactive_devices);
 	dump_cfg_string(oKexAlgorithms, o->kex_algorithms ? o->kex_algorithms : KEX_CLIENT_KEX);
 	dump_cfg_string(oLocalCommand, o->local_command);
+	dump_cfg_string(oRemoteCommand, o->remote_command);
 	dump_cfg_string(oLogLevel, log_level_name(o->log_level));
 	dump_cfg_string(oMacs, o->macs ? o->macs : KEX_CLIENT_MAC);
 #ifdef ENABLE_PKCS11
@@ -2594,9 +2634,11 @@
 	/* String array options */
 	dump_cfg_strarray(oIdentityFile, o->num_identity_files, o->identity_files);
 	dump_cfg_strarray_oneline(oCanonicalDomains, o->num_canonical_domains, o->canonical_domains);
+	dump_cfg_strarray(oCertificateFile, o->num_certificate_files, o->certificate_files);
 	dump_cfg_strarray_oneline(oGlobalKnownHostsFile, o->num_system_hostfiles, o->system_hostfiles);
 	dump_cfg_strarray_oneline(oUserKnownHostsFile, o->num_user_hostfiles, o->user_hostfiles);
 	dump_cfg_strarray(oSendEnv, o->num_send_env, o->send_env);
+	dump_cfg_strarray(oSetEnv, o->num_setenv, o->setenv);
 
 	/* Special cases */
 
@@ -2628,10 +2670,6 @@
 		printf("\n");
 	}
 
-	/* oCipher */
-	if (o->cipher != SSH_CIPHER_NOT_SET)
-		printf("Cipher %s\n", cipher_name(o->cipher));
-
 	/* oControlPersist */
 	if (o->control_persist == 0 || o->control_persist_timeout == 0)
 		dump_cfg_fmtint(oControlPersist, o->control_persist);
@@ -2658,6 +2696,9 @@
 	printf("streamlocalbindmask 0%o\n",
 	    o->fwd_opts.streamlocal_bind_mask);
 
+	/* oLogFacility */
+	printf("syslogfacility %s\n", log_facility_name(o->log_facility));
+
 	/* oProxyCommand / oProxyJump */
 	if (o->jump_host == NULL)
 		dump_cfg_string(oProxyCommand, o->proxy_command);
diff --git a/readconf.h b/readconf.h
index cef55f7..c568878 100644
--- a/readconf.h
+++ b/readconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: readconf.h,v 1.117 2016/07/15 00:24:30 djm Exp $ */
+/* $OpenBSD: readconf.h,v 1.127 2018/07/19 10:28:47 dtucker Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -18,7 +18,6 @@
 
 /* Data structure for representing option data. */
 
-#define MAX_SEND_ENV		256
 #define SSH_MAX_HOSTS_FILES	32
 #define MAX_CANON_DOMAINS	32
 #define PATH_MAX_SUN		(sizeof((struct sockaddr_un *)0)->sun_path)
@@ -36,10 +35,6 @@
 	int     exit_on_forward_failure;	/* Exit if bind(2) fails for -L/-R */
 	char   *xauth_location;	/* Location for xauth program */
 	struct ForwardOptions fwd_opts;	/* forwarding options */
-	int     use_privileged_port;	/* Don't use privileged port if false. */
-	int     rhosts_rsa_authentication;	/* Try rhosts with RSA
-						 * authentication. */
-	int     rsa_authentication;	/* Try RSA authentication. */
 	int     pubkey_authentication;	/* Try ssh2 pubkey authentication. */
 	int     hostbased_authentication;	/* ssh2's rhosts_rsa */
 	int     challenge_response_authentication;
@@ -54,11 +49,10 @@
 	int     check_host_ip;	/* Also keep track of keys for IP address */
 	int     strict_host_key_checking;	/* Strict host key checking. */
 	int     compression;	/* Compress packets in both directions. */
-	int     compression_level;	/* Compression level 1 (fast) to 9
-					 * (best). */
 	int     tcp_keep_alive;	/* Set SO_KEEPALIVE. */
 	int	ip_qos_interactive;	/* IP ToS/DSCP/class for interactive */
 	int	ip_qos_bulk;		/* IP ToS/DSCP/class for bulk traffic */
+	SyslogFacility log_facility;	/* Facility for system logging. */
 	LogLevel log_level;	/* Level for logging. */
 
 	int     port;		/* Port to connect. */
@@ -69,12 +63,10 @@
 					 * aborting connection attempt */
 	int     number_of_password_prompts;	/* Max number of password
 						 * prompts. */
-	int     cipher;		/* Cipher to use. */
 	char   *ciphers;	/* SSH2 ciphers in order of preference. */
 	char   *macs;		/* SSH2 macs in order of preference. */
 	char   *hostkeyalgorithms;	/* SSH2 server key types in order of preference. */
 	char   *kex_algorithms;	/* SSH2 kex methods in order of preference. */
-	int	protocol;	/* Protocol in order of preference. */
 	char   *hostname;	/* Real host to connect. */
 	char   *host_key_alias;	/* hostname alias for .ssh/known_hosts */
 	char   *proxy_command;	/* Proxy command for connecting the host. */
@@ -87,6 +79,7 @@
 	char   *user_hostfiles[SSH_MAX_HOSTS_FILES];
 	char   *preferred_authentications;
 	char   *bind_address;	/* local socket address for connection to sshd */
+	char   *bind_interface;	/* local interface for bind address */
 	char   *pkcs11_provider; /* PKCS#11 provider */
 	int	verify_host_key_dns;	/* Verify host key using DNS */
 
@@ -125,7 +118,9 @@
 	int	server_alive_count_max;
 
 	int     num_send_env;
-	char   *send_env[MAX_SEND_ENV];
+	char   **send_env;
+	int     num_setenv;
+	char   **setenv;
 
 	char	*control_path;
 	int	control_master;
@@ -140,6 +135,7 @@
 
 	char	*local_command;
 	int	permit_local_command;
+	char	*remote_command;
 	int	visual_host_key;
 
 	int	request_tty;
@@ -195,6 +191,11 @@
 #define SSH_UPDATE_HOSTKEYS_YES	1
 #define SSH_UPDATE_HOSTKEYS_ASK	2
 
+#define SSH_STRICT_HOSTKEY_OFF	0
+#define SSH_STRICT_HOSTKEY_NEW	1
+#define SSH_STRICT_HOSTKEY_YES	2
+#define SSH_STRICT_HOSTKEY_ASK	3
+
 void     initialize_options(Options *);
 void     fill_default_options(Options *);
 void	 fill_default_options_for_canonicalization(Options *);
@@ -204,6 +205,7 @@
     const char *, Options *, int);
 int	 parse_forward(struct Forward *, const char *, int, int);
 int	 parse_jump(const char *, Options *, int);
+int	 parse_ssh_uri(const char *, char **, char **, int *);
 int	 default_ssh_port(void);
 int	 option_clear_or_none(const char *);
 void	 dump_client_config(Options *o, const char *host);
diff --git a/readpass.c b/readpass.c
index 05c8cac..f160f86 100644
--- a/readpass.c
+++ b/readpass.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: readpass.c,v 1.51 2015/12/11 00:20:04 mmcc Exp $ */
+/* $OpenBSD: readpass.c,v 1.52 2018/07/18 11:34:04 dtucker Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  *
@@ -72,7 +72,6 @@
 		return NULL;
 	}
 	if (pid == 0) {
-		permanently_drop_suid(getuid());
 		close(p[0]);
 		if (dup2(p[1], STDOUT_FILENO) < 0)
 			fatal("ssh_askpass: dup2: %s", strerror(errno));
diff --git a/regress/Makefile b/regress/Makefile
index c2dba4f..647b4a0 100644
--- a/regress/Makefile
+++ b/regress/Makefile
@@ -1,4 +1,4 @@
-#	$OpenBSD: Makefile,v 1.94 2016/12/16 03:51:19 dtucker Exp $
+#	$OpenBSD: Makefile,v 1.97 2018/06/07 04:46:34 djm Exp $
 
 REGRESS_TARGETS=	unit t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t-exec
 tests:		prep $(REGRESS_TARGETS)
@@ -19,6 +19,7 @@
 LTESTS= 	connect \
 		proxy-connect \
 		connect-privsep \
+		connect-uri \
 		proto-version \
 		proto-mismatch \
 		exit-status \
@@ -42,6 +43,7 @@
 		keygen-moduli \
 		key-options \
 		scp \
+		scp-uri \
 		sftp \
 		sftp-chroot \
 		sftp-cmds \
@@ -49,6 +51,7 @@
 		sftp-batch \
 		sftp-glob \
 		sftp-perm \
+		sftp-uri \
 		reconfigure \
 		dynamic-forward \
 		forwarding \
@@ -58,6 +61,7 @@
 		sshcfgparse \
 		cfgparse \
 		cfgmatch \
+		cfgmatchlisten \
 		addrmatch \
 		localcommand \
 		forcecommand \
@@ -79,7 +83,8 @@
 		principals-command \
 		cert-file \
 		cfginclude \
-		allow-deny-users
+		allow-deny-users \
+		authinfo
 
 
 #		dhgex \
@@ -89,30 +94,33 @@
 
 #LTESTS= 	cipher-speed
 
-USERNAME!=		id -un
+USERNAME=		${LOGNAME}
 CLEANFILES=	*.core actual agent-key.* authorized_keys_${USERNAME} \
 		authorized_keys_${USERNAME}.* \
 		authorized_principals_${USERNAME} \
 		banner.in banner.out cert_host_key* cert_user_key* \
 		copy.1 copy.2 data ed25519-agent ed25519-agent* \
-		ed25519-agent.pub empty.in expect failed-regress.log \
-		failed-ssh.log failed-sshd.log hkr.* host.rsa host.rsa1 \
-		host_* host_ca_key* host_krl_* host_revoked_* key.* \
-		key.dsa-* key.ecdsa-* key.ed25519-512 key.ed25519-512.pub \
-		key.rsa-* keys-command-args kh.* known_hosts \
-		known_hosts-cert known_hosts.* krl-* ls.copy modpipe \
-		netcat pidfile putty.rsa2 ready regress.log remote_pid \
-		revoked-* rsa rsa-agent rsa-agent.pub rsa.pub rsa1 \
-		rsa1-agent rsa1-agent.pub rsa1.pub rsa_ssh2_cr.prv \
+		ed25519-agent.pub ed25519 ed25519.pub empty.in \
+		expect failed-regress.log failed-ssh.log failed-sshd.log \
+		hkr.* host.ed25519 host.rsa host.rsa1 host_* \
+		host_ca_key* host_krl_* host_revoked_* key.* \
+		key.dsa-* key.ecdsa-* key.ed25519-512 \
+		key.ed25519-512.pub key.rsa-* keys-command-args kh.* \
+		known_hosts known_hosts-cert known_hosts.* krl-* ls.copy \
+		modpipe netcat no_identity_config \
+		pidfile putty.rsa2 ready regress.log \
+		remote_pid revoked-* rsa rsa-agent rsa-agent.pub rsa.pub \
+		rsa1 rsa1-agent rsa1-agent.pub rsa1.pub rsa_ssh2_cr.prv \
 		rsa_ssh2_crnl.prv scp-ssh-wrapper.exe \
 		scp-ssh-wrapper.scp setuid-allowed sftp-server.log \
 		sftp-server.sh sftp.log ssh-log-wrapper.sh ssh.log \
 		ssh_config ssh_config.* ssh_proxy ssh_proxy_bak \
-		ssh_proxy_envpass sshd.log sshd_config sshd_config.orig \
-		sshd_proxy sshd_proxy.* sshd_proxy_bak sshd_proxy_orig \
-		t10.out t10.out.pub t12.out t12.out.pub t2.out t3.out \
-		t6.out1 t6.out2 t7.out t7.out.pub t8.out t8.out.pub \
-		t9.out t9.out.pub testdata user_*key* user_ca* user_key*
+		ssh_proxy_envpass sshd.log sshd_config sshd_config_minimal \
+		sshd_config.orig sshd_proxy sshd_proxy.* sshd_proxy_bak \
+		sshd_proxy_orig t10.out t10.out.pub t12.out t12.out.pub \
+		t2.out t3.out t6.out1 t6.out2 t7.out t7.out.pub \
+		t8.out t8.out.pub t9.out t9.out.pub testdata \
+		user_*key* user_ca* user_key*
 
 SUDO_CLEAN+=	/var/run/testdata_${USERNAME} /var/run/keycommand_${USERNAME}
 
@@ -222,6 +230,7 @@
 		$$V ${.OBJDIR}/unittests/sshkey/test_sshkey \
 			-d ${.CURDIR}/unittests/sshkey/testdata ; \
 		$$V ${.OBJDIR}/unittests/bitmap/test_bitmap ; \
+		$$V ${.OBJDIR}/unittests/conversion/test_conversion ; \
 		$$V ${.OBJDIR}/unittests/kex/test_kex ; \
 		$$V ${.OBJDIR}/unittests/hostkeys/test_hostkeys \
 			-d ${.CURDIR}/unittests/hostkeys/testdata ; \
diff --git a/regress/README.regress b/regress/README.regress
index 9b99bda..8678550 100644
--- a/regress/README.regress
+++ b/regress/README.regress
@@ -100,5 +100,3 @@
 - Recent GNU coreutils deprecate "head -[n]": this will cause the yes-head
   test to fail.  The old behaviour can be restored by setting (and
   exporting) _POSIX2_VERSION=199209 before running the tests.
-
-$Id: README.regress,v 1.12 2011/05/05 03:48:42 djm Exp $
diff --git a/regress/agent-getpeereid.sh b/regress/agent-getpeereid.sh
index 34bced1..769c29e 100644
--- a/regress/agent-getpeereid.sh
+++ b/regress/agent-getpeereid.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: agent-getpeereid.sh,v 1.8 2017/01/06 02:51:16 djm Exp $
+#	$OpenBSD: agent-getpeereid.sh,v 1.10 2018/02/09 03:40:22 dtucker Exp $
 #	Placed in the Public Domain.
 
 tid="disallow agent attach from other uid"
@@ -18,6 +18,7 @@
 	xdoas) ;;
 	x)
 		echo "need SUDO to switch to uid $UNPRIV"
+		echo SKIPPED
 		exit 0 ;;
 	*)
 		echo "unsupported $SUDO - "doas" and "sudo" are allowed"
diff --git a/regress/agent-pkcs11.sh b/regress/agent-pkcs11.sh
index 3aa20c8..db3018b 100644
--- a/regress/agent-pkcs11.sh
+++ b/regress/agent-pkcs11.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: agent-pkcs11.sh,v 1.2 2015/01/12 11:46:32 djm Exp $
+#	$OpenBSD: agent-pkcs11.sh,v 1.3 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="pkcs11 agent test"
@@ -53,7 +53,7 @@
 	fi
 
 	trace "pkcs11 connect via agent"
-	${SSH} -2 -F $OBJ/ssh_proxy somehost exit 5
+	${SSH} -F $OBJ/ssh_proxy somehost exit 5
 	r=$?
 	if [ $r -ne 5 ]; then
 		fail "ssh connect failed (exit code $r)"
diff --git a/regress/agent-ptrace.sh b/regress/agent-ptrace.sh
index bb676d6..2d795ee 100644
--- a/regress/agent-ptrace.sh
+++ b/regress/agent-ptrace.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: agent-ptrace.sh,v 1.2 2014/02/27 21:21:25 djm Exp $
+#	$OpenBSD: agent-ptrace.sh,v 1.3 2015/09/11 04:55:01 djm Exp $
 #	Placed in the Public Domain.
 
 tid="disallow agent ptrace attach"
diff --git a/regress/agent.sh b/regress/agent.sh
index c5e2794..7111056 100644
--- a/regress/agent.sh
+++ b/regress/agent.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: agent.sh,v 1.11 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: agent.sh,v 1.13 2017/12/19 00:49:30 djm Exp $
 #	Placed in the Public Domain.
 
 tid="simple agent test"
@@ -12,70 +12,106 @@
 eval `${SSHAGENT} -s` > /dev/null
 r=$?
 if [ $r -ne 0 ]; then
-	fail "could not start ssh-agent: exit code $r"
-else
-	${SSHADD} -l > /dev/null 2>&1
-	if [ $? -ne 1 ]; then
-		fail "ssh-add -l did not fail with exit code 1"
-	fi
-	trace "overwrite authorized keys"
-	printf '' > $OBJ/authorized_keys_$USER
-	for t in ${SSH_KEYTYPES}; do
-		# generate user key for agent
-		rm -f $OBJ/$t-agent
-		${SSHKEYGEN} -q -N '' -t $t -f $OBJ/$t-agent ||\
-			 fail "ssh-keygen for $t-agent failed"
-		# add to authorized keys
-		cat $OBJ/$t-agent.pub >> $OBJ/authorized_keys_$USER
-		# add privat key to agent
-		${SSHADD} $OBJ/$t-agent > /dev/null 2>&1
-		if [ $? -ne 0 ]; then
-			fail "ssh-add did succeed exit code 0"
-		fi
-	done
-	${SSHADD} -l > /dev/null 2>&1
-	r=$?
-	if [ $r -ne 0 ]; then
-		fail "ssh-add -l failed: exit code $r"
-	fi
-	# the same for full pubkey output
-	${SSHADD} -L > /dev/null 2>&1
-	r=$?
-	if [ $r -ne 0 ]; then
-		fail "ssh-add -L failed: exit code $r"
-	fi
-
-	trace "simple connect via agent"
-	for p in ${SSH_PROTOCOLS}; do
-		${SSH} -$p -F $OBJ/ssh_proxy somehost exit 5$p
-		r=$?
-		if [ $r -ne 5$p ]; then
-			fail "ssh connect with protocol $p failed (exit code $r)"
-		fi
-	done
-
-	trace "agent forwarding"
-	for p in ${SSH_PROTOCOLS}; do
-		${SSH} -A -$p -F $OBJ/ssh_proxy somehost ${SSHADD} -l > /dev/null 2>&1
-		r=$?
-		if [ $r -ne 0 ]; then
-			fail "ssh-add -l via agent fwd proto $p failed (exit code $r)"
-		fi
-		${SSH} -A -$p -F $OBJ/ssh_proxy somehost \
-			"${SSH} -$p -F $OBJ/ssh_proxy somehost exit 5$p"
-		r=$?
-		if [ $r -ne 5$p ]; then
-			fail "agent fwd proto $p failed (exit code $r)"
-		fi
-	done
-
-	trace "delete all agent keys"
-	${SSHADD} -D > /dev/null 2>&1
-	r=$?
-	if [ $r -ne 0 ]; then
-		fail "ssh-add -D failed: exit code $r"
-	fi
-
-	trace "kill agent"
-	${SSHAGENT} -k > /dev/null
+	fatal "could not start ssh-agent: exit code $r"
 fi
+
+${SSHADD} -l > /dev/null 2>&1
+if [ $? -ne 1 ]; then
+	fail "ssh-add -l did not fail with exit code 1"
+fi
+
+rm -f $OBJ/user_ca_key $OBJ/user_ca_key.pub
+${SSHKEYGEN} -q -N '' -t ed25519 -f $OBJ/user_ca_key \
+	|| fatal "ssh-keygen failed"
+
+trace "overwrite authorized keys"
+printf '' > $OBJ/authorized_keys_$USER
+
+for t in ${SSH_KEYTYPES}; do
+	# generate user key for agent
+	rm -f $OBJ/$t-agent $OBJ/$t-agent.pub*
+	${SSHKEYGEN} -q -N '' -t $t -f $OBJ/$t-agent ||\
+		 fatal "ssh-keygen for $t-agent failed"
+	# Make a certificate for each too.
+	${SSHKEYGEN} -qs $OBJ/user_ca_key -I "$t cert" \
+		-n estragon $OBJ/$t-agent.pub || fatal "ca sign failed"
+
+	# add to authorized keys
+	cat $OBJ/$t-agent.pub >> $OBJ/authorized_keys_$USER
+	# add privat key to agent
+	${SSHADD} $OBJ/$t-agent > /dev/null 2>&1
+	if [ $? -ne 0 ]; then
+		fail "ssh-add did succeed exit code 0"
+	fi
+	# Remove private key to ensure that we aren't accidentally using it.
+	rm -f $OBJ/$t-agent
+done
+
+# Remove explicit identity directives from ssh_proxy
+mv $OBJ/ssh_proxy $OBJ/ssh_proxy_bak
+grep -vi identityfile $OBJ/ssh_proxy_bak > $OBJ/ssh_proxy
+
+${SSHADD} -l > /dev/null 2>&1
+r=$?
+if [ $r -ne 0 ]; then
+	fail "ssh-add -l failed: exit code $r"
+fi
+# the same for full pubkey output
+${SSHADD} -L > /dev/null 2>&1
+r=$?
+if [ $r -ne 0 ]; then
+	fail "ssh-add -L failed: exit code $r"
+fi
+
+trace "simple connect via agent"
+${SSH} -F $OBJ/ssh_proxy somehost exit 52
+r=$?
+if [ $r -ne 52 ]; then
+	fail "ssh connect with failed (exit code $r)"
+fi
+
+for t in ${SSH_KEYTYPES}; do
+	trace "connect via agent using $t key"
+	${SSH} -F $OBJ/ssh_proxy -i $OBJ/$t-agent.pub -oIdentitiesOnly=yes \
+		somehost exit 52
+	r=$?
+	if [ $r -ne 52 ]; then
+		fail "ssh connect with failed (exit code $r)"
+	fi
+done
+
+trace "agent forwarding"
+${SSH} -A -F $OBJ/ssh_proxy somehost ${SSHADD} -l > /dev/null 2>&1
+r=$?
+if [ $r -ne 0 ]; then
+	fail "ssh-add -l via agent fwd failed (exit code $r)"
+fi
+${SSH} -A -F $OBJ/ssh_proxy somehost \
+	"${SSH} -F $OBJ/ssh_proxy somehost exit 52"
+r=$?
+if [ $r -ne 52 ]; then
+	fail "agent fwd failed (exit code $r)"
+fi
+
+(printf 'cert-authority,principals="estragon" '; cat $OBJ/user_ca_key.pub) \
+	> $OBJ/authorized_keys_$USER
+for t in ${SSH_KEYTYPES}; do
+	trace "connect via agent using $t key"
+	${SSH} -F $OBJ/ssh_proxy -i $OBJ/$t-agent.pub \
+		-oCertificateFile=$OBJ/$t-agent-cert.pub \
+		-oIdentitiesOnly=yes somehost exit 52
+	r=$?
+	if [ $r -ne 52 ]; then
+		fail "ssh connect with failed (exit code $r)"
+	fi
+done
+
+trace "delete all agent keys"
+${SSHADD} -D > /dev/null 2>&1
+r=$?
+if [ $r -ne 0 ]; then
+	fail "ssh-add -D failed: exit code $r"
+fi
+
+trace "kill agent"
+${SSHAGENT} -k > /dev/null
diff --git a/regress/allow-deny-users.sh b/regress/allow-deny-users.sh
index 86805e1..5c38951 100644
--- a/regress/allow-deny-users.sh
+++ b/regress/allow-deny-users.sh
@@ -1,5 +1,6 @@
 # Public Domain
 # Zev Weiss, 2016
+# $OpenBSD: allow-deny-users.sh,v 1.5 2018/07/13 02:13:50 djm Exp $
 
 tid="AllowUsers/DenyUsers"
 
@@ -9,6 +10,8 @@
 fi
 other="nobody"
 
+cp $OBJ/sshd_proxy $OBJ/sshd_proxy.orig
+
 test_auth()
 {
 	deny="$1"
@@ -16,17 +19,19 @@
 	should_succeed="$3"
 	failmsg="$4"
 
+	cp $OBJ/sshd_proxy.orig $OBJ/sshd_proxy
+	echo DenyUsers="$deny" >> $OBJ/sshd_proxy
+	echo AllowUsers="$allow" >> $OBJ/sshd_proxy
+
 	start_sshd -oDenyUsers="$deny" -oAllowUsers="$allow"
 
-	${SSH} -F $OBJ/ssh_config "$me@somehost" true
+	${SSH} -F $OBJ/ssh_proxy "$me@somehost" true
 	status=$?
 
 	if (test $status -eq 0 && ! $should_succeed) \
 	    || (test $status -ne 0 && $should_succeed); then
 		fail "$failmsg"
 	fi
-
-	stop_sshd
 }
 
 #         DenyUsers     AllowUsers    should_succeed  failure_message
diff --git a/regress/authinfo.sh b/regress/authinfo.sh
new file mode 100644
index 0000000..693424a
--- /dev/null
+++ b/regress/authinfo.sh
@@ -0,0 +1,17 @@
+#	$OpenBSD: authinfo.sh,v 1.3 2018/04/10 00:13:27 djm Exp $
+#	Placed in the Public Domain.
+
+tid="authinfo"
+
+# Ensure the environment variable doesn't leak when ExposeAuthInfo=no.
+verbose "ExposeAuthInfo=no"
+env SSH_USER_AUTH=blah ${SSH} -F $OBJ/ssh_proxy x \
+	'env | grep SSH_USER_AUTH >/dev/null' && fail "SSH_USER_AUTH present"
+
+verbose "ExposeAuthInfo=yes"
+echo ExposeAuthInfo=yes >> $OBJ/sshd_proxy
+${SSH} -F $OBJ/ssh_proxy x \
+	'grep ^publickey "$SSH_USER_AUTH" /dev/null >/dev/null' ||
+	fail "ssh with ExposeAuthInfo failed"
+
+# XXX test multiple auth and key contents
diff --git a/regress/banner.sh b/regress/banner.sh
index 0b9c950..0d9654f 100644
--- a/regress/banner.sh
+++ b/regress/banner.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: banner.sh,v 1.2 2003/10/11 11:49:49 dtucker Exp $
+#	$OpenBSD: banner.sh,v 1.3 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="banner"
@@ -9,7 +9,7 @@
 
 trace "test missing banner file"
 verbose "test $tid: missing banner file"
-( ${SSH} -2 -F $OBJ/ssh_proxy otherhost true 2>$OBJ/banner.out && \
+( ${SSH} -F $OBJ/ssh_proxy otherhost true 2>$OBJ/banner.out && \
 	cmp $OBJ/empty.in $OBJ/banner.out ) || \
 	fail "missing banner file"
 
@@ -30,14 +30,14 @@
 
 	trace "test banner size $s"
 	verbose "test $tid: size $s"
-	( ${SSH} -2 -F $OBJ/ssh_proxy otherhost true 2>$OBJ/banner.out && \
+	( ${SSH} -F $OBJ/ssh_proxy otherhost true 2>$OBJ/banner.out && \
 		cmp $OBJ/banner.in $OBJ/banner.out ) || \
 		fail "banner size $s mismatch"
 done
 
 trace "test suppress banner (-q)"
 verbose "test $tid: suppress banner (-q)"
-( ${SSH} -q -2 -F $OBJ/ssh_proxy otherhost true 2>$OBJ/banner.out && \
+( ${SSH} -q -F $OBJ/ssh_proxy otherhost true 2>$OBJ/banner.out && \
 	cmp $OBJ/empty.in $OBJ/banner.out ) || \
 	fail "suppress banner (-q)"
 
diff --git a/regress/broken-pipe.sh b/regress/broken-pipe.sh
index a416f7a..c69276e 100644
--- a/regress/broken-pipe.sh
+++ b/regress/broken-pipe.sh
@@ -1,15 +1,12 @@
-#	$OpenBSD: broken-pipe.sh,v 1.5 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: broken-pipe.sh,v 1.6 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="broken pipe test"
 
-for p in ${SSH_PROTOCOLS}; do
-	trace "protocol $p"
-	for i in 1 2 3 4; do
-		${SSH} -$p -F $OBJ/ssh_config_config nexthost echo $i 2> /dev/null | true
-		r=$?
-		if [ $r -ne 0 ]; then
-			fail "broken pipe returns $r for protocol $p"
-		fi
-	done
+for i in 1 2 3 4; do
+	${SSH} -F $OBJ/ssh_config_config nexthost echo $i 2> /dev/null | true
+	r=$?
+	if [ $r -ne 0 ]; then
+		fail "broken pipe returns $r"
+	fi
 done
diff --git a/regress/brokenkeys.sh b/regress/brokenkeys.sh
index 3e70c34..9d5a54f 100644
--- a/regress/brokenkeys.sh
+++ b/regress/brokenkeys.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: brokenkeys.sh,v 1.1 2004/10/29 23:59:22 djm Exp $
+#	$OpenBSD: brokenkeys.sh,v 1.2 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="broken keys"
@@ -14,9 +14,9 @@
 cat ${KEYS}.bak >> ${KEYS}
 cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
 
-${SSH} -2 -F $OBJ/ssh_config somehost true
+${SSH} -F $OBJ/ssh_config somehost true
 if [ $? -ne 0 ]; then
-	fail "ssh connect with protocol $p failed"
+	fail "ssh connect with failed"
 fi
 
 mv ${KEYS}.bak ${KEYS}
diff --git a/regress/cert-file.sh b/regress/cert-file.sh
index b184e7f..1157a35 100644
--- a/regress/cert-file.sh
+++ b/regress/cert-file.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: cert-file.sh,v 1.4 2016/12/16 02:48:55 djm Exp $
+#	$OpenBSD: cert-file.sh,v 1.7 2018/04/10 00:14:10 djm Exp $
 #	Placed in the Public Domain.
 
 tid="ssh with certificates"
@@ -17,72 +17,101 @@
 	fatal "ssh-keygen failed"
 ${SSHKEYGEN} -q -N '' -t ed25519 -f $OBJ/user_key2 || \
 	fatal "ssh-keygen failed"
+${SSHKEYGEN} -q -N '' -t ed25519 -f $OBJ/user_key3 || \
+	fatal "ssh-keygen failed"
+${SSHKEYGEN} -q -N '' -t ed25519 -f $OBJ/user_key4 || \
+	fatal "ssh-keygen failed"
+${SSHKEYGEN} -q -N '' -t ed25519 -f $OBJ/user_key5 || \
+	fatal "ssh-keygen failed"
+
 # Move the certificate to a different address to better control
 # when it is offered.
 ${SSHKEYGEN} -q -s $OBJ/user_ca_key1 -I "regress user key for $USER" \
 	-z $$ -n ${USER} $OBJ/user_key1 ||
-		fail "couldn't sign user_key1 with user_ca_key1"
+		fatal "couldn't sign user_key1 with user_ca_key1"
 mv $OBJ/user_key1-cert.pub $OBJ/cert_user_key1_1.pub
 ${SSHKEYGEN} -q -s $OBJ/user_ca_key2 -I "regress user key for $USER" \
 	-z $$ -n ${USER} $OBJ/user_key1 ||
-		fail "couldn't sign user_key1 with user_ca_key2"
+		fatal "couldn't sign user_key1 with user_ca_key2"
 mv $OBJ/user_key1-cert.pub $OBJ/cert_user_key1_2.pub
+${SSHKEYGEN} -q -s $OBJ/user_ca_key1 -I "regress user key for $USER" \
+	-z $$ -n ${USER} $OBJ/user_key3 ||
+		fatal "couldn't sign user_key3 with user_ca_key1"
+rm $OBJ/user_key3.pub # to test use of private key w/o public half.
+${SSHKEYGEN} -q -s $OBJ/user_ca_key1 -I "regress user key for $USER" \
+	-z $$ -n ${USER} $OBJ/user_key4 ||
+		fatal "couldn't sign user_key4 with user_ca_key1"
+rm $OBJ/user_key4 $OBJ/user_key4.pub # to test no matching pub/private key case.
 
 trace 'try with identity files'
 opts="-F $OBJ/ssh_proxy -oIdentitiesOnly=yes"
 opts2="$opts -i $OBJ/user_key1 -i $OBJ/user_key2"
 echo "cert-authority $(cat $OBJ/user_ca_key1.pub)" > $OBJ/authorized_keys_$USER
 
-for p in ${SSH_PROTOCOLS}; do
-	# Just keys should fail
-	${SSH} $opts2 somehost exit 5$p
-	r=$?
-	if [ $r -eq 5$p ]; then
-		fail "ssh succeeded with no certs in protocol $p"
-	fi
+# Make a clean config that doesn't have any pre-added identities.
+cat $OBJ/ssh_proxy | grep -v IdentityFile > $OBJ/no_identity_config
 
-	# Keys with untrusted cert should fail.
-	opts3="$opts2 -oCertificateFile=$OBJ/cert_user_key1_2.pub"
-	${SSH} $opts3 somehost exit 5$p
-	r=$?
-	if [ $r -eq 5$p ]; then
-		fail "ssh succeeded with bad cert in protocol $p"
-	fi
+# XXX: verify that certificate used was what we expect. Needs exposure of
+# keys via environment variable or similar.
 
-	# Good cert with bad key should fail.
-	opts3="$opts -i $OBJ/user_key2"
-	opts3="$opts3 -oCertificateFile=$OBJ/cert_user_key1_1.pub"
-	${SSH} $opts3 somehost exit 5$p
-	r=$?
-	if [ $r -eq 5$p ]; then
-		fail "ssh succeeded with no matching key in protocol $p"
-	fi
+	# Key with no .pub should work - finding the equivalent *-cert.pub.
+verbose "identity cert with no plain public file"
+${SSH} -F $OBJ/no_identity_config -oIdentitiesOnly=yes \
+    -i $OBJ/user_key3 somehost exit 52
+[ $? -ne 52 ] && fail "ssh failed"
 
-	# Keys with one trusted cert, should succeed.
-	opts3="$opts2 -oCertificateFile=$OBJ/cert_user_key1_1.pub"
-	${SSH} $opts3 somehost exit 5$p
-	r=$?
-	if [ $r -ne 5$p ]; then
-		fail "ssh failed with trusted cert and key in protocol $p"
-	fi
+# CertificateFile matching private key with no .pub file should work.
+verbose "CertificateFile with no plain public file"
+${SSH} -F $OBJ/no_identity_config -oIdentitiesOnly=yes \
+    -oCertificateFile=$OBJ/user_key3-cert.pub \
+    -i $OBJ/user_key3 somehost exit 52
+[ $? -ne 52 ] && fail "ssh failed"
 
-	# Multiple certs and keys, with one trusted cert, should succeed.
-	opts3="$opts2 -oCertificateFile=$OBJ/cert_user_key1_2.pub"
-	opts3="$opts3 -oCertificateFile=$OBJ/cert_user_key1_1.pub"
-	${SSH} $opts3 somehost exit 5$p
-	r=$?
-	if [ $r -ne 5$p ]; then
-		fail "ssh failed with multiple certs in protocol $p"
-	fi
+# Just keys should fail
+verbose "plain keys"
+${SSH} $opts2 somehost exit 52
+r=$?
+if [ $r -eq 52 ]; then
+	fail "ssh succeeded with no certs"
+fi
 
-	#Keys with trusted certificate specified in config options, should succeed.
-	opts3="$opts2 -oCertificateFile=$OBJ/cert_user_key1_1.pub"
-	${SSH} $opts3 somehost exit 5$p
-	r=$?
-	if [ $r -ne 5$p ]; then
-		fail "ssh failed with trusted cert in config in protocol $p"
-	fi
-done
+# Keys with untrusted cert should fail.
+verbose "untrusted cert"
+opts3="$opts2 -oCertificateFile=$OBJ/cert_user_key1_2.pub"
+${SSH} $opts3 somehost exit 52
+r=$?
+if [ $r -eq 52 ]; then
+	fail "ssh succeeded with bad cert"
+fi
+
+# Good cert with bad key should fail.
+verbose "good cert, bad key"
+opts3="$opts -i $OBJ/user_key2"
+opts3="$opts3 -oCertificateFile=$OBJ/cert_user_key1_1.pub"
+${SSH} $opts3 somehost exit 52
+r=$?
+if [ $r -eq 52 ]; then
+	fail "ssh succeeded with no matching key"
+fi
+
+# Keys with one trusted cert, should succeed.
+verbose "single trusted"
+opts3="$opts2 -oCertificateFile=$OBJ/cert_user_key1_1.pub"
+${SSH} $opts3 somehost exit 52
+r=$?
+if [ $r -ne 52 ]; then
+	fail "ssh failed with trusted cert and key"
+fi
+
+# Multiple certs and keys, with one trusted cert, should succeed.
+verbose "multiple trusted"
+opts3="$opts2 -oCertificateFile=$OBJ/cert_user_key1_2.pub"
+opts3="$opts3 -oCertificateFile=$OBJ/cert_user_key1_1.pub"
+${SSH} $opts3 somehost exit 52
+r=$?
+if [ $r -ne 52 ]; then
+	fail "ssh failed with multiple certs"
+fi
 
 #next, using an agent in combination with the keys
 SSH_AUTH_SOCK=/nonexistent ${SSHADD} -l > /dev/null 2>&1
@@ -108,26 +137,25 @@
 fi
 
 # try ssh with the agent and certificates
-# note: ssh agent only uses certificates in protocol 2
 opts="-F $OBJ/ssh_proxy"
-# with no certificates, shoud fail
-${SSH} -2 $opts somehost exit 52
+# with no certificates, should fail
+${SSH} $opts somehost exit 52
 if [ $? -eq 52 ]; then
-	fail "ssh connect with agent in protocol 2 succeeded with no cert"
+	fail "ssh connect with agent in succeeded with no cert"
 fi
 
 #with an untrusted certificate, should fail
 opts="$opts -oCertificateFile=$OBJ/cert_user_key1_2.pub"
-${SSH} -2 $opts somehost exit 52
+${SSH} $opts somehost exit 52
 if [ $? -eq 52 ]; then
-	fail "ssh connect with agent in protocol 2 succeeded with bad cert"
+	fail "ssh connect with agent in succeeded with bad cert"
 fi
 
 #with an additional trusted certificate, should succeed
 opts="$opts -oCertificateFile=$OBJ/cert_user_key1_1.pub"
-${SSH} -2 $opts somehost exit 52
+${SSH} $opts somehost exit 52
 if [ $? -ne 52 ]; then
-	fail "ssh connect with agent in protocol 2 failed with good cert"
+	fail "ssh connect with agent in failed with good cert"
 fi
 
 trace "kill agent"
diff --git a/regress/cert-hostkey.sh b/regress/cert-hostkey.sh
index 62261cf..d2ecd31 100644
--- a/regress/cert-hostkey.sh
+++ b/regress/cert-hostkey.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: cert-hostkey.sh,v 1.14 2016/05/02 09:52:00 djm Exp $
+#	$OpenBSD: cert-hostkey.sh,v 1.16 2018/07/03 11:43:49 djm Exp $
 #	Placed in the Public Domain.
 
 tid="certified host keys"
@@ -14,6 +14,13 @@
 		continue
 	fi
 	case "$i" in
+	# Special treatment for RSA keys.
+	*rsa*cert*)
+		types="rsa-sha2-256-cert-v01@openssh.com,$i,$types"
+		types="rsa-sha2-512-cert-v01@openssh.com,$types";;
+	*rsa*)
+		types="$types,rsa-sha2-512,rsa-sha2-256,$i";;
+	# Prefer certificate to plain keys.
 	*cert*)	types="$i,$types";;
 	*)	types="$types,$i";;
 	esac
@@ -104,7 +111,7 @@
 	shift; shift
 	verbose "$tid: $_ident expect success $_expect_success"
 	cp $OBJ/known_hosts-cert.orig $OBJ/known_hosts-cert
-	${SSH} -2 -oUserKnownHostsFile=$OBJ/known_hosts-cert \
+	${SSH} -oUserKnownHostsFile=$OBJ/known_hosts-cert \
 	    -oGlobalKnownHostsFile=$OBJ/known_hosts-cert \
 	    "$@" -F $OBJ/ssh_proxy somehost true
 	_r=$?
@@ -169,7 +176,7 @@
 		) > $OBJ/sshd_proxy
 
 		cp $OBJ/known_hosts-cert.orig $OBJ/known_hosts-cert
-		${SSH} -2 -oUserKnownHostsFile=$OBJ/known_hosts-cert \
+		${SSH} -oUserKnownHostsFile=$OBJ/known_hosts-cert \
 		    -oGlobalKnownHostsFile=$OBJ/known_hosts-cert \
 			-F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
@@ -190,7 +197,7 @@
 		echo HostCertificate $OBJ/cert_host_key_${ktype}-cert.pub
 	) > $OBJ/sshd_proxy
 	cp $OBJ/known_hosts-cert.orig $OBJ/known_hosts-cert
-	${SSH} -2 -oUserKnownHostsFile=$OBJ/known_hosts-cert \
+	${SSH} -oUserKnownHostsFile=$OBJ/known_hosts-cert \
 	    -oGlobalKnownHostsFile=$OBJ/known_hosts-cert \
 		-F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 	if [ $? -eq 0 ]; then
@@ -222,7 +229,7 @@
 		) > $OBJ/sshd_proxy
 
 		cp $OBJ/known_hosts-cert.orig $OBJ/known_hosts-cert
-		${SSH} -2 -oUserKnownHostsFile=$OBJ/known_hosts-cert \
+		${SSH} -oUserKnownHostsFile=$OBJ/known_hosts-cert \
 		    -oGlobalKnownHostsFile=$OBJ/known_hosts-cert \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		rc=$?
@@ -271,7 +278,7 @@
 		echo HostCertificate $OBJ/cert_host_key_${ktype}-cert.pub
 	) > $OBJ/sshd_proxy
 
-	${SSH} -2 -oUserKnownHostsFile=$OBJ/known_hosts-cert \
+	${SSH} -oUserKnownHostsFile=$OBJ/known_hosts-cert \
 	    -oGlobalKnownHostsFile=$OBJ/known_hosts-cert \
 		-F $OBJ/ssh_proxy somehost true
 	if [ $? -ne 0 ]; then
@@ -303,7 +310,7 @@
 	) > $OBJ/sshd_proxy
 
 	cp $OBJ/known_hosts-cert.orig $OBJ/known_hosts-cert
-	${SSH} -2 -oUserKnownHostsFile=$OBJ/known_hosts-cert \
+	${SSH} -oUserKnownHostsFile=$OBJ/known_hosts-cert \
 	    -oGlobalKnownHostsFile=$OBJ/known_hosts-cert \
 		-F $OBJ/ssh_proxy -q somehost true >/dev/null 2>&1
 	if [ $? -eq 0 ]; then
diff --git a/regress/cert-userkey.sh b/regress/cert-userkey.sh
index 7005fd5..30c2c15 100644
--- a/regress/cert-userkey.sh
+++ b/regress/cert-userkey.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: cert-userkey.sh,v 1.17 2016/11/30 03:01:33 djm Exp $
+#	$OpenBSD: cert-userkey.sh,v 1.19 2018/03/12 00:54:04 djm Exp $
 #	Placed in the Public Domain.
 
 tid="certified user keys"
@@ -8,6 +8,7 @@
 cp $OBJ/ssh_proxy $OBJ/ssh_proxy_bak
 
 PLAIN_TYPES=`$SSH -Q key-plain | sed 's/^ssh-dss/ssh-dsa/;s/^ssh-//'`
+EXTRA_TYPES=""
 
 if echo "$PLAIN_TYPES" | grep '^rsa$' >/dev/null 2>&1 ; then
 	PLAIN_TYPES="$PLAIN_TYPES rsa-sha2-256 rsa-sha2-512"
@@ -15,7 +16,7 @@
 
 kname() {
 	case $ktype in
-	rsa-sha2-*) ;;
+	rsa-sha2-*) n="$ktype" ;;
 	# subshell because some seds will add a newline
 	*) n=$(echo $1 | sed 's/^dsa/ssh-dss/;s/^rsa/ssh-rsa/;s/^ed/ssh-ed/') ;;
 	esac
@@ -67,7 +68,7 @@
 		# Missing authorized_principals
 		verbose "$tid: ${_prefix} missing authorized_principals"
 		rm -f $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -76,7 +77,7 @@
 		# Empty authorized_principals
 		verbose "$tid: ${_prefix} empty authorized_principals"
 		echo > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -85,7 +86,7 @@
 		# Wrong authorized_principals
 		verbose "$tid: ${_prefix} wrong authorized_principals"
 		echo gregorsamsa > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -94,7 +95,7 @@
 		# Correct authorized_principals
 		verbose "$tid: ${_prefix} correct authorized_principals"
 		echo mekmitasdigoat > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -ne 0 ]; then
 			fail "ssh cert connect failed"
@@ -103,7 +104,7 @@
 		# authorized_principals with bad key option
 		verbose "$tid: ${_prefix} authorized_principals bad key opt"
 		echo 'blah mekmitasdigoat' > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -113,7 +114,7 @@
 		verbose "$tid: ${_prefix} authorized_principals command=false"
 		echo 'command="false" mekmitasdigoat' > \
 		    $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -124,7 +125,7 @@
 		verbose "$tid: ${_prefix} authorized_principals command=true"
 		echo 'command="true" mekmitasdigoat' > \
 		    $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost false >/dev/null 2>&1
 		if [ $? -ne 0 ]; then
 			fail "ssh cert connect failed"
@@ -148,7 +149,7 @@
 			printf 'cert-authority,principals="gregorsamsa" '
 			cat $OBJ/user_ca_key.pub
 		) > $OBJ/authorized_keys_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -160,7 +161,7 @@
 			printf 'cert-authority,principals="mekmitasdigoat" '
 			cat $OBJ/user_ca_key.pub
 		) > $OBJ/authorized_keys_$USER
-		${SSH} -2i $OBJ/cert_user_key_${ktype} \
+		${SSH} -i $OBJ/cert_user_key_${ktype} \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -ne 0 ]; then
 			fail "ssh cert connect failed"
@@ -198,7 +199,7 @@
 				echo "PubkeyAcceptedKeyTypes ${t}"
 			) > $OBJ/ssh_proxy
 
-			${SSH} -2i $OBJ/cert_user_key_${ktype} \
+			${SSH} -i $OBJ/cert_user_key_${ktype} \
 			    -F $OBJ/ssh_proxy somehost true
 			if [ $? -ne 0 ]; then
 				fail "ssh cert connect failed"
@@ -215,7 +216,7 @@
 			) > $OBJ/sshd_proxy
 			cp $OBJ/cert_user_key_${ktype}.pub \
 			    $OBJ/cert_user_key_revoked
-			${SSH} -2i $OBJ/cert_user_key_${ktype} \
+			${SSH} -i $OBJ/cert_user_key_${ktype} \
 			    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 			if [ $? -eq 0 ]; then
 				fail "ssh cert connect succeeded unexpecedly"
@@ -224,14 +225,14 @@
 			rm $OBJ/cert_user_key_revoked
 			${SSHKEYGEN} -kqf $OBJ/cert_user_key_revoked \
 			    $OBJ/cert_user_key_${ktype}.pub
-			${SSH} -2i $OBJ/cert_user_key_${ktype} \
+			${SSH} -i $OBJ/cert_user_key_${ktype} \
 			    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 			if [ $? -eq 0 ]; then
 				fail "ssh cert connect succeeded unexpecedly"
 			fi
 			verbose "$tid: ${_prefix} empty KRL"
 			${SSHKEYGEN} -kqf $OBJ/cert_user_key_revoked
-			${SSH} -2i $OBJ/cert_user_key_${ktype} \
+			${SSH} -i $OBJ/cert_user_key_${ktype} \
 			    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 			if [ $? -ne 0 ]; then
 				fail "ssh cert connect failed"
@@ -246,7 +247,7 @@
 			echo "PubkeyAcceptedKeyTypes ${t}"
 			echo "$extra_sshd"
 		) > $OBJ/sshd_proxy
-		${SSH} -2i $OBJ/cert_user_key_${ktype} -F $OBJ/ssh_proxy \
+		${SSH} -i $OBJ/cert_user_key_${ktype} -F $OBJ/ssh_proxy \
 		    somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpecedly"
@@ -260,7 +261,7 @@
 		echo "$extra_sshd"
 	) > $OBJ/sshd_proxy
 	verbose "$tid: ensure CA key does not authenticate user"
-	${SSH} -2i $OBJ/user_ca_key \
+	${SSH} -i $OBJ/user_ca_key \
 	    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 	if [ $? -eq 0 ]; then
 		fail "ssh cert connect with CA key succeeded unexpectedly"
@@ -307,7 +308,7 @@
 			    $sign_opts $OBJ/cert_user_key_${ktype} ||
 				fail "couldn't sign cert_user_key_${ktype}"
 
-			${SSH} -2i $OBJ/cert_user_key_${ktype} \
+			${SSH} -i $OBJ/cert_user_key_${ktype} \
 			    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 			rc=$?
 			if [ "x$result" = "xsuccess" ] ; then
@@ -378,7 +379,7 @@
 	    -n $USER $OBJ/cert_user_key_${ktype} ||
 		fatal "couldn't sign cert_user_key_${ktype}"
 	verbose "$tid: user ${ktype} connect wrong cert"
-	${SSH} -2i $OBJ/cert_user_key_${ktype} -F $OBJ/ssh_proxy \
+	${SSH} -i $OBJ/cert_user_key_${ktype} -F $OBJ/ssh_proxy \
 	    somehost true >/dev/null 2>&1
 	if [ $? -eq 0 ]; then
 		fail "ssh cert connect $ident succeeded unexpectedly"
diff --git a/regress/cfgmatch.sh b/regress/cfgmatch.sh
index 0562963..dd11e40 100644
--- a/regress/cfgmatch.sh
+++ b/regress/cfgmatch.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: cfgmatch.sh,v 1.9 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: cfgmatch.sh,v 1.11 2017/10/04 18:50:23 djm Exp $
 #	Placed in the Public Domain.
 
 tid="sshd_config match"
@@ -13,7 +13,7 @@
 start_client()
 {
 	rm -f $pidfile
-	${SSH} -q -$p $fwd "$@" somehost \
+	${SSH} -q $fwd "$@" somehost \
 	    exec sh -c \'"echo \$\$ > $pidfile; exec sleep 100"\' \
 	    >>$TEST_REGRESS_LOGFILE 2>&1 &
 	client_pid=$!
@@ -41,7 +41,7 @@
 cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak
 echo "PermitOpen 127.0.0.1:1" >>$OBJ/sshd_config
 echo "Match Address 127.0.0.1" >>$OBJ/sshd_config
-echo "PermitOpen 127.0.0.1:$PORT" >>$OBJ/sshd_config
+echo "PermitOpen 127.0.0.1:2 127.0.0.1:3 127.0.0.1:$PORT" >>$OBJ/sshd_config
 
 grep -v AuthorizedKeysFile $OBJ/sshd_proxy_bak > $OBJ/sshd_proxy
 echo "AuthorizedKeysFile /dev/null" >>$OBJ/sshd_proxy
@@ -49,29 +49,25 @@
 echo "Match user $USER" >>$OBJ/sshd_proxy
 echo "AuthorizedKeysFile /dev/null $OBJ/authorized_keys_%u" >>$OBJ/sshd_proxy
 echo "Match Address 127.0.0.1" >>$OBJ/sshd_proxy
-echo "PermitOpen 127.0.0.1:$PORT" >>$OBJ/sshd_proxy
+echo "PermitOpen 127.0.0.1:2 127.0.0.1:3 127.0.0.1:$PORT" >>$OBJ/sshd_proxy
 
 start_sshd
 
 #set -x
 
 # Test Match + PermitOpen in sshd_config.  This should be permitted
-for p in ${SSH_PROTOCOLS}; do
-	trace "match permitopen localhost proto $p"
-	start_client -F $OBJ/ssh_config
-	${SSH} -q -$p -p $fwdport -F $OBJ/ssh_config somehost true || \
-	    fail "match permitopen permit proto $p"
-	stop_client
-done
+trace "match permitopen localhost"
+start_client -F $OBJ/ssh_config
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "match permitopen permit"
+stop_client
 
 # Same but from different source.  This should not be permitted
-for p in ${SSH_PROTOCOLS}; do
-	trace "match permitopen proxy proto $p"
-	start_client -F $OBJ/ssh_proxy
-	${SSH} -q -$p -p $fwdport -F $OBJ/ssh_config somehost true && \
-	    fail "match permitopen deny proto $p"
-	stop_client
-done
+trace "match permitopen proxy"
+start_client -F $OBJ/ssh_proxy
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true && \
+    fail "match permitopen deny"
+stop_client
 
 # Retry previous with key option, should also be denied.
 cp /dev/null $OBJ/authorized_keys_$USER
@@ -79,23 +75,19 @@
 	printf 'permitopen="127.0.0.1:'$PORT'" ' >> $OBJ/authorized_keys_$USER
 	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
 done
-for p in ${SSH_PROTOCOLS}; do
-	trace "match permitopen proxy w/key opts proto $p"
-	start_client -F $OBJ/ssh_proxy
-	${SSH} -q -$p -p $fwdport -F $OBJ/ssh_config somehost true && \
-	    fail "match permitopen deny w/key opt proto $p"
-	stop_client
-done
+trace "match permitopen proxy w/key opts"
+start_client -F $OBJ/ssh_proxy
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true && \
+    fail "match permitopen deny w/key opt"
+stop_client
 
 # Test both sshd_config and key options permitting the same dst/port pair.
 # Should be permitted.
-for p in ${SSH_PROTOCOLS}; do
-	trace "match permitopen localhost proto $p"
-	start_client -F $OBJ/ssh_config
-	${SSH} -q -$p -p $fwdport -F $OBJ/ssh_config somehost true || \
-	    fail "match permitopen permit proto $p"
-	stop_client
-done
+trace "match permitopen localhost"
+start_client -F $OBJ/ssh_config
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "match permitopen permit"
+stop_client
 
 cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
 echo "PermitOpen 127.0.0.1:1 127.0.0.1:$PORT 127.0.0.2:2" >>$OBJ/sshd_proxy
@@ -103,13 +95,11 @@
 echo "PermitOpen 127.0.0.1:1 127.0.0.1:2" >>$OBJ/sshd_proxy
 
 # Test that a Match overrides a PermitOpen in the global section
-for p in ${SSH_PROTOCOLS}; do
-	trace "match permitopen proxy w/key opts proto $p"
-	start_client -F $OBJ/ssh_proxy
-	${SSH} -q -$p -p $fwdport -F $OBJ/ssh_config somehost true && \
-	    fail "match override permitopen proto $p"
-	stop_client
-done
+trace "match permitopen proxy w/key opts"
+start_client -F $OBJ/ssh_proxy
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true && \
+    fail "match override permitopen"
+stop_client
 
 cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
 echo "PermitOpen 127.0.0.1:1 127.0.0.1:$PORT 127.0.0.2:2" >>$OBJ/sshd_proxy
@@ -118,10 +108,8 @@
 
 # Test that a rule that doesn't match doesn't override, plus test a
 # PermitOpen entry that's not at the start of the list
-for p in ${SSH_PROTOCOLS}; do
-	trace "nomatch permitopen proxy w/key opts proto $p"
-	start_client -F $OBJ/ssh_proxy
-	${SSH} -q -$p -p $fwdport -F $OBJ/ssh_config somehost true || \
-	    fail "nomatch override permitopen proto $p"
-	stop_client
-done
+trace "nomatch permitopen proxy w/key opts"
+start_client -F $OBJ/ssh_proxy
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "nomatch override permitopen"
+stop_client
diff --git a/regress/cfgmatchlisten.sh b/regress/cfgmatchlisten.sh
new file mode 100644
index 0000000..a4fd66b
--- /dev/null
+++ b/regress/cfgmatchlisten.sh
@@ -0,0 +1,202 @@
+#	$OpenBSD: cfgmatchlisten.sh,v 1.3 2018/07/02 14:13:30 dtucker Exp $
+#	Placed in the Public Domain.
+
+tid="sshd_config matchlisten"
+
+pidfile=$OBJ/remote_pid
+fwdport=3301
+fwdspec="localhost:${fwdport}"
+fwd="-R $fwdport:127.0.0.1:$PORT"
+
+echo "ExitOnForwardFailure=yes" >> $OBJ/ssh_config
+echo "ExitOnForwardFailure=yes" >> $OBJ/ssh_proxy
+
+start_client()
+{
+	rm -f $pidfile
+	${SSH} -vvv $fwd "$@" somehost true >>$TEST_REGRESS_LOGFILE 2>&1
+	r=$?
+	if [ $r -ne 0 ]; then
+		return $r
+	fi
+	${SSH} -vvv $fwd "$@" somehost \
+	    exec sh -c \'"echo \$\$ > $pidfile; exec sleep 100"\' \
+	    >>$TEST_REGRESS_LOGFILE 2>&1 &
+	client_pid=$!
+	# Wait for remote end
+	n=0
+	while test ! -f $pidfile ; do
+		sleep 1
+		n=`expr $n + 1`
+		if test $n -gt 60; then
+			kill $client_pid
+			fatal "timeout waiting for background ssh"
+		fi
+	done
+	return $r
+}
+
+expect_client_ok()
+{
+	start_client "$@" ||
+	    fail "client did not start"
+}
+
+expect_client_fail()
+{
+	local failmsg="$1"
+	shift
+	start_client "$@" &&
+	    fail $failmsg
+}
+
+stop_client()
+{
+	pid=`cat $pidfile`
+	if [ ! -z "$pid" ]; then
+		kill $pid
+	fi
+	wait
+}
+
+cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak
+echo "PermitListen 127.0.0.1:1" >>$OBJ/sshd_config
+echo "Match Address 127.0.0.1" >>$OBJ/sshd_config
+echo "PermitListen 127.0.0.1:2 127.0.0.1:3 $fwdspec" >>$OBJ/sshd_config
+
+grep -v AuthorizedKeysFile $OBJ/sshd_proxy_bak > $OBJ/sshd_proxy
+echo "AuthorizedKeysFile /dev/null" >>$OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1" >>$OBJ/sshd_proxy
+echo "Match user $USER" >>$OBJ/sshd_proxy
+echo "AuthorizedKeysFile /dev/null $OBJ/authorized_keys_%u" >>$OBJ/sshd_proxy
+echo "Match Address 127.0.0.1" >>$OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:2 127.0.0.1:3 $fwdspec" >>$OBJ/sshd_proxy
+
+start_sshd
+
+#set -x
+
+# Test Match + PermitListen in sshd_config.  This should be permitted
+trace "match permitlisten localhost"
+expect_client_ok -F $OBJ/ssh_config
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "match permitlisten permit"
+stop_client
+
+# Same but from different source.  This should not be permitted
+trace "match permitlisten proxy"
+expect_client_fail "match permitlisten deny" \
+    -F $OBJ/ssh_proxy
+
+# Retry previous with key option, should also be denied.
+cp /dev/null $OBJ/authorized_keys_$USER
+for t in ${SSH_KEYTYPES}; do
+	printf 'permitlisten="'$fwdspec'" ' >> $OBJ/authorized_keys_$USER
+	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
+done
+trace "match permitlisten proxy w/key opts"
+expect_client_fail "match permitlisten deny w/key opt"\
+    -F $OBJ/ssh_proxy
+
+# Test both sshd_config and key options permitting the same dst/port pair.
+# Should be permitted.
+trace "match permitlisten localhost"
+expect_client_ok -F $OBJ/ssh_config
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "match permitlisten permit"
+stop_client
+
+# Test that a bare port number is accepted in PermitListen
+cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1 $fwdport 127.0.0.2:2" >>$OBJ/sshd_proxy
+trace "match permitlisten bare"
+expect_client_ok -F $OBJ/ssh_config
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "match permitlisten bare"
+stop_client
+
+# Test that an incorrect bare port number is denied as expected
+cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
+echo "PermitListen 1 2 99" >>$OBJ/sshd_proxy
+trace "match permitlisten bare"
+expect_client_fail -F $OBJ/ssh_config
+
+cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1 $fwdspec 127.0.0.2:2" >>$OBJ/sshd_proxy
+echo "Match User $USER" >>$OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1 127.0.0.1:2" >>$OBJ/sshd_proxy
+
+# Test that a Match overrides a PermitListen in the global section
+trace "match permitlisten proxy w/key opts"
+expect_client_fail "match override permitlisten" \
+    -F $OBJ/ssh_proxy
+
+cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1 $fwdspec 127.0.0.2:2" >>$OBJ/sshd_proxy
+echo "Match User NoSuchUser" >>$OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1 127.0.0.1:2" >>$OBJ/sshd_proxy
+
+# Test that a rule that doesn't match doesn't override, plus test a
+# PermitListen entry that's not at the start of the list
+trace "nomatch permitlisten proxy w/key opts"
+expect_client_ok -F $OBJ/ssh_proxy
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "nomatch override permitlisten"
+stop_client
+
+# bind to 127.0.0.1 instead of default localhost
+fwdspec2="127.0.0.1:${fwdport}"
+fwd="-R ${fwdspec2}:127.0.0.1:$PORT"
+
+# first try w/ old fwdspec both in server config and key opts
+cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1 $fwdspec 127.0.0.2:2" >>$OBJ/sshd_proxy
+cp /dev/null $OBJ/authorized_keys_$USER
+for t in ${SSH_KEYTYPES}; do
+	printf 'permitlisten="'$fwdspec'" ' >> $OBJ/authorized_keys_$USER
+	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
+done
+trace "nomatch permitlisten 127.0.0.1 server config and userkey"
+expect_client_fail "nomatch 127.0.0.1 server config and userkey" \
+    -F $OBJ/ssh_config
+
+# correct server config, denied by key opts
+cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
+echo "PermitListen 127.0.0.1:1 ${fwdspec2} 127.0.0.2:2" >>$OBJ/sshd_proxy
+trace "nomatch permitlisten 127.0.0.1 w/key opts"
+expect_client_fail "nomatch 127.0.0.1 w/key opts" \
+    -F $OBJ/ssh_config
+
+# fix key opts
+cp /dev/null $OBJ/authorized_keys_$USER
+for t in ${SSH_KEYTYPES}; do
+	printf 'permitlisten="'$fwdspec2'" ' >> $OBJ/authorized_keys_$USER
+	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
+done
+trace "match permitlisten 127.0.0.1 server config w/key opts"
+expect_client_ok -F $OBJ/ssh_proxy
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "match 127.0.0.1 server config w/key opts"
+stop_client
+
+# key opts with bare port number
+cp /dev/null $OBJ/authorized_keys_$USER
+for t in ${SSH_KEYTYPES}; do
+	printf 'permitlisten="'$fwdport'" ' >> $OBJ/authorized_keys_$USER
+	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
+done
+trace "match permitlisten 127.0.0.1 server config w/key opts (bare)"
+expect_client_ok -F $OBJ/ssh_proxy
+${SSH} -q -p $fwdport -F $OBJ/ssh_config somehost true || \
+    fail "match 127.0.0.1 server config w/key opts (bare)"
+stop_client
+
+# key opts with incorrect bare port number
+cp /dev/null $OBJ/authorized_keys_$USER
+for t in ${SSH_KEYTYPES}; do
+	printf 'permitlisten="99" ' >> $OBJ/authorized_keys_$USER
+	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
+done
+trace "match permitlisten 127.0.0.1 server config w/key opts (wrong bare)"
+expect_client_fail "nomatch 127.0.0.1 w/key opts (wrong bare)" \
+    -F $OBJ/ssh_config
diff --git a/regress/cfgparse.sh b/regress/cfgparse.sh
index ccf511f..a9e5c6b 100644
--- a/regress/cfgparse.sh
+++ b/regress/cfgparse.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: cfgparse.sh,v 1.6 2016/06/03 03:47:59 dtucker Exp $
+#	$OpenBSD: cfgparse.sh,v 1.7 2018/05/11 03:51:06 dtucker Exp $
 #	Placed in the Public Domain.
 
 tid="sshd config parse"
@@ -10,8 +10,8 @@
 
 # We need to use the keys generated for the regression test because sshd -T
 # will fail if we're not running with SUDO (no permissions for real keys) or
-# if we are # running tests on a system that has never had sshd installed
-# (keys won't exist).
+# if we are running tests on a system that has never had sshd installed
+# because the keys won't exist.
 
 grep "HostKey " $OBJ/sshd_config > $OBJ/sshd_config_minimal
 SSHD_KEYS="`cat $OBJ/sshd_config_minimal`"
diff --git a/regress/cipher-speed.sh b/regress/cipher-speed.sh
index 575dc23..5da95b3 100644
--- a/regress/cipher-speed.sh
+++ b/regress/cipher-speed.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: cipher-speed.sh,v 1.13 2015/03/24 20:22:17 markus Exp $
+#	$OpenBSD: cipher-speed.sh,v 1.14 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="cipher speed"
@@ -12,16 +12,16 @@
 tries="1 2"
 
 for c in `${SSH} -Q cipher`; do n=0; for m in `${SSH} -Q mac`; do
-	trace "proto 2 cipher $c mac $m"
+	trace "cipher $c mac $m"
 	for x in $tries; do
 		printf "%-60s" "$c/$m:"
 		( ${SSH} -o 'compression no' \
-			-F $OBJ/ssh_proxy -2 -m $m -c $c somehost \
+			-F $OBJ/ssh_proxy -m $m -c $c somehost \
 			exec sh -c \'"dd of=/dev/null obs=32k"\' \
 		< ${DATA} ) 2>&1 | getbytes
 
 		if [ $? -ne 0 ]; then
-			fail "ssh -2 failed with mac $m cipher $c"
+			fail "ssh failed with mac $m cipher $c"
 		fi
 	done
 	# No point trying all MACs for AEAD ciphers since they are ignored.
@@ -30,22 +30,3 @@
 	fi
 	n=`expr $n + 1`
 done; done
-
-if ssh_version 1; then
-	ciphers="3des blowfish"
-else
-	ciphers=""
-fi
-for c in $ciphers; do
-	trace "proto 1 cipher $c"
-	for x in $tries; do
-		printf "%-60s" "$c:"
-		( ${SSH} -o 'compression no' \
-			-F $OBJ/ssh_proxy -1 -c $c somehost \
-			exec sh -c \'"dd of=/dev/null obs=32k"\' \
-		< ${DATA} ) 2>&1 | getbytes
-		if [ $? -ne 0 ]; then
-			fail "ssh -1 failed with cipher $c"
-		fi
-	done
-done
diff --git a/regress/connect-privsep.sh b/regress/connect-privsep.sh
index 81cedc7..b6abb65 100644
--- a/regress/connect-privsep.sh
+++ b/regress/connect-privsep.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: connect-privsep.sh,v 1.8 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: connect-privsep.sh,v 1.9 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="proxy connect with privsep"
@@ -6,23 +6,19 @@
 cp $OBJ/sshd_proxy $OBJ/sshd_proxy.orig
 echo 'UsePrivilegeSeparation yes' >> $OBJ/sshd_proxy
 
-for p in ${SSH_PROTOCOLS}; do
-	${SSH} -$p -F $OBJ/ssh_proxy 999.999.999.999 true
-	if [ $? -ne 0 ]; then
-		fail "ssh privsep+proxyconnect protocol $p failed"
-	fi
-done
+${SSH} -F $OBJ/ssh_proxy 999.999.999.999 true
+if [ $? -ne 0 ]; then
+	fail "ssh privsep+proxyconnect failed"
+fi
 
 cp $OBJ/sshd_proxy.orig $OBJ/sshd_proxy
 echo 'UsePrivilegeSeparation sandbox' >> $OBJ/sshd_proxy
 
-for p in ${SSH_PROTOCOLS}; do
-	${SSH} -$p -F $OBJ/ssh_proxy 999.999.999.999 true
-	if [ $? -ne 0 ]; then
-		# XXX replace this with fail once sandbox has stabilised
-		warn "ssh privsep/sandbox+proxyconnect protocol $p failed"
-	fi
-done
+${SSH} -F $OBJ/ssh_proxy 999.999.999.999 true
+if [ $? -ne 0 ]; then
+	# XXX replace this with fail once sandbox has stabilised
+	warn "ssh privsep/sandbox+proxyconnect failed"
+fi
 
 # Because sandbox is sensitive to changes in libc, especially malloc, retest
 # with every malloc.conf option (and none).
@@ -32,10 +28,8 @@
 	mopts=`echo $TEST_MALLOC_OPTIONS | sed 's/./& /g'`
 fi
 for m in '' $mopts ; do
-    for p in ${SSH_PROTOCOLS}; do
-	env MALLOC_OPTIONS="$m" ${SSH} -$p -F $OBJ/ssh_proxy 999.999.999.999 true
+	env MALLOC_OPTIONS="$m" ${SSH} -F $OBJ/ssh_proxy 999.999.999.999 true
 	if [ $? -ne 0 ]; then
-		fail "ssh privsep/sandbox+proxyconnect protocol $p mopt '$m' failed"
+		fail "ssh privsep/sandbox+proxyconnect mopt '$m' failed"
 	fi
-    done
 done
diff --git a/regress/connect-uri.sh b/regress/connect-uri.sh
new file mode 100644
index 0000000..f13f15e
--- /dev/null
+++ b/regress/connect-uri.sh
@@ -0,0 +1,29 @@
+#	$OpenBSD: connect-uri.sh,v 1.1 2017/10/24 19:33:32 millert Exp $
+#	Placed in the Public Domain.
+
+tid="uri connect"
+
+# Remove Port and User from ssh_config, we want to rely on the URI
+cp $OBJ/ssh_config $OBJ/ssh_config.orig
+egrep -v '^	+(Port|User)	+.*$' $OBJ/ssh_config.orig > $OBJ/ssh_config
+
+start_sshd
+
+verbose "$tid: no trailing slash"
+${SSH} -F $OBJ/ssh_config "ssh://${USER}@somehost:${PORT}" true
+if [ $? -ne 0 ]; then
+	fail "ssh connection failed"
+fi
+
+verbose "$tid: trailing slash"
+${SSH} -F $OBJ/ssh_config "ssh://${USER}@somehost:${PORT}/" true
+if [ $? -ne 0 ]; then
+	fail "ssh connection failed"
+fi
+
+verbose "$tid: with path name"
+${SSH} -F $OBJ/ssh_config "ssh://${USER}@somehost:${PORT}/${DATA}" true \
+    > /dev/null 2>&1
+if [ $? -eq 0 ]; then
+	fail "ssh connection succeeded, expected failure"
+fi
diff --git a/regress/connect.sh b/regress/connect.sh
index f0d55d3..1b344b6 100644
--- a/regress/connect.sh
+++ b/regress/connect.sh
@@ -1,13 +1,11 @@
-#	$OpenBSD: connect.sh,v 1.5 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: connect.sh,v 1.6 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="simple connect"
 
 start_sshd
 
-for p in ${SSH_PROTOCOLS}; do
-	${SSH} -o "Protocol=$p" -F $OBJ/ssh_config somehost true
-	if [ $? -ne 0 ]; then
-		fail "ssh connect with protocol $p failed"
-	fi
-done
+${SSH} -F $OBJ/ssh_config somehost true
+if [ $? -ne 0 ]; then
+	fail "ssh connect with failed"
+fi
diff --git a/regress/dhgex.sh b/regress/dhgex.sh
index e7c5733..61fc178 100644
--- a/regress/dhgex.sh
+++ b/regress/dhgex.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: dhgex.sh,v 1.3 2015/10/23 02:22:01 dtucker Exp $
+#	$OpenBSD: dhgex.sh,v 1.4 2017/05/08 01:52:49 djm Exp $
 #	Placed in the Public Domain.
 
 tid="dhgex"
@@ -54,7 +54,6 @@
 
 #check 2048 3des-cbc
 check 3072 `${SSH} -Q cipher | grep 128`
-check 3072 arcfour blowfish-cbc
 check 7680 `${SSH} -Q cipher | grep 192`
 check 8192 `${SSH} -Q cipher | grep 256`
 check 8192 rijndael-cbc@lysator.liu.se chacha20-poly1305@openssh.com
diff --git a/regress/dynamic-forward.sh b/regress/dynamic-forward.sh
index dd67c96..84f8ee1 100644
--- a/regress/dynamic-forward.sh
+++ b/regress/dynamic-forward.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: dynamic-forward.sh,v 1.11 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: dynamic-forward.sh,v 1.13 2017/09/21 19:18:12 markus Exp $
 #	Placed in the Public Domain.
 
 tid="dynamic forwarding"
@@ -17,33 +17,34 @@
 
 start_sshd
 
-for p in ${SSH_PROTOCOLS}; do
+for d in D R; do
 	n=0
 	error="1"
 	trace "start dynamic forwarding, fork to background"
+
 	while [ "$error" -ne 0 -a "$n" -lt 3 ]; do
 		n=`expr $n + 1`
-		${SSH} -$p -F $OBJ/ssh_config -f -D $FWDPORT -q \
+		${SSH} -F $OBJ/ssh_config -f -$d $FWDPORT -q \
 		    -oExitOnForwardFailure=yes somehost exec sh -c \
 			\'"echo \$\$ > $OBJ/remote_pid; exec sleep 444"\'
 		error=$?
 		if [ "$error" -ne 0 ]; then
-			trace "forward failed proto $p attempt $n err $error"
+			trace "forward failed attempt $n err $error"
 			sleep $n
 		fi
 	done
 	if [ "$error" -ne 0 ]; then
-		fatal "failed to start dynamic forwarding proto $p"
+		fatal "failed to start dynamic forwarding"
 	fi
 
 	for s in 4 5; do
 	    for h in 127.0.0.1 localhost; do
-		trace "testing ssh protocol $p socks version $s host $h"
+		trace "testing ssh socks version $s host $h (-$d)"
 		${SSH} -F $OBJ/ssh_config \
 			-o "ProxyCommand ${proxycmd}${s} $h $PORT" \
-			somehost cat $DATA > $OBJ/ls.copy
-		test -f $OBJ/ls.copy	 || fail "failed copy $DATA"
-		cmp $DATA $OBJ/ls.copy || fail "corrupted copy of $DATA"
+			somehost cat ${DATA} > ${COPY}
+		test -f ${COPY}	 || fail "failed copy ${DATA}"
+		cmp ${DATA} ${COPY} || fail "corrupted copy of ${DATA}"
 	    done
 	done
 
@@ -56,4 +57,5 @@
 	else
 		fail "no pid file: $OBJ/remote_pid"
 	fi
+
 done
diff --git a/regress/exit-status.sh b/regress/exit-status.sh
index 397d8d7..aadf99f 100644
--- a/regress/exit-status.sh
+++ b/regress/exit-status.sh
@@ -1,24 +1,22 @@
-#	$OpenBSD: exit-status.sh,v 1.7 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: exit-status.sh,v 1.8 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="remote exit status"
 
-for p in ${SSH_PROTOCOLS}; do
-	for s in 0 1 4 5 44; do
-		trace "proto $p status $s"
-		verbose "test $tid: proto $p status $s"
-		${SSH} -$p -F $OBJ/ssh_proxy otherhost exit $s
-		r=$?
-		if [ $r -ne $s ]; then
-			fail "exit code mismatch for protocol $p: $r != $s"
-		fi
+for s in 0 1 4 5 44; do
+	trace "status $s"
+	verbose "test $tid: status $s"
+	${SSH} -F $OBJ/ssh_proxy otherhost exit $s
+	r=$?
+	if [ $r -ne $s ]; then
+		fail "exit code mismatch for: $r != $s"
+	fi
 
-		# same with early close of stdout/err
-		${SSH} -$p -F $OBJ/ssh_proxy -n otherhost \
-                	exec sh -c \'"sleep 2; exec > /dev/null 2>&1; sleep 3; exit $s"\'
-		r=$?
-		if [ $r -ne $s ]; then
-			fail "exit code (with sleep) mismatch for protocol $p: $r != $s"
-		fi
-	done
+	# same with early close of stdout/err
+	${SSH} -F $OBJ/ssh_proxy -n otherhost exec \
+	    sh -c \'"sleep 2; exec > /dev/null 2>&1; sleep 3; exit $s"\'
+	r=$?
+	if [ $r -ne $s ]; then
+		fail "exit code (with sleep) mismatch for: $r != $s"
+	fi
 done
diff --git a/regress/forcecommand.sh b/regress/forcecommand.sh
index 8a9b090..e059f1f 100644
--- a/regress/forcecommand.sh
+++ b/regress/forcecommand.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: forcecommand.sh,v 1.3 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: forcecommand.sh,v 1.4 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="forced command"
@@ -11,11 +11,8 @@
 	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
 done
 
-for p in ${SSH_PROTOCOLS}; do
-	trace "forced command in key option proto $p"
-	${SSH} -$p -F $OBJ/ssh_proxy somehost false \ ||
-	    fail "forced command in key proto $p"
-done
+trace "forced command in key option"
+${SSH} -F $OBJ/ssh_proxy somehost false || fail "forced command in key"
 
 cp /dev/null $OBJ/authorized_keys_$USER
 for t in ${SSH_KEYTYPES}; do
@@ -26,19 +23,13 @@
 cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
 echo "ForceCommand true" >> $OBJ/sshd_proxy
 
-for p in ${SSH_PROTOCOLS}; do
-	trace "forced command in sshd_config overrides key option proto $p"
-	${SSH} -$p -F $OBJ/ssh_proxy somehost false \ ||
-	    fail "forced command in key proto $p"
-done
+trace "forced command in sshd_config overrides key option"
+${SSH} -F $OBJ/ssh_proxy somehost false || fail "forced command in key"
 
 cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
 echo "ForceCommand false" >> $OBJ/sshd_proxy
 echo "Match User $USER" >> $OBJ/sshd_proxy
 echo "    ForceCommand true" >> $OBJ/sshd_proxy
 
-for p in ${SSH_PROTOCOLS}; do
-	trace "forced command with match proto $p"
-	${SSH} -$p -F $OBJ/ssh_proxy somehost false \ ||
-	    fail "forced command in key proto $p"
-done
+trace "forced command with match"
+${SSH} -F $OBJ/ssh_proxy somehost false || fail "forced command in key"
diff --git a/regress/forward-control.sh b/regress/forward-control.sh
index 9195709..3b1f69a 100644
--- a/regress/forward-control.sh
+++ b/regress/forward-control.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: forward-control.sh,v 1.3 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: forward-control.sh,v 1.7 2018/06/07 14:29:43 djm Exp $
 #	Placed in the Public Domain.
 
 tid="sshd control of local and remote forwarding"
@@ -32,13 +32,12 @@
 	return 0
 }
 
-# usage: check_lfwd protocol Y|N message
+# usage: check_lfwd Y|N message
 check_lfwd() {
-	_proto=$1
-	_expected=$2
-	_message=$3
+	_expected=$1
+	_message=$2
 	rm -f $READY
-	${SSH} -oProtocol=$_proto -F $OBJ/ssh_proxy \
+	${SSH} -F $OBJ/ssh_proxy \
 	    -L$LFWD_PORT:127.0.0.1:$PORT \
 	    -o ExitOnForwardFailure=yes \
 	    -n host exec sh -c \'"sleep 60 & echo \$! > $READY ; wait "\' \
@@ -62,14 +61,13 @@
 	fi
 }
 
-# usage: check_rfwd protocol Y|N message
+# usage: check_rfwd Y|N message
 check_rfwd() {
-	_proto=$1
-	_expected=$2
-	_message=$3
+	_expected=$1
+	_message=$2
 	rm -f $READY
-	${SSH} -oProtocol=$_proto -F $OBJ/ssh_proxy \
-	    -R$RFWD_PORT:127.0.0.1:$PORT \
+	${SSH} -F $OBJ/ssh_proxy \
+	    -R127.0.0.1:$RFWD_PORT:127.0.0.1:$PORT \
 	    -o ExitOnForwardFailure=yes \
 	    -n host exec sh -c \'"sleep 60 & echo \$! > $READY ; wait "\' \
 	    >/dev/null 2>&1 &
@@ -99,13 +97,11 @@
 cp ${OBJ}/authorized_keys_${USER} ${OBJ}/authorized_keys_${USER}.bak
 
 # Sanity check: ensure the default config allows forwarding
-for p in ${SSH_PROTOCOLS} ; do
-	check_lfwd $p Y "proto $p, default configuration"
-	check_rfwd $p Y "proto $p, default configuration"
-done
+check_lfwd Y "default configuration"
+check_rfwd Y "default configuration"
 
-# Usage: all_tests yes|local|remote|no Y|N Y|N Y|N Y|N Y|N Y|N
-all_tests() {
+# Usage: lperm_tests yes|local|remote|no Y|N Y|N Y|N Y|N Y|N Y|N
+lperm_tests() {
 	_tcpfwd=$1
 	_plain_lfwd=$2
 	_plain_rfwd=$3
@@ -113,56 +109,127 @@
 	_nopermit_rfwd=$5
 	_permit_lfwd=$6
 	_permit_rfwd=$7
-	_badfwd=127.0.0.1:22
+	_badfwd1=127.0.0.1:22
+	_badfwd2=127.0.0.2:22
 	_goodfwd=127.0.0.1:${PORT}
-	for _proto in ${SSH_PROTOCOLS} ; do
-		cp ${OBJ}/authorized_keys_${USER}.bak \
-		    ${OBJ}/authorized_keys_${USER}
-		_prefix="proto $_proto, AllowTcpForwarding=$_tcpfwd"
-		# No PermitOpen
-		( cat ${OBJ}/sshd_proxy.bak ;
-		  echo "AllowTcpForwarding $_tcpfwd" ) \
-		    > ${OBJ}/sshd_proxy
-		check_lfwd $_proto $_plain_lfwd "$_prefix"
-		check_rfwd $_proto $_plain_rfwd "$_prefix"
-		# PermitOpen via sshd_config that doesn't match
-		( cat ${OBJ}/sshd_proxy.bak ;
-		  echo "AllowTcpForwarding $_tcpfwd" ;
-		  echo "PermitOpen $_badfwd" ) \
-		    > ${OBJ}/sshd_proxy
-		check_lfwd $_proto $_nopermit_lfwd "$_prefix, !PermitOpen"
-		check_rfwd $_proto $_nopermit_rfwd "$_prefix, !PermitOpen"
-		# PermitOpen via sshd_config that does match
-		( cat ${OBJ}/sshd_proxy.bak ;
-		  echo "AllowTcpForwarding $_tcpfwd" ;
-		  echo "PermitOpen $_badfwd $_goodfwd" ) \
-		    > ${OBJ}/sshd_proxy
-		# NB. permitopen via authorized_keys should have same
-		# success/fail as via sshd_config
-		# permitopen via authorized_keys that doesn't match
-		sed "s/^/permitopen=\"$_badfwd\" /" \
-		    < ${OBJ}/authorized_keys_${USER}.bak \
-		    > ${OBJ}/authorized_keys_${USER} || fatal "sed 1 fail"
-		( cat ${OBJ}/sshd_proxy.bak ;
-		  echo "AllowTcpForwarding $_tcpfwd" ) \
-		    > ${OBJ}/sshd_proxy
-		check_lfwd $_proto $_nopermit_lfwd "$_prefix, !permitopen"
-		check_rfwd $_proto $_nopermit_rfwd "$_prefix, !permitopen"
-		# permitopen via authorized_keys that does match
-		sed "s/^/permitopen=\"$_badfwd\",permitopen=\"$_goodfwd\" /" \
-		    < ${OBJ}/authorized_keys_${USER}.bak \
-		    > ${OBJ}/authorized_keys_${USER} || fatal "sed 2 fail"
-		( cat ${OBJ}/sshd_proxy.bak ;
-		  echo "AllowTcpForwarding $_tcpfwd" ) \
-		    > ${OBJ}/sshd_proxy
-		check_lfwd $_proto $_permit_lfwd "$_prefix, permitopen"
-		check_rfwd $_proto $_permit_rfwd "$_prefix, permitopen"
-	done
+	cp ${OBJ}/authorized_keys_${USER}.bak  ${OBJ}/authorized_keys_${USER}
+	_prefix="AllowTcpForwarding=$_tcpfwd"
+
+	# No PermitOpen
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_plain_lfwd "$_prefix"
+	check_rfwd $_plain_rfwd "$_prefix"
+
+	# PermitOpen via sshd_config that doesn't match
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ;
+	  echo "PermitOpen $_badfwd1 $_badfwd2" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_nopermit_lfwd "$_prefix, !PermitOpen"
+	check_rfwd $_nopermit_rfwd "$_prefix, !PermitOpen"
+	# PermitOpen via sshd_config that does match
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ;
+	  echo "PermitOpen $_badfwd1 $_goodfwd $_badfwd2" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_plain_lfwd "$_prefix, PermitOpen"
+	check_rfwd $_plain_rfwd "$_prefix, PermitOpen"
+
+	# permitopen keys option.
+	# NB. permitopen via authorized_keys should have same
+	# success/fail as via sshd_config
+	# permitopen via authorized_keys that doesn't match
+	sed "s/^/permitopen=\"$_badfwd1\",permitopen=\"$_badfwd2\" /" \
+	    < ${OBJ}/authorized_keys_${USER}.bak \
+	    > ${OBJ}/authorized_keys_${USER} || fatal "sed 1 fail"
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_nopermit_lfwd "$_prefix, !permitopen"
+	check_rfwd $_nopermit_rfwd "$_prefix, !permitopen"
+	# permitopen via authorized_keys that does match
+	sed "s/^/permitopen=\"$_badfwd1\",permitopen=\"$_goodfwd\" /" \
+	    < ${OBJ}/authorized_keys_${USER}.bak \
+	    > ${OBJ}/authorized_keys_${USER} || fatal "sed 2 fail"
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_permit_lfwd "$_prefix, permitopen"
+	check_rfwd $_permit_rfwd "$_prefix, permitopen"
+
+	# Check port-forwarding flags in authorized_keys.
+	# These two should refuse all.
+	sed "s/^/no-port-forwarding /" \
+	    < ${OBJ}/authorized_keys_${USER}.bak \
+	    > ${OBJ}/authorized_keys_${USER} || fatal "sed 3 fail"
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd N "$_prefix, no-port-forwarding"
+	check_rfwd N "$_prefix, no-port-forwarding"
+	sed "s/^/restrict /" \
+	    < ${OBJ}/authorized_keys_${USER}.bak \
+	    > ${OBJ}/authorized_keys_${USER} || fatal "sed 4 fail"
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd N "$_prefix, restrict"
+	check_rfwd N "$_prefix, restrict"
+	# This should pass the same cases as _nopermit*
+	sed "s/^/restrict,port-forwarding /" \
+	    < ${OBJ}/authorized_keys_${USER}.bak \
+	    > ${OBJ}/authorized_keys_${USER} || fatal "sed 5 fail"
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_plain_lfwd "$_prefix, restrict,port-forwarding"
+	check_rfwd $_plain_rfwd "$_prefix, restrict,port-forwarding"
 }
 
-#                      no-permitopen mismatch-permitopen match-permitopen
-#   AllowTcpForwarding  local remote        local remote     local remote
-all_tests          yes      Y      Y            N      Y         Y      Y
-all_tests        local      Y      N            N      N         Y      N
-all_tests       remote      N      Y            N      Y         N      Y
-all_tests           no      N      N            N      N         N      N
+#          permit-open      none          mismatch         match
+#   AllowTcpForwarding  local remote    local remote    local remote
+lperm_tests     yes     Y     Y         N     Y         Y     Y
+lperm_tests   local     Y     N         N     N         Y     N
+lperm_tests  remote     N     Y         N     Y         N     Y
+lperm_tests      no     N     N         N     N         N     N
+
+# Usage: rperm_tests yes|local|remote|no Y|N Y|N Y|N Y|N Y|N Y|N
+rperm_tests() {
+	_tcpfwd=$1
+	_plain_lfwd=$2
+	_plain_rfwd=$3
+	_nopermit_lfwd=$4
+	_nopermit_rfwd=$5
+	_permit_lfwd=$6
+	_permit_rfwd=$7
+	_badfwd1=127.0.0.1:22
+	_badfwd2=127.0.0.2:${RFWD_PORT}
+	_goodfwd=127.0.0.1:${RFWD_PORT}
+	cp ${OBJ}/authorized_keys_${USER}.bak  ${OBJ}/authorized_keys_${USER}
+	_prefix="AllowTcpForwarding=$_tcpfwd"
+
+	# PermitListen via sshd_config that doesn't match
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ;
+	  echo "PermitListen $_badfwd1 $_badfwd2" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_nopermit_lfwd "$_prefix, !PermitListen"
+	check_rfwd $_nopermit_rfwd "$_prefix, !PermitListen"
+	# PermitListen via sshd_config that does match
+	( cat ${OBJ}/sshd_proxy.bak ;
+	  echo "AllowTcpForwarding $_tcpfwd" ;
+	  echo "PermitListen $_badfwd1 $_goodfwd $_badfwd2" ) \
+	    > ${OBJ}/sshd_proxy
+	check_lfwd $_plain_lfwd "$_prefix, PermitListen"
+	check_rfwd $_plain_rfwd "$_prefix, PermitListen"
+}
+
+#   permit-remote-open      none          mismatch         match
+#   AllowTcpForwarding  local remote    local remote    local remote
+rperm_tests     yes     Y     Y         Y     N         Y     Y
+rperm_tests   local     Y     N         Y     N         Y     N
+rperm_tests  remote     N     Y         N     N         N     Y
+rperm_tests      no     N     N         N     N         N     N
+
diff --git a/regress/forwarding.sh b/regress/forwarding.sh
index 60c37d8..7d0fae1 100644
--- a/regress/forwarding.sh
+++ b/regress/forwarding.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: forwarding.sh,v 1.19 2017/01/30 05:22:14 djm Exp $
+#	$OpenBSD: forwarding.sh,v 1.20 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="local and remote forwarding"
@@ -10,7 +10,8 @@
 base=33
 last=$PORT
 fwd=""
-CTL=$OBJ/ctl-sock
+make_tmpdir
+CTL=${SSH_REGRESS_TMP}/ctl-sock
 
 for j in 0 1 2; do
 	for i in 0 1 2; do
@@ -22,30 +23,24 @@
 		last=$a
 	done
 done
-for p in ${SSH_PROTOCOLS}; do
-	q=`expr 3 - $p`
-	if ! ssh_version $q; then
-		q=$p
-	fi
-	trace "start forwarding, fork to background"
-	rm -f $CTL
-	${SSH} -S $CTL -M -$p -F $OBJ/ssh_config -f $fwd somehost sleep 10
 
-	trace "transfer over forwarded channels and check result"
-	${SSH} -$q -F $OBJ/ssh_config -p$last -o 'ConnectionAttempts=4' \
-		somehost cat ${DATA} > ${COPY}
-	test -s ${COPY}		|| fail "failed copy of ${DATA}"
-	cmp ${DATA} ${COPY}	|| fail "corrupted copy of ${DATA}"
+trace "start forwarding, fork to background"
+rm -f $CTL
+${SSH} -S $CTL -M -F $OBJ/ssh_config -f $fwd somehost sleep 10
 
-	${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
-done
+trace "transfer over forwarded channels and check result"
+${SSH} -F $OBJ/ssh_config -p$last -o 'ConnectionAttempts=4' \
+	somehost cat ${DATA} > ${COPY}
+test -s ${COPY}		|| fail "failed copy of ${DATA}"
+cmp ${DATA} ${COPY}	|| fail "corrupted copy of ${DATA}"
 
-for p in ${SSH_PROTOCOLS}; do
+${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
+
 for d in L R; do
-	trace "exit on -$d forward failure, proto $p"
+	trace "exit on -$d forward failure"
 
 	# this one should succeed
-	${SSH} -$p -F $OBJ/ssh_config \
+	${SSH}  -F $OBJ/ssh_config \
 	    -$d ${base}01:127.0.0.1:$PORT \
 	    -$d ${base}02:127.0.0.1:$PORT \
 	    -$d ${base}03:127.0.0.1:$PORT \
@@ -55,7 +50,7 @@
 		fatal "connection failed, should not"
 	else
 		# this one should fail
-		${SSH} -q -$p -F $OBJ/ssh_config \
+		${SSH} -q -F $OBJ/ssh_config \
 		    -$d ${base}01:127.0.0.1:$PORT \
 		    -$d ${base}02:127.0.0.1:$PORT \
 		    -$d ${base}03:127.0.0.1:$PORT \
@@ -68,82 +63,74 @@
 		fi
 	fi
 done
-done
 
-for p in ${SSH_PROTOCOLS}; do
-	trace "simple clear forwarding proto $p"
-	${SSH} -$p -F $OBJ/ssh_config -oClearAllForwardings=yes somehost true
+trace "simple clear forwarding"
+${SSH} -F $OBJ/ssh_config -oClearAllForwardings=yes somehost true
 
-	trace "clear local forward proto $p"
-	rm -f $CTL
-	${SSH} -S $CTL -M -$p -f -F $OBJ/ssh_config -L ${base}01:127.0.0.1:$PORT \
-	    -oClearAllForwardings=yes somehost sleep 10
-	if [ $? != 0 ]; then
-		fail "connection failed with cleared local forwarding"
-	else
-		# this one should fail
-		${SSH} -$p -F $OBJ/ssh_config -p ${base}01 somehost true \
-		     >>$TEST_REGRESS_LOGFILE 2>&1 && \
-			fail "local forwarding not cleared"
-	fi
-	${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
-	
-	trace "clear remote forward proto $p"
-	rm -f $CTL
-	${SSH} -S $CTL -M -$p -f -F $OBJ/ssh_config -R ${base}01:127.0.0.1:$PORT \
-	    -oClearAllForwardings=yes somehost sleep 10
-	if [ $? != 0 ]; then
-		fail "connection failed with cleared remote forwarding"
-	else
-		# this one should fail
-		${SSH} -$p -F $OBJ/ssh_config -p ${base}01 somehost true \
-		     >>$TEST_REGRESS_LOGFILE 2>&1 && \
-			fail "remote forwarding not cleared"
-	fi
-	${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
-done
+trace "clear local forward"
+rm -f $CTL
+${SSH} -S $CTL -M -f -F $OBJ/ssh_config -L ${base}01:127.0.0.1:$PORT \
+    -oClearAllForwardings=yes somehost sleep 10
+if [ $? != 0 ]; then
+	fail "connection failed with cleared local forwarding"
+else
+	# this one should fail
+	${SSH} -F $OBJ/ssh_config -p ${base}01 somehost true \
+	     >>$TEST_REGRESS_LOGFILE 2>&1 && \
+		fail "local forwarding not cleared"
+fi
+${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
 
-for p in 2; do
-	trace "stdio forwarding proto $p"
-	cmd="${SSH} -$p -F $OBJ/ssh_config"
-	$cmd -o "ProxyCommand $cmd -q -W localhost:$PORT somehost" \
-		somehost true
-	if [ $? != 0 ]; then
-		fail "stdio forwarding proto $p"
-	fi
-done
+trace "clear remote forward"
+rm -f $CTL
+${SSH} -S $CTL -M -f -F $OBJ/ssh_config -R ${base}01:127.0.0.1:$PORT \
+    -oClearAllForwardings=yes somehost sleep 10
+if [ $? != 0 ]; then
+	fail "connection failed with cleared remote forwarding"
+else
+	# this one should fail
+	${SSH} -F $OBJ/ssh_config -p ${base}01 somehost true \
+	     >>$TEST_REGRESS_LOGFILE 2>&1 && \
+		fail "remote forwarding not cleared"
+fi
+${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
+
+trace "stdio forwarding"
+cmd="${SSH} -F $OBJ/ssh_config"
+$cmd -o "ProxyCommand $cmd -q -W localhost:$PORT somehost" somehost true
+if [ $? != 0 ]; then
+	fail "stdio forwarding"
+fi
 
 echo "LocalForward ${base}01 127.0.0.1:$PORT" >> $OBJ/ssh_config
 echo "RemoteForward ${base}02 127.0.0.1:${base}01" >> $OBJ/ssh_config
-for p in ${SSH_PROTOCOLS}; do
-	trace "config file: start forwarding, fork to background"
-	rm -f $CTL
-	${SSH} -S $CTL -M -$p -F $OBJ/ssh_config -f somehost sleep 10
 
-	trace "config file: transfer over forwarded channels and check result"
-	${SSH} -F $OBJ/ssh_config -p${base}02 -o 'ConnectionAttempts=4' \
-		somehost cat ${DATA} > ${COPY}
-	test -s ${COPY}		|| fail "failed copy of ${DATA}"
-	cmp ${DATA} ${COPY}	|| fail "corrupted copy of ${DATA}"
+trace "config file: start forwarding, fork to background"
+rm -f $CTL
+${SSH} -S $CTL -M -F $OBJ/ssh_config -f somehost sleep 10
 
-	${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
-done
+trace "config file: transfer over forwarded channels and check result"
+${SSH} -F $OBJ/ssh_config -p${base}02 -o 'ConnectionAttempts=4' \
+	somehost cat ${DATA} > ${COPY}
+test -s ${COPY}		|| fail "failed copy of ${DATA}"
+cmp ${DATA} ${COPY}	|| fail "corrupted copy of ${DATA}"
 
-for p in 2; do
-	trace "transfer over chained unix domain socket forwards and check result"
-	rm -f $OBJ/unix-[123].fwd
-	rm -f $CTL $CTL.[123]
-	${SSH} -S $CTL -M -f -F $OBJ/ssh_config -R${base}01:[$OBJ/unix-1.fwd] somehost sleep 10
-	${SSH} -S $CTL.1 -M -f -F $OBJ/ssh_config -L[$OBJ/unix-1.fwd]:[$OBJ/unix-2.fwd] somehost sleep 10
-	${SSH} -S $CTL.2 -M -f -F $OBJ/ssh_config -R[$OBJ/unix-2.fwd]:[$OBJ/unix-3.fwd] somehost sleep 10
-	${SSH} -S $CTL.3 -M -f -F $OBJ/ssh_config -L[$OBJ/unix-3.fwd]:127.0.0.1:$PORT somehost sleep 10
-	${SSH} -F $OBJ/ssh_config -p${base}01 -o 'ConnectionAttempts=4' \
-		somehost cat ${DATA} > ${COPY}
-	test -s ${COPY}			|| fail "failed copy ${DATA}"
-	cmp ${DATA} ${COPY}		|| fail "corrupted copy of ${DATA}"
+${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
 
-	${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
-	${SSH} -F $OBJ/ssh_config -S $CTL.1 -O exit somehost
-	${SSH} -F $OBJ/ssh_config -S $CTL.2 -O exit somehost
-	${SSH} -F $OBJ/ssh_config -S $CTL.3 -O exit somehost
-done
+trace "transfer over chained unix domain socket forwards and check result"
+rm -f $OBJ/unix-[123].fwd
+rm -f $CTL $CTL.[123]
+${SSH} -S $CTL -M -f -F $OBJ/ssh_config -R${base}01:[$OBJ/unix-1.fwd] somehost sleep 10
+${SSH} -S $CTL.1 -M -f -F $OBJ/ssh_config -L[$OBJ/unix-1.fwd]:[$OBJ/unix-2.fwd] somehost sleep 10
+${SSH} -S $CTL.2 -M -f -F $OBJ/ssh_config -R[$OBJ/unix-2.fwd]:[$OBJ/unix-3.fwd] somehost sleep 10
+${SSH} -S $CTL.3 -M -f -F $OBJ/ssh_config -L[$OBJ/unix-3.fwd]:127.0.0.1:$PORT somehost sleep 10
+${SSH} -F $OBJ/ssh_config -p${base}01 -o 'ConnectionAttempts=4' \
+	somehost cat ${DATA} > ${COPY}
+test -s ${COPY}			|| fail "failed copy ${DATA}"
+cmp ${DATA} ${COPY}		|| fail "corrupted copy of ${DATA}"
+
+${SSH} -F $OBJ/ssh_config -S $CTL -O exit somehost
+${SSH} -F $OBJ/ssh_config -S $CTL.1 -O exit somehost
+${SSH} -F $OBJ/ssh_config -S $CTL.2 -O exit somehost
+${SSH} -F $OBJ/ssh_config -S $CTL.3 -O exit somehost
+
diff --git a/regress/host-expand.sh b/regress/host-expand.sh
index 2a95bfe..9444f7f 100644
--- a/regress/host-expand.sh
+++ b/regress/host-expand.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: host-expand.sh,v 1.4 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: host-expand.sh,v 1.5 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="expand %h and %n"
@@ -11,9 +11,6 @@
 127.0.0.1
 EOE
 
-for p in ${SSH_PROTOCOLS}; do
-	verbose "test $tid: proto $p"
-	${SSH} -F $OBJ/ssh_proxy -$p somehost true >$OBJ/actual
-	diff $OBJ/expect $OBJ/actual || fail "$tid proto $p"
-done
+${SSH} -F $OBJ/ssh_proxy somehost true >$OBJ/actual
+diff $OBJ/expect $OBJ/actual || fail "$tid"
 
diff --git a/regress/hostkey-agent.sh b/regress/hostkey-agent.sh
index 094700d..811b6b9 100644
--- a/regress/hostkey-agent.sh
+++ b/regress/hostkey-agent.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: hostkey-agent.sh,v 1.6 2015/07/10 06:23:25 markus Exp $
+#	$OpenBSD: hostkey-agent.sh,v 1.7 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="hostkey agent"
@@ -40,7 +40,7 @@
 		cp $OBJ/known_hosts.orig $OBJ/known_hosts
 		SSH_CONNECTION=`${SSH} $opts host 'echo $SSH_CONNECTION'`
 		if [ $? -ne 0 ]; then
-			fail "protocol $p privsep=$ps failed"
+			fail "privsep=$ps failed"
 		fi
 		if [ "$SSH_CONNECTION" != "UNKNOWN 65535 UNKNOWN 65535" ]; then
 			fail "bad SSH_CONNECTION key type $k privsep=$ps"
diff --git a/regress/integrity.sh b/regress/integrity.sh
index 1df2924..3eda40f 100644
--- a/regress/integrity.sh
+++ b/regress/integrity.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: integrity.sh,v 1.20 2017/01/06 02:26:10 dtucker Exp $
+#	$OpenBSD: integrity.sh,v 1.23 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="integrity"
@@ -46,7 +46,7 @@
 			macopt="-m $m -c aes128-ctr"
 		fi
 		verbose "test $tid: $m @$off"
-		${SSH} $macopt -2F $OBJ/ssh_proxy -o "$pxy" \
+		${SSH} $macopt -F $OBJ/ssh_proxy -o "$pxy" \
 		    -oServerAliveInterval=1 -oServerAliveCountMax=30 \
 		    999.999.999.999 'printf "%4096s" " "' >/dev/null
 		if [ $? -eq 0 ]; then
@@ -60,14 +60,16 @@
 		Corrupted?MAC* | *message?authentication?code?incorrect*)
 				emac=`expr $emac + 1`; skip=0;;
 		padding*)	epad=`expr $epad + 1`; skip=0;;
+		*Timeout,?server*)
+				etmo=`expr $etmo + 1`; skip=0;;
 		*)		fail "unexpected error mac $m at $off: $out";;
 		esac
 	done
-	verbose "test $tid: $ecnt errors: mac $emac padding $epad length $elen"
+	verbose "test $tid: $ecnt errors: mac $emac padding $epad length $elen timeout $etmo"
 	if [ $emac -eq 0 ]; then
 		fail "$m: no mac errors"
 	fi
-	expect=`expr $ecnt - $epad - $elen`
+	expect=`expr $ecnt - $epad - $elen - $etmo`
 	if [ $emac -ne $expect ]; then
 		fail "$m: expected $expect mac errors, got $emac"
 	fi
diff --git a/regress/key-options.sh b/regress/key-options.sh
index 7a68ad3..112c9bd 100644
--- a/regress/key-options.sh
+++ b/regress/key-options.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: key-options.sh,v 1.3 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: key-options.sh,v 1.9 2018/07/03 13:53:26 djm Exp $
 #	Placed in the Public Domain.
 
 tid="key options"
@@ -8,64 +8,111 @@
 cp $authkeys $origkeys
 
 # Test command= forced command
-for p in ${SSH_PROTOCOLS}; do
-    for c in 'command="echo bar"' 'no-pty,command="echo bar"'; do
+for c in 'command="echo bar"' 'no-pty,command="echo bar"'; do
 	sed "s/.*/$c &/" $origkeys >$authkeys
-	verbose "key option proto $p $c"
-	r=`${SSH} -$p -q -F $OBJ/ssh_proxy somehost echo foo`
+	verbose "key option $c"
+	r=`${SSH} -q -F $OBJ/ssh_proxy somehost echo foo`
 	if [ "$r" = "foo" ]; then
 		fail "key option forced command not restricted"
 	fi
 	if [ "$r" != "bar" ]; then
 		fail "key option forced command not executed"
 	fi
-    done
 done
 
 # Test no-pty
-sed 's/.*/no-pty &/' $origkeys >$authkeys
-for p in ${SSH_PROTOCOLS}; do
-	verbose "key option proto $p no-pty"
-	r=`${SSH} -$p -q -F $OBJ/ssh_proxy somehost tty`
-	if [ -f "$r" ]; then
-		fail "key option failed proto $p no-pty (pty $r)"
+expect_pty_succeed() {
+	which=$1
+	opts=$2
+	rm -f $OBJ/data
+	sed "s/.*/$opts &/" $origkeys >$authkeys
+	verbose "key option pty $which"
+	config_defined HAVE_OPENPTY || verbose "skipped for no openpty(3)"
+	${SSH} -ttq -F $OBJ/ssh_proxy somehost "tty > $OBJ/data; exit 0"
+	if [ $? -ne 0 ] ; then
+		fail "key option failed $which"
+	else
+		r=`cat $OBJ/data`
+		case "$r" in
+		/dev/*) ;;
+		*)	fail "key option failed $which (pty $r)" ;;
+		esac
 	fi
-done
+}
+expect_pty_fail() {
+	which=$1
+	opts=$2
+	rm -f $OBJ/data
+	sed "s/.*/$opts &/" $origkeys >$authkeys
+	verbose "key option pty $which"
+	config_defined HAVE_OPENPTY || verbose "skipped for no openpty(3)"
+	${SSH} -ttq -F $OBJ/ssh_proxy somehost "tty > $OBJ/data; exit 0"
+	if [ $? -eq 0 ]; then
+		r=`cat $OBJ/data`
+		if [ -e "$r" ]; then
+			fail "key option failed $which (pty $r)"
+		fi
+		case "$r" in
+		/dev/*)	fail "key option failed $which (pty $r)" ;;
+		*)	;;
+		esac
+	fi
+}
+# First ensure that we can allocate a pty by default.
+expect_pty_succeed "default" ""
+expect_pty_fail "no-pty" "no-pty"
+expect_pty_fail "restrict" "restrict"
+expect_pty_succeed "restrict,pty" "restrict,pty"
 
 # Test environment=
+# XXX this can fail if ~/.ssh/environment exists for the user running the test
 echo 'PermitUserEnvironment yes' >> $OBJ/sshd_proxy
 sed 's/.*/environment="FOO=bar" &/' $origkeys >$authkeys
-for p in ${SSH_PROTOCOLS}; do
-	verbose "key option proto $p environment"
-	r=`${SSH} -$p -q -F $OBJ/ssh_proxy somehost 'echo $FOO'`
-	if [ "$r" != "bar" ]; then
-		fail "key option environment not set"
-	fi
-done
+verbose "key option environment"
+r=`${SSH} -q -F $OBJ/ssh_proxy somehost 'echo $FOO'`
+if [ "$r" != "bar" ]; then
+	fail "key option environment not set"
+fi
 
 # Test from= restriction
 start_sshd
-for p in ${SSH_PROTOCOLS}; do
-    for f in 127.0.0.1 '127.0.0.0\/8'; do
+for f in 127.0.0.1 '127.0.0.0\/8'; do
 	cat  $origkeys >$authkeys
-	${SSH} -$p -q -F $OBJ/ssh_proxy somehost true
+	${SSH} -q -F $OBJ/ssh_proxy somehost true
 	if [ $? -ne 0 ]; then
-		fail "key option proto $p failed without restriction"
+		fail "key option failed without restriction"
 	fi
 
 	sed 's/.*/from="'"$f"'" &/' $origkeys >$authkeys
 	from=`head -1 $authkeys | cut -f1 -d ' '`
-	verbose "key option proto $p $from"
-	r=`${SSH} -$p -q -F $OBJ/ssh_proxy somehost 'echo true'`
+	verbose "key option $from"
+	r=`${SSH} -q -F $OBJ/ssh_proxy somehost 'echo true'`
 	if [ "$r" = "true" ]; then
-		fail "key option proto $p $from not restricted"
+		fail "key option $from not restricted"
 	fi
 
-	r=`${SSH} -$p -q -F $OBJ/ssh_config somehost 'echo true'`
+	r=`${SSH} -q -F $OBJ/ssh_config somehost 'echo true'`
 	if [ "$r" != "true" ]; then
-		fail "key option proto $p $from not allowed but should be"
+		fail "key option $from not allowed but should be"
 	fi
-    done
 done
 
-rm -f "$origkeys"
+check_valid_before() {
+	which=$1
+	opts=$2
+	expect=$3
+	sed "s/.*/$opts &/" $origkeys >$authkeys
+	verbose "key option expiry-time $which"
+	${SSH} -q -F $OBJ/ssh_proxy somehost true
+	r=$?
+	case "$expect" in
+	fail)	test $r -eq 0 && fail "key option succeeded $which" ;;
+	pass)	test $r -ne 0 && fail "key option failed $which" ;;
+	*)	fatal "unknown expectation $expect" ;;
+	esac
+}
+check_valid_before "default"	""				"pass"
+check_valid_before "invalid"	'expiry-time="INVALID"'		"fail"
+check_valid_before "expired"	'expiry-time="19990101"'	"fail"
+check_valid_before "valid"	'expiry-time="20380101"'	"pass"
+
diff --git a/regress/keygen-change.sh b/regress/keygen-change.sh
index e561850..8b8acd5 100644
--- a/regress/keygen-change.sh
+++ b/regress/keygen-change.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: keygen-change.sh,v 1.5 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: keygen-change.sh,v 1.6 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="change passphrase for key"
@@ -7,9 +7,6 @@
 S2="2secret"
 
 KEYTYPES=`${SSH} -Q key-plain`
-if ssh_version 1; then
-	KEYTYPES="${KEYTYPES} rsa1"
-fi
 
 for t in $KEYTYPES; do
 	# generate user key for agent
diff --git a/regress/keygen-knownhosts.sh b/regress/keygen-knownhosts.sh
index 693cd0e..37af347 100644
--- a/regress/keygen-knownhosts.sh
+++ b/regress/keygen-knownhosts.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: keygen-knownhosts.sh,v 1.3 2015/07/17 03:34:27 djm Exp $
+#	$OpenBSD: keygen-knownhosts.sh,v 1.4 2018/06/01 03:52:37 djm Exp $
 #	Placed in the Public Domain.
 
 tid="ssh-keygen known_hosts"
@@ -55,13 +55,24 @@
 check_find() {
 	_host=$1
 	_name=$2
-	_keygenopt=$3
-	${SSHKEYGEN} $_keygenopt -f $OBJ/kh.invalid -F $_host > $OBJ/kh.result
+	shift; shift
+	${SSHKEYGEN} "$@" -f $OBJ/kh.invalid -F $_host > $OBJ/kh.result
 	if ! diff -w $OBJ/kh.expect $OBJ/kh.result ; then
 		fail "didn't find $_name"
 	fi
 }
 
+check_find_exit_code() {
+	_host=$1
+	_name=$2
+	_keygenopt=$3
+	_exp_exit_code=$4
+	${SSHKEYGEN} $_keygenopt -f $OBJ/kh.invalid -F $_host > /dev/null
+	if [ "$?" != "$_exp_exit_code" ] ; then
+	    fail "Unexpected exit code $_name"
+	fi
+}
+
 # Find key
 rm -f $OBJ/kh.expect
 expect_key host-a host-a host-a 2
@@ -88,6 +99,18 @@
 expect_key host-h "host-f,host-g,host-h " host-f 17
 check_find host-h "find multiple hosts"
 
+# Check exit code, known host
+check_find_exit_code host-a "known host" "-q" "0"
+
+# Check exit code, unknown host
+check_find_exit_code host-aa "unknown host" "-q" "1"
+
+# Check exit code, the hash mode, known host
+check_find_exit_code host-a "known host" "-q -H" "0"
+
+# Check exit code, the hash mode, unknown host
+check_find_exit_code host-aa "unknown host" "-q -H" "1"
+
 check_hashed_find() {
 	_host=$1
 	_name=$2
@@ -110,19 +133,19 @@
 rm -f $OBJ/kh.expect
 expect_key host-c host-c host-c "" CA
 # CA key output is not hashed.
-check_find host-c "find simple and hash" -H
+check_find host-c "find simple and hash" -Hq
 
 # Find revoked key and hash
 rm -f $OBJ/kh.expect
 expect_key host-d host-d host-d "" REVOKED
 # Revoked key output is not hashed.
-check_find host-d "find simple and hash" -H
+check_find host-d "find simple and hash" -Hq
 
 # find key with wildcard and hash
 rm -f $OBJ/kh.expect
 expect_key host-e "host-e*" host-e ""
 # Key with wildcard hostname should not be hashed.
-check_find host-e "find wildcard key" -H
+check_find host-e "find wildcard key" -Hq
 
 # find key among multiple hosts
 rm -f $OBJ/kh.expect
diff --git a/regress/keys-command.sh b/regress/keys-command.sh
index 9c9ada7..4029e2c 100644
--- a/regress/keys-command.sh
+++ b/regress/keys-command.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: keys-command.sh,v 1.3 2015/05/21 06:40:02 djm Exp $
+#	$OpenBSD: keys-command.sh,v 1.4 2016/09/26 21:34:38 bluhm Exp $
 #	Placed in the Public Domain.
 
 tid="authorized keys from command"
diff --git a/regress/keyscan.sh b/regress/keyscan.sh
index f97364b..3bde121 100644
--- a/regress/keyscan.sh
+++ b/regress/keyscan.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: keyscan.sh,v 1.5 2015/09/11 03:44:21 djm Exp $
+#	$OpenBSD: keyscan.sh,v 1.6 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="keyscan"
@@ -9,10 +9,6 @@
 start_sshd
 
 KEYTYPES=`${SSH} -Q key-plain`
-if ssh_version 1; then
-	KEYTYPES="${KEYTYPES} rsa1"
-fi
-
 for t in $KEYTYPES; do
 	trace "keyscan type $t"
 	${SSHKEYSCAN} -t $t -p $PORT 127.0.0.1 127.0.0.1 127.0.0.1 \
diff --git a/regress/keytype.sh b/regress/keytype.sh
index 8f69778..f78a2c1 100644
--- a/regress/keytype.sh
+++ b/regress/keytype.sh
@@ -1,13 +1,8 @@
-#	$OpenBSD: keytype.sh,v 1.4 2015/07/10 06:23:25 markus Exp $
+#	$OpenBSD: keytype.sh,v 1.7 2018/03/12 00:54:04 djm Exp $
 #	Placed in the Public Domain.
 
 tid="login with different key types"
 
-TIME=`which time 2>/dev/null`
-if test ! -x "$TIME"; then
-	TIME=""
-fi
-
 cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak
 cp $OBJ/ssh_proxy $OBJ/ssh_proxy_bak
 
@@ -22,38 +17,38 @@
 	esac
 done
 
-for kt in $ktypes; do 
+for kt in $ktypes; do
 	rm -f $OBJ/key.$kt
 	bits=`echo ${kt} | awk -F- '{print $2}'`
 	type=`echo ${kt}  | awk -F- '{print $1}'`
-	printf "keygen $type, $bits bits:\t"
-	${TIME} ${SSHKEYGEN} -b $bits -q -N '' -t $type  -f $OBJ/key.$kt ||\
+	verbose "keygen $type, $bits bits"
+	${SSHKEYGEN} -b $bits -q -N '' -t $type  -f $OBJ/key.$kt ||\
 		fail "ssh-keygen for type $type, $bits bits failed"
 done
 
 tries="1 2 3"
-for ut in $ktypes; do 
+for ut in $ktypes; do
 	htypes=$ut
 	#htypes=$ktypes
-	for ht in $htypes; do 
+	for ht in $htypes; do
 		case $ht in
 		dsa-1024)	t=ssh-dss;;
 		ecdsa-256)	t=ecdsa-sha2-nistp256;;
 		ecdsa-384)	t=ecdsa-sha2-nistp384;;
 		ecdsa-521)	t=ecdsa-sha2-nistp521;;
 		ed25519-512)	t=ssh-ed25519;;
-		rsa-*)		t=ssh-rsa;;
+		rsa-*)		t=rsa-sha2-512,rsa-sha2-256,ssh-rsa;;
 		esac
 		trace "ssh connect, userkey $ut, hostkey $ht"
 		(
 			grep -v HostKey $OBJ/sshd_proxy_bak
-			echo HostKey $OBJ/key.$ht 
+			echo HostKey $OBJ/key.$ht
 			echo PubkeyAcceptedKeyTypes $t
 			echo HostKeyAlgorithms $t
 		) > $OBJ/sshd_proxy
 		(
 			grep -v IdentityFile $OBJ/ssh_proxy_bak
-			echo IdentityFile $OBJ/key.$ut 
+			echo IdentityFile $OBJ/key.$ut
 			echo PubkeyAcceptedKeyTypes $t
 			echo HostKeyAlgorithms $t
 		) > $OBJ/ssh_proxy
@@ -63,8 +58,8 @@
 		) > $OBJ/known_hosts
 		cat $OBJ/key.$ut.pub > $OBJ/authorized_keys_$USER
 		for i in $tries; do
-			printf "userkey $ut, hostkey ${ht}:\t"
-			${TIME} ${SSH} -F $OBJ/ssh_proxy 999.999.999.999 true
+			verbose "userkey $ut, hostkey ${ht}"
+			${SSH} -F $OBJ/ssh_proxy 999.999.999.999 true
 			if [ $? -ne 0 ]; then
 				fail "ssh userkey $ut, hostkey $ht failed"
 			fi
diff --git a/regress/limit-keytype.sh b/regress/limit-keytype.sh
index c0cf2fe..04f1197 100644
--- a/regress/limit-keytype.sh
+++ b/regress/limit-keytype.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: limit-keytype.sh,v 1.4 2015/10/29 08:05:17 djm Exp $
+#	$OpenBSD: limit-keytype.sh,v 1.5 2018/03/12 00:52:57 djm Exp $
 #	Placed in the Public Domain.
 
 tid="restrict pubkey type"
@@ -60,7 +60,8 @@
 
 # Allow plain Ed25519 and RSA. The certificate should fail.
 verbose "allow rsa,ed25519"
-prepare_config "PubkeyAcceptedKeyTypes ssh-rsa,ssh-ed25519"
+prepare_config \
+	"PubkeyAcceptedKeyTypes rsa-sha2-256,rsa-sha2-512,ssh-rsa,ssh-ed25519"
 ${SSH} $certopts proxy true && fatal "cert succeeded"
 ${SSH} $opts -i $OBJ/user_key1 proxy true || fatal "key1 failed"
 ${SSH} $opts -i $OBJ/user_key2 proxy true || fatal "key2 failed"
@@ -74,14 +75,14 @@
 
 # Allow all certs. Plain keys should fail.
 verbose "allow cert only"
-prepare_config "PubkeyAcceptedKeyTypes ssh-*-cert-v01@openssh.com"
+prepare_config "PubkeyAcceptedKeyTypes *-cert-v01@openssh.com"
 ${SSH} $certopts proxy true || fatal "cert failed"
 ${SSH} $opts -i $OBJ/user_key1 proxy true && fatal "key1 succeeded"
 ${SSH} $opts -i $OBJ/user_key2 proxy true && fatal "key2 succeeded"
 
 # Allow RSA in main config, Ed25519 for non-existent user.
 verbose "match w/ no match"
-prepare_config "PubkeyAcceptedKeyTypes ssh-rsa" \
+prepare_config "PubkeyAcceptedKeyTypes rsa-sha2-256,rsa-sha2-512,ssh-rsa" \
 	"Match user x$USER" "PubkeyAcceptedKeyTypes +ssh-ed25519"
 ${SSH} $certopts proxy true && fatal "cert succeeded"
 ${SSH} $opts -i $OBJ/user_key1 proxy true && fatal "key1 succeeded"
diff --git a/regress/localcommand.sh b/regress/localcommand.sh
index 220f19a..5224a16 100644
--- a/regress/localcommand.sh
+++ b/regress/localcommand.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: localcommand.sh,v 1.3 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: localcommand.sh,v 1.4 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="localcommand"
@@ -6,10 +6,8 @@
 echo 'PermitLocalCommand yes' >> $OBJ/ssh_proxy
 echo 'LocalCommand echo foo' >> $OBJ/ssh_proxy
 
-for p in ${SSH_PROTOCOLS}; do
-	verbose "test $tid: proto $p localcommand"
-	a=`${SSH} -F $OBJ/ssh_proxy -$p somehost true`
-	if [ "$a" != "foo" ] ; then
-		fail "$tid proto $p"
-	fi
-done
+verbose "test $tid: proto $p localcommand"
+a=`${SSH} -F $OBJ/ssh_proxy somehost true`
+if [ "$a" != "foo" ] ; then
+	fail "$tid proto $p"
+fi
diff --git a/regress/login-timeout.sh b/regress/login-timeout.sh
index 12207fd..4c2d07d 100644
--- a/regress/login-timeout.sh
+++ b/regress/login-timeout.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: login-timeout.sh,v 1.8 2016/12/16 01:06:27 dtucker Exp $
+#	$OpenBSD: login-timeout.sh,v 1.9 2017/08/07 00:53:51 dtucker Exp $
 #	Placed in the Public Domain.
 
 tid="connect after login grace timeout"
@@ -10,23 +10,9 @@
 echo "MaxStartups 1" >> $OBJ/sshd_config
 start_sshd
 
-(echo SSH-2.0-fake; sleep 60) | telnet 127.0.0.1 ${PORT} >/dev/null 2>&1 & 
+(echo SSH-2.0-fake; sleep 60) | telnet 127.0.0.1 ${PORT} >/dev/null 2>&1 &
 sleep 15
 ${SSH} -F $OBJ/ssh_config somehost true
 if [ $? -ne 0 ]; then
-	fail "ssh connect after login grace timeout failed with privsep"
-fi
-
-stop_sshd
-
-trace "test login grace without privsep"
-echo "UsePrivilegeSeparation no" >> $OBJ/sshd_config
-start_sshd
-sleep 1
-
-(echo SSH-2.0-fake; sleep 60) | telnet 127.0.0.1 ${PORT} >/dev/null 2>&1 & 
-sleep 15
-${SSH} -F $OBJ/ssh_config somehost true
-if [ $? -ne 0 ]; then
-	fail "ssh connect after login grace timeout failed without privsep"
+	fail "ssh connect after login grace timeout failed"
 fi
diff --git a/regress/misc/fuzz-harness/Makefile b/regress/misc/fuzz-harness/Makefile
new file mode 100644
index 0000000..8fbfc20
--- /dev/null
+++ b/regress/misc/fuzz-harness/Makefile
@@ -0,0 +1,22 @@
+# NB. libssh and libopenbsd-compat should be built with the same sanitizer opts.
+CXX=clang++-3.9
+FUZZ_FLAGS=-fsanitize=address,undefined -fsanitize-coverage=edge
+FUZZ_LIBS=-lFuzzer
+
+CXXFLAGS=-O2 -g -Wall -Wextra -I ../../.. $(FUZZ_FLAGS)
+LDFLAGS=-L ../../.. -L ../../../openbsd-compat -g $(FUZZ_FLAGS)
+LIBS=-lssh -lopenbsd-compat -lcrypto $(FUZZ_LIBS)
+
+all: pubkey_fuzz sig_fuzz
+
+.cc.o:
+	$(CXX) $(CXXFLAGS) -c $< -o $@
+
+pubkey_fuzz: pubkey_fuzz.o
+	$(CXX) -o $@ pubkey_fuzz.o $(LDFLAGS) $(LIBS)
+
+sig_fuzz: sig_fuzz.o
+	$(CXX) -o $@ sig_fuzz.o $(LDFLAGS) $(LIBS)
+
+clean:
+	-rm -f *.o pubkey_fuzz sig_fuzz
diff --git a/regress/misc/fuzz-harness/README b/regress/misc/fuzz-harness/README
new file mode 100644
index 0000000..ae6fbe7
--- /dev/null
+++ b/regress/misc/fuzz-harness/README
@@ -0,0 +1 @@
+This directory contains fuzzing harnesses for use with clang's libfuzzer.
diff --git a/regress/misc/fuzz-harness/pubkey_fuzz.cc b/regress/misc/fuzz-harness/pubkey_fuzz.cc
new file mode 100644
index 0000000..8bbc110
--- /dev/null
+++ b/regress/misc/fuzz-harness/pubkey_fuzz.cc
@@ -0,0 +1,18 @@
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+
+extern "C" {
+
+#include "sshkey.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
+{
+	struct sshkey *k = NULL;
+	int r = sshkey_from_blob(data, size, &k);
+	if (r == 0) sshkey_free(k);
+	return 0;
+}
+
+} // extern
+
diff --git a/regress/misc/fuzz-harness/sig_fuzz.cc b/regress/misc/fuzz-harness/sig_fuzz.cc
new file mode 100644
index 0000000..dd1fda0
--- /dev/null
+++ b/regress/misc/fuzz-harness/sig_fuzz.cc
@@ -0,0 +1,50 @@
+// cc_fuzz_target test for public key parsing.
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern "C" {
+
+#include "includes.h"
+#include "sshkey.h"
+#include "ssherr.h"
+
+static struct sshkey *generate_or_die(int type, unsigned bits) {
+  int r;
+  struct sshkey *ret;
+  if ((r = sshkey_generate(type, bits, &ret)) != 0) {
+    fprintf(stderr, "generate(%d, %u): %s", type, bits, ssh_err(r));
+    abort();
+  }
+  return ret;
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t* sig, size_t slen)
+{
+#ifdef WITH_OPENSSL
+  static struct sshkey *rsa = generate_or_die(KEY_RSA, 2048);
+  static struct sshkey *dsa = generate_or_die(KEY_DSA, 1024);
+  static struct sshkey *ecdsa256 = generate_or_die(KEY_ECDSA, 256);
+  static struct sshkey *ecdsa384 = generate_or_die(KEY_ECDSA, 384);
+  static struct sshkey *ecdsa521 = generate_or_die(KEY_ECDSA, 521);
+#endif
+  static struct sshkey *ed25519 = generate_or_die(KEY_ED25519, 0);
+  static const char *data = "If everyone started announcing his nose had "
+      "run away, I don’t know how it would all end";
+  static const size_t dlen = strlen(data);
+
+#ifdef WITH_OPENSSL
+  sshkey_verify(rsa, sig, slen, (const u_char *)data, dlen, NULL, 0);
+  sshkey_verify(dsa, sig, slen, (const u_char *)data, dlen, NULL, 0);
+  sshkey_verify(ecdsa256, sig, slen, (const u_char *)data, dlen, NULL, 0);
+  sshkey_verify(ecdsa384, sig, slen, (const u_char *)data, dlen, NULL, 0);
+  sshkey_verify(ecdsa521, sig, slen, (const u_char *)data, dlen, NULL, 0);
+#endif
+  sshkey_verify(ed25519, sig, slen, (const u_char *)data, dlen, NULL, 0);
+  return 0;
+}
+
+} // extern
diff --git a/regress/misc/kexfuzz/Makefile b/regress/misc/kexfuzz/Makefile
index 3018b63..a7bb6b7 100644
--- a/regress/misc/kexfuzz/Makefile
+++ b/regress/misc/kexfuzz/Makefile
@@ -1,4 +1,4 @@
-#	$OpenBSD: Makefile,v 1.1 2016/03/04 02:30:37 djm Exp $
+#	$OpenBSD: Makefile,v 1.3 2017/12/21 05:46:35 djm Exp $
 
 .include <bsd.own.mk>
 .include <bsd.obj.mk>
@@ -9,6 +9,25 @@
 
 PROG=	kexfuzz
 SRCS=	kexfuzz.c
+
+SSHREL=../../../../../usr.bin/ssh
+.PATH: ${.CURDIR}/${SSHREL}
+# From usr.bin/ssh
+SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
+SRCS+=atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c ssh-dss.c
+SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
+SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
+SRCS+=addrmatch.c bitmap.c packet.c dispatch.c canohost.c ssh_api.c
+SRCS+=kex.c kexc25519.c kexc25519c.c kexc25519s.c kexdh.c kexdhc.c kexdhs.c
+SRCS+=kexecdh.c kexecdhc.c kexecdhs.c kexgex.c kexgexc.c kexgexs.c
+SRCS+=dh.c compat.c
+SRCS+=ed25519.c hash.c ge25519.c fe25519.c sc25519.c verify.c
+SRCS+=cipher-chachapoly.c chacha.c poly1305.c
+SRCS+=smult_curve25519_ref.c
+
+SRCS+=digest-openssl.c
+#SRCS+=digest-libc.c
+
 NOMAN=	1
 
 .if (${OPENSSL:L} == "yes")
@@ -49,23 +68,14 @@
 CDIAGFLAGS+=	-Wtrigraphs
 CDIAGFLAGS+=	-Wuninitialized
 CDIAGFLAGS+=	-Wunused
-.if ${COMPILER_VERSION} == "gcc4"
-CDIAGFLAGS+=	-Wpointer-sign
+CDIAGFLAGS+=	-Wno-unused-parameter
+.if ${COMPILER_VERSION:L} != "gcc3"
 CDIAGFLAGS+=	-Wold-style-definition
 .endif
 
-SSHREL=../../../../../usr.bin/ssh
 
 CFLAGS+=-I${.CURDIR}/${SSHREL}
 
-.if exists(${.CURDIR}/${SSHREL}/lib/${__objdir})
-LDADD+=-L${.CURDIR}/${SSHREL}/lib/${__objdir} -lssh
-DPADD+=${.CURDIR}/${SSHREL}/lib/${__objdir}/libssh.a
-.else
-LDADD+=-L${.CURDIR}/${SSHREL}/lib -lssh
-DPADD+=${.CURDIR}/${SSHREL}/lib/libssh.a
-.endif
-
 LDADD+= -lutil -lz
 DPADD+= ${LIBUTIL} ${LIBZ}
 
diff --git a/regress/misc/kexfuzz/README b/regress/misc/kexfuzz/README
index abd7b50..504c26f 100644
--- a/regress/misc/kexfuzz/README
+++ b/regress/misc/kexfuzz/README
@@ -30,3 +30,5 @@
 present. It is limited to replacing individual packets with
 fuzzed variants with the same type. It really should allow
 insertion, deletion on replacement of packets too.
+
+$OpenBSD: README,v 1.3 2017/10/20 02:13:41 djm Exp $
diff --git a/regress/misc/kexfuzz/kexfuzz.c b/regress/misc/kexfuzz/kexfuzz.c
index 6705802..3e2c481 100644
--- a/regress/misc/kexfuzz/kexfuzz.c
+++ b/regress/misc/kexfuzz/kexfuzz.c
@@ -1,4 +1,4 @@
-/* 	$OpenBSD: kexfuzz.c,v 1.3 2016/10/11 21:49:54 djm Exp $ */
+/* 	$OpenBSD: kexfuzz.c,v 1.4 2017/04/30 23:34:55 djm Exp $ */
 /*
  * Fuzz harness for KEX code
  *
@@ -418,7 +418,7 @@
 	close(fd);
 	/* XXX check that it is a private key */
 	/* XXX support certificates */
-	if (key == NULL || key->type == KEY_UNSPEC || key->type == KEY_RSA1)
+	if (key == NULL || key->type == KEY_UNSPEC)
 		badusage("Invalid key file (-k flag)");
 
 	/* Replace (fuzz) mode */
diff --git a/regress/mkdtemp.c b/regress/mkdtemp.c
new file mode 100644
index 0000000..a7be1bd
--- /dev/null
+++ b/regress/mkdtemp.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2017 Colin Watson <cjwatson@debian.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* Roughly equivalent to "mktemp -d -t TEMPLATE", but portable. */
+
+#include "includes.h"
+
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "log.h"
+
+static void
+usage(void)
+{
+	fprintf(stderr, "mkdtemp template\n");
+	exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+	const char *base;
+	const char *tmpdir;
+	char template[PATH_MAX];
+	int r;
+	char *dir;
+
+	if (argc != 2)
+		usage();
+	base = argv[1];
+
+	if ((tmpdir = getenv("TMPDIR")) == NULL)
+		tmpdir = "/tmp";
+	r = snprintf(template, sizeof(template), "%s/%s", tmpdir, base);
+	if (r < 0 || (size_t)r >= sizeof(template))
+		fatal("template string too long");
+	dir = mkdtemp(template);
+	if (dir == NULL) {
+		perror("mkdtemp");
+		exit(1);
+	}
+	puts(dir);
+	return 0;
+}
diff --git a/regress/modpipe.c b/regress/modpipe.c
old mode 100755
new mode 100644
diff --git a/regress/multiplex.sh b/regress/multiplex.sh
index acb9234..a6fad8e 100644
--- a/regress/multiplex.sh
+++ b/regress/multiplex.sh
@@ -1,7 +1,8 @@
-#	$OpenBSD: multiplex.sh,v 1.27 2014/12/22 06:14:29 djm Exp $
+#	$OpenBSD: multiplex.sh,v 1.28 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
-CTL=/tmp/openssh.regress.ctl-sock.$$
+make_tmpdir
+CTL=${SSH_REGRESS_TMP}/ctl-sock
 
 tid="connection multiplexing"
 
@@ -101,7 +102,7 @@
 	${SSH} -F $OBJ/ssh_config -S $CTL otherhost exit $s
 	r=$?
 	if [ $r -ne $s ]; then
-		fail "exit code mismatch for protocol $p: $r != $s"
+		fail "exit code mismatch: $r != $s"
 	fi
 
 	# same with early close of stdout/err
@@ -110,7 +111,7 @@
                 exec sh -c \'"sleep 2; exec > /dev/null 2>&1; sleep 3; exit $s"\'
 	r=$?
 	if [ $r -ne $s ]; then
-		fail "exit code (with sleep) mismatch for protocol $p: $r != $s"
+		fail "exit code (with sleep) mismatch: $r != $s"
 	fi
 done
 
diff --git a/regress/netcat.c b/regress/netcat.c
index 98a08b1..56bd09d 100644
--- a/regress/netcat.c
+++ b/regress/netcat.c
@@ -738,7 +738,12 @@
 #ifdef SO_REUSEPORT
 		ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x));
 		if (ret == -1)
-			err(1, "setsockopt");
+			err(1, "setsockopt SO_REUSEPORT");
+#endif
+#ifdef SO_REUSEADDR
+		ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
+		if (ret == -1)
+			err(1, "setsockopt SO_REUSEADDR");
 #endif
 		set_common_sockopts(s);
 
diff --git a/regress/principals-command.sh b/regress/principals-command.sh
index 9b38eb1..bcc68e8 100644
--- a/regress/principals-command.sh
+++ b/regress/principals-command.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: principals-command.sh,v 1.3 2016/09/26 21:34:38 bluhm Exp $
+#	$OpenBSD: principals-command.sh,v 1.4 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="authorized principals command"
@@ -78,7 +78,7 @@
 		# Empty authorized_principals
 		verbose "$tid: ${_prefix} empty authorized_principals"
 		echo > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -87,7 +87,7 @@
 		# Wrong authorized_principals
 		verbose "$tid: ${_prefix} wrong authorized_principals"
 		echo gregorsamsa > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -96,7 +96,7 @@
 		# Correct authorized_principals
 		verbose "$tid: ${_prefix} correct authorized_principals"
 		echo mekmitasdigoat > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -ne 0 ]; then
 			fail "ssh cert connect failed"
@@ -105,7 +105,7 @@
 		# authorized_principals with bad key option
 		verbose "$tid: ${_prefix} authorized_principals bad key opt"
 		echo 'blah mekmitasdigoat' > $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -115,7 +115,7 @@
 		verbose "$tid: ${_prefix} authorized_principals command=false"
 		echo 'command="false" mekmitasdigoat' > \
 		    $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -125,7 +125,7 @@
 		verbose "$tid: ${_prefix} authorized_principals command=true"
 		echo 'command="true" mekmitasdigoat' > \
 		    $OBJ/authorized_principals_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost false >/dev/null 2>&1
 		if [ $? -ne 0 ]; then
 			fail "ssh cert connect failed"
@@ -144,7 +144,7 @@
 			printf 'cert-authority,principals="gregorsamsa" '
 			cat $OBJ/user_ca_key.pub
 		) > $OBJ/authorized_keys_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -eq 0 ]; then
 			fail "ssh cert connect succeeded unexpectedly"
@@ -156,7 +156,7 @@
 			printf 'cert-authority,principals="mekmitasdigoat" '
 			cat $OBJ/user_ca_key.pub
 		) > $OBJ/authorized_keys_$USER
-		${SSH} -2i $OBJ/cert_user_key \
+		${SSH} -i $OBJ/cert_user_key \
 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
 		if [ $? -ne 0 ]; then
 			fail "ssh cert connect failed"
diff --git a/regress/proto-mismatch.sh b/regress/proto-mismatch.sh
index 9e8024b..6ab28c9 100644
--- a/regress/proto-mismatch.sh
+++ b/regress/proto-mismatch.sh
@@ -1,21 +1,17 @@
-#	$OpenBSD: proto-mismatch.sh,v 1.4 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: proto-mismatch.sh,v 1.5 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="protocol version mismatch"
 
 mismatch ()
 {
-	server=$1
 	client=$2
-	banner=`echo ${client} | ${SSHD} -o "Protocol=${server}" -i -f ${OBJ}/sshd_proxy`
+	banner=`echo ${client} | ${SSHD} -i -f ${OBJ}/sshd_proxy`
 	r=$?
 	trace "sshd prints ${banner}"
 	if [ $r -ne 255 ]; then
-		fail "sshd prints ${banner} and accepts connect with version ${client}"
+		fail "sshd prints ${banner} but accepts version ${client}"
 	fi
 }
 
-mismatch	2	SSH-1.5-HALLO
-if ssh_version 1; then
-	mismatch	1	SSH-2.0-HALLO
-fi
+mismatch	SSH-1.5-HALLO
diff --git a/regress/proto-version.sh b/regress/proto-version.sh
index cf49461..1f33b1f 100644
--- a/regress/proto-version.sh
+++ b/regress/proto-version.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: proto-version.sh,v 1.5 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: proto-version.sh,v 1.7 2017/06/07 01:48:15 djm Exp $
 #	Placed in the Public Domain.
 
 tid="sshd version with different protocol combinations"
@@ -6,9 +6,8 @@
 # we just start sshd in inetd mode and check the banner
 check_version ()
 {
-	version=$1
-	expect=$2
-	banner=`printf '' | ${SSHD} -o "Protocol=${version}" -i -f ${OBJ}/sshd_proxy`
+	expect=$1
+	banner=`printf '' | ${SSHD} -i -f ${OBJ}/sshd_proxy`
 	case ${banner} in
 	SSH-1.99-*)
 		proto=199
@@ -24,13 +23,8 @@
 		;;
 	esac
 	if [ ${expect} -ne ${proto} ]; then
-		fail "wrong protocol version ${banner} for ${version}"
+		fail "wrong protocol version ${banner}"
 	fi
 }
 
-check_version	2	20
-if ssh_version 1; then
-	check_version	2,1	199
-	check_version	1,2	199
-	check_version	1	15
-fi
+check_version	20
diff --git a/regress/proxy-connect.sh b/regress/proxy-connect.sh
index b7a43fa..39bbd3c 100644
--- a/regress/proxy-connect.sh
+++ b/regress/proxy-connect.sh
@@ -1,32 +1,21 @@
-#	$OpenBSD: proxy-connect.sh,v 1.9 2016/02/17 02:24:17 djm Exp $
+#	$OpenBSD: proxy-connect.sh,v 1.11 2017/09/26 22:39:25 dtucker Exp $
 #	Placed in the Public Domain.
 
 tid="proxy connect"
 
-mv $OBJ/sshd_proxy $OBJ/sshd_proxy.orig
-
-for ps in no yes; do
-  cp $OBJ/sshd_proxy.orig $OBJ/sshd_proxy
-  echo "UsePrivilegeSeparation $ps" >> $OBJ/sshd_proxy
-
-  for p in ${SSH_PROTOCOLS}; do
-    for c in no yes; do
-	verbose "plain username protocol $p privsep=$ps comp=$c"
-	opts="-$p -oCompression=$c -F $OBJ/ssh_proxy"
+for c in no yes; do
+	verbose "plain username comp=$c"
+	opts="-oCompression=$c -F $OBJ/ssh_proxy"
 	SSH_CONNECTION=`${SSH} $opts 999.999.999.999 'echo $SSH_CONNECTION'`
 	if [ $? -ne 0 ]; then
-		fail "ssh proxyconnect protocol $p privsep=$ps comp=$c failed"
+		fail "ssh proxyconnect comp=$c failed"
 	fi
 	if [ "$SSH_CONNECTION" != "UNKNOWN 65535 UNKNOWN 65535" ]; then
-		fail "bad SSH_CONNECTION protocol $p privsep=$ps comp=$c: " \
+		fail "bad SSH_CONNECTION comp=$c: " \
 		    "$SSH_CONNECTION"
 	fi
-    done
-  done
 done
 
-for p in ${SSH_PROTOCOLS}; do
-	verbose "username with style protocol $p"
-	${SSH} -$p -F $OBJ/ssh_proxy ${USER}:style@999.999.999.999 true || \
-		fail "ssh proxyconnect protocol $p failed"
-done
+verbose "username with style"
+${SSH} -F $OBJ/ssh_proxy ${USER}:style@999.999.999.999 true || \
+	fail "ssh proxyconnect failed"
diff --git a/regress/putty-ciphers.sh b/regress/putty-ciphers.sh
index 9adba67..191a2bd 100644
--- a/regress/putty-ciphers.sh
+++ b/regress/putty-ciphers.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: putty-ciphers.sh,v 1.5 2016/11/25 03:02:01 dtucker Exp $
+#	$OpenBSD: putty-ciphers.sh,v 1.6 2017/05/08 01:52:49 djm Exp $
 #	Placed in the Public Domain.
 
 tid="putty ciphers"
@@ -8,14 +8,14 @@
 	exit 0
 fi
 
-for c in aes blowfish 3des arcfour aes128-ctr aes192-ctr aes256-ctr ; do
+for c in aes 3des aes128-ctr aes192-ctr aes256-ctr ; do
 	verbose "$tid: cipher $c"
 	cp ${OBJ}/.putty/sessions/localhost_proxy \
 	    ${OBJ}/.putty/sessions/cipher_$c
 	echo "Cipher=$c" >> ${OBJ}/.putty/sessions/cipher_$c
 
 	rm -f ${COPY}
-	env HOME=$PWD ${PLINK} -load cipher_$c -batch -i putty.rsa2 \
+	env HOME=$PWD ${PLINK} -load cipher_$c -batch -i ${OBJ}/putty.rsa2 \
 	    cat ${DATA} > ${COPY}
 	if [ $? -ne 0 ]; then
 		fail "ssh cat $DATA failed"
diff --git a/regress/putty-kex.sh b/regress/putty-kex.sh
index 9d3c6a9..71c0970 100644
--- a/regress/putty-kex.sh
+++ b/regress/putty-kex.sh
@@ -14,7 +14,7 @@
 	    ${OBJ}/.putty/sessions/kex_$k
 	echo "KEX=$k" >> ${OBJ}/.putty/sessions/kex_$k
 
-	env HOME=$PWD ${PLINK} -load kex_$k -batch -i putty.rsa2 true
+	env HOME=$PWD ${PLINK} -load kex_$k -batch -i ${OBJ}/putty.rsa2 true
 	if [ $? -ne 0 ]; then
 		fail "KEX $k failed"
 	fi
diff --git a/regress/putty-transfer.sh b/regress/putty-transfer.sh
index 8eb6ae0..4928d45 100644
--- a/regress/putty-transfer.sh
+++ b/regress/putty-transfer.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: putty-transfer.sh,v 1.4 2016/11/25 03:02:01 dtucker Exp $
+#	$OpenBSD: putty-transfer.sh,v 1.6 2018/02/23 03:03:00 djm Exp $
 #	Placed in the Public Domain.
 
 tid="putty transfer data"
@@ -8,33 +8,30 @@
 	exit 0
 fi
 
-# XXX support protocol 1 too
-for p in 2; do
-	for c in 0 1 ; do 
-	verbose "$tid: proto $p compression $c"
+for c in 0 1 ; do 
+	verbose "$tid: compression $c"
+	rm -f ${COPY}
+	cp ${OBJ}/.putty/sessions/localhost_proxy \
+	    ${OBJ}/.putty/sessions/compression_$c
+	echo "Compression=$c" >> ${OBJ}/.putty/sessions/kex_$k
+	env HOME=$PWD ${PLINK} -load compression_$c -batch \
+	    -i ${OBJ}/putty.rsa2 cat ${DATA} > ${COPY}
+	if [ $? -ne 0 ]; then
+		fail "ssh cat $DATA failed"
+	fi
+	cmp ${DATA} ${COPY}		|| fail "corrupted copy"
+
+	for s in 10 100 1k 32k 64k 128k 256k; do
+		trace "compression $c dd-size ${s}"
 		rm -f ${COPY}
-		cp ${OBJ}/.putty/sessions/localhost_proxy \
-		    ${OBJ}/.putty/sessions/compression_$c
-		echo "Compression=$c" >> ${OBJ}/.putty/sessions/kex_$k
-		env HOME=$PWD ${PLINK} -load compression_$c -batch \
-		    -i putty.rsa$p cat ${DATA} > ${COPY}
+		dd if=$DATA obs=${s} 2> /dev/null | \
+			env HOME=$PWD ${PLINK} -load compression_$c \
+			    -batch -i ${OBJ}/putty.rsa2 \
+			    "cat > ${COPY}"
 		if [ $? -ne 0 ]; then
 			fail "ssh cat $DATA failed"
 		fi
-		cmp ${DATA} ${COPY}		|| fail "corrupted copy"
-	
-		for s in 10 100 1k 32k 64k 128k 256k; do
-			trace "proto $p compression $c dd-size ${s}"
-			rm -f ${COPY}
-			dd if=$DATA obs=${s} 2> /dev/null | \
-				env HOME=$PWD ${PLINK} -load compression_$c \
-				    -batch -i putty.rsa$p \
-				    "cat > ${COPY}"
-			if [ $? -ne 0 ]; then
-				fail "ssh cat $DATA failed"
-			fi
-			cmp $DATA ${COPY}	|| fail "corrupted copy"
-		done
+		cmp $DATA ${COPY}	|| fail "corrupted copy"
 	done
 done
 rm -f ${COPY}
diff --git a/regress/reconfigure.sh b/regress/reconfigure.sh
index eecddd3..dd15edd 100644
--- a/regress/reconfigure.sh
+++ b/regress/reconfigure.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: reconfigure.sh,v 1.5 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: reconfigure.sh,v 1.6 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="simple connect after reconfigure"
@@ -18,12 +18,10 @@
 start_sshd
 
 trace "connect before restart"
-for p in ${SSH_PROTOCOLS} ; do
-	${SSH} -o "Protocol=$p" -F $OBJ/ssh_config somehost true
-	if [ $? -ne 0 ]; then
-		fail "ssh connect with protocol $p failed before reconfigure"
-	fi
-done
+${SSH} -F $OBJ/ssh_config somehost true
+if [ $? -ne 0 ]; then
+	fail "ssh connect with failed before reconfigure"
+fi
 
 PID=`$SUDO cat $PIDFILE`
 rm -f $PIDFILE
@@ -39,9 +37,7 @@
 test -f $PIDFILE || fatal "sshd did not restart"
 
 trace "connect after restart"
-for p in ${SSH_PROTOCOLS} ; do
-	${SSH} -o "Protocol=$p" -F $OBJ/ssh_config somehost true
-	if [ $? -ne 0 ]; then
-		fail "ssh connect with protocol $p failed after reconfigure"
-	fi
-done
+${SSH} -F $OBJ/ssh_config somehost true
+if [ $? -ne 0 ]; then
+	fail "ssh connect with failed after reconfigure"
+fi
diff --git a/regress/reexec.sh b/regress/reexec.sh
index 72957d4..2192456 100644
--- a/regress/reexec.sh
+++ b/regress/reexec.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: reexec.sh,v 1.10 2016/12/16 01:06:27 dtucker Exp $
+#	$OpenBSD: reexec.sh,v 1.12 2017/08/07 03:52:55 dtucker Exp $
 #	Placed in the Public Domain.
 
 tid="reexec tests"
@@ -19,16 +19,13 @@
 copy_tests ()
 {
 	rm -f ${COPY}
-	for p in ${SSH_PROTOCOLS} ; do
-		verbose "$tid: proto $p"
-		${SSH} -nqo "Protocol=$p" -F $OBJ/ssh_config somehost \
-		    cat ${DATA} > ${COPY}
-		if [ $? -ne 0 ]; then
-			fail "ssh cat $DATA failed"
-		fi
-		cmp ${DATA} ${COPY}		|| fail "corrupted copy"
-		rm -f ${COPY}
-	done
+	${SSH} -nq -F $OBJ/ssh_config somehost \
+	    cat ${DATA} > ${COPY}
+	if [ $? -ne 0 ]; then
+		fail "ssh cat $DATA failed"
+	fi
+	cmp ${DATA} ${COPY}		|| fail "corrupted copy"
+	rm -f ${COPY}
 }
 
 verbose "test config passing"
@@ -54,17 +51,4 @@
 copy_tests
 
 stop_sshd
-
-verbose "test reexec fallback without privsep"
-
-cp $OBJ/sshd_config.orig $OBJ/sshd_config
-echo "UsePrivilegeSeparation=no" >> $OBJ/sshd_config
-
-start_sshd_copy
-rm -f $SSHD_COPY
-
-copy_tests
-
-stop_sshd
-
 fi
diff --git a/regress/rekey.sh b/regress/rekey.sh
index ae145bc..fd6a02c 100644
--- a/regress/rekey.sh
+++ b/regress/rekey.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: rekey.sh,v 1.17 2016/01/29 05:18:15 dtucker Exp $
+#	$OpenBSD: rekey.sh,v 1.18 2018/04/10 00:14:10 djm Exp $
 #	Placed in the Public Domain.
 
 tid="rekey"
@@ -30,7 +30,7 @@
 	n=`expr $n - 1`
 	trace "$n rekeying(s)"
 	if [ $n -lt 1 ]; then
-		fail "no rekeying occured ($@)"
+		fail "no rekeying occurred ($@)"
 	fi
 }
 
@@ -80,7 +80,7 @@
 	n=`expr $n - 1`
 	trace "$n rekeying(s)"
 	if [ $n -lt 1 ]; then
-		fail "no rekeying occured"
+		fail "no rekeying occurred"
 	fi
 done
 
@@ -96,7 +96,7 @@
 	n=`expr $n - 1`
 	trace "$n rekeying(s)"
 	if [ $n -lt 1 ]; then
-		fail "no rekeying occured"
+		fail "no rekeying occurred"
 	fi
 done
 
@@ -115,7 +115,7 @@
 	n=`expr $n - 1`
 	trace "$n rekeying(s)"
 	if [ $n -lt 1 ]; then
-		fail "no rekeying occured"
+		fail "no rekeying occurred"
 	fi
 done
 
@@ -132,7 +132,7 @@
 	n=`expr $n - 1`
 	trace "$n rekeying(s)"
 	if [ $n -lt 1 ]; then
-		fail "no rekeying occured"
+		fail "no rekeying occurred"
 	fi
 done
 
diff --git a/regress/scp-uri.sh b/regress/scp-uri.sh
new file mode 100644
index 0000000..c03d8bb
--- /dev/null
+++ b/regress/scp-uri.sh
@@ -0,0 +1,70 @@
+#	$OpenBSD: scp-uri.sh,v 1.2 2017/12/11 11:41:56 dtucker Exp $
+#	Placed in the Public Domain.
+
+tid="scp-uri"
+
+#set -x
+
+COPY2=${OBJ}/copy2
+DIR=${COPY}.dd
+DIR2=${COPY}.dd2
+
+SRC=`dirname ${SCRIPT}`
+cp ${SRC}/scp-ssh-wrapper.sh ${OBJ}/scp-ssh-wrapper.scp
+chmod 755 ${OBJ}/scp-ssh-wrapper.scp
+scpopts="-q -S ${OBJ}/scp-ssh-wrapper.scp"
+export SCP # used in scp-ssh-wrapper.scp
+
+scpclean() {
+	rm -rf ${COPY} ${COPY2} ${DIR} ${DIR2}
+	mkdir ${DIR} ${DIR2}
+}
+
+# Remove Port and User from ssh_config, we want to rely on the URI
+cp $OBJ/ssh_config $OBJ/ssh_config.orig
+egrep -v '^	+(Port|User)	+.*$' $OBJ/ssh_config.orig > $OBJ/ssh_config
+
+verbose "$tid: simple copy local file to remote file"
+scpclean
+$SCP $scpopts ${DATA} "scp://${USER}@somehost:${PORT}/${COPY}" || fail "copy failed"
+cmp ${DATA} ${COPY} || fail "corrupted copy"
+
+verbose "$tid: simple copy remote file to local file"
+scpclean
+$SCP $scpopts "scp://${USER}@somehost:${PORT}/${DATA}" ${COPY} || fail "copy failed"
+cmp ${DATA} ${COPY} || fail "corrupted copy"
+
+verbose "$tid: simple copy local file to remote dir"
+scpclean
+cp ${DATA} ${COPY}
+$SCP $scpopts ${COPY} "scp://${USER}@somehost:${PORT}/${DIR}" || fail "copy failed"
+cmp ${COPY} ${DIR}/copy || fail "corrupted copy"
+
+verbose "$tid: simple copy remote file to local dir"
+scpclean
+cp ${DATA} ${COPY}
+$SCP $scpopts "scp://${USER}@somehost:${PORT}/${COPY}" ${DIR} || fail "copy failed"
+cmp ${COPY} ${DIR}/copy || fail "corrupted copy"
+
+verbose "$tid: recursive local dir to remote dir"
+scpclean
+rm -rf ${DIR2}
+cp ${DATA} ${DIR}/copy
+$SCP $scpopts -r ${DIR} "scp://${USER}@somehost:${PORT}/${DIR2}" || fail "copy failed"
+for i in $(cd ${DIR} && echo *); do
+	cmp ${DIR}/$i ${DIR2}/$i || fail "corrupted copy"
+done
+
+verbose "$tid: recursive remote dir to local dir"
+scpclean
+rm -rf ${DIR2}
+cp ${DATA} ${DIR}/copy
+$SCP $scpopts -r "scp://${USER}@somehost:${PORT}/${DIR}" ${DIR2} || fail "copy failed"
+for i in $(cd ${DIR} && echo *); do
+	cmp ${DIR}/$i ${DIR2}/$i || fail "corrupted copy"
+done
+
+# TODO: scp -3
+
+scpclean
+rm -f ${OBJ}/scp-ssh-wrapper.exe
diff --git a/regress/setuid-allowed.c b/regress/setuid-allowed.c
index 7a0527f..d91d9f1 100644
--- a/regress/setuid-allowed.c
+++ b/regress/setuid-allowed.c
@@ -22,6 +22,7 @@
 #ifdef HAVE_SYS_STATVFS_H
 # include <sys/statvfs.h>
 #endif
+#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
diff --git a/regress/sftp-chroot.sh b/regress/sftp-chroot.sh
index 4ea2fce..ba5bd1e 100644
--- a/regress/sftp-chroot.sh
+++ b/regress/sftp-chroot.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: sftp-chroot.sh,v 1.5 2016/09/26 21:34:38 bluhm Exp $
+#	$OpenBSD: sftp-chroot.sh,v 1.6 2018/02/09 03:42:57 dtucker Exp $
 #	Placed in the Public Domain.
 
 tid="sftp in chroot"
@@ -8,8 +8,9 @@
 PRIVDATA=${CHROOT}/${FILENAME}
 
 if [ -z "$SUDO" -a ! -w /var/run ]; then
-  echo "skipped: need SUDO to create file in /var/run, test won't work without"
-  exit 0
+	echo "need SUDO to create file in /var/run, test won't work without"
+	echo SKIPPED
+	exit 0
 fi
 
 if ! $OBJ/check-perm -m chroot "$CHROOT" ; then
diff --git a/regress/sftp-uri.sh b/regress/sftp-uri.sh
new file mode 100644
index 0000000..7be104d
--- /dev/null
+++ b/regress/sftp-uri.sh
@@ -0,0 +1,63 @@
+#	$OpenBSD: sftp-uri.sh,v 1.1 2017/10/24 19:33:32 millert Exp $
+#	Placed in the Public Domain.
+
+tid="sftp-uri"
+
+#set -x
+
+COPY2=${OBJ}/copy2
+DIR=${COPY}.dd
+DIR2=${COPY}.dd2
+SRC=`dirname ${SCRIPT}`
+
+sftpclean() {
+	rm -rf ${COPY} ${COPY2} ${DIR} ${DIR2}
+	mkdir ${DIR} ${DIR2}
+}
+
+start_sshd -oForceCommand="internal-sftp -d /"
+
+# Remove Port and User from ssh_config, we want to rely on the URI
+cp $OBJ/ssh_config $OBJ/ssh_config.orig
+egrep -v '^	+(Port|User)	+.*$' $OBJ/ssh_config.orig > $OBJ/ssh_config
+
+verbose "$tid: non-interactive fetch to local file"
+sftpclean
+${SFTP} -q -S "$SSH" -F $OBJ/ssh_config "sftp://${USER}@somehost:${PORT}/${DATA}" ${COPY} || fail "copy failed"
+cmp ${DATA} ${COPY} || fail "corrupted copy"
+
+verbose "$tid: non-interactive fetch to local dir"
+sftpclean
+cp ${DATA} ${COPY}
+${SFTP} -q -S "$SSH" -F $OBJ/ssh_config "sftp://${USER}@somehost:${PORT}/${COPY}" ${DIR} || fail "copy failed"
+cmp ${COPY} ${DIR}/copy || fail "corrupted copy"
+
+verbose "$tid: put to remote directory (trailing slash)"
+sftpclean
+${SFTP} -q -S "$SSH" -F $OBJ/ssh_config -b - \
+    "sftp://${USER}@somehost:${PORT}/${DIR}/" > /dev/null 2>&1 << EOF
+	version
+	put ${DATA} copy
+EOF
+r=$?
+if [ $r -ne 0 ]; then
+	fail "sftp failed with $r"
+else
+	cmp ${DATA} ${DIR}/copy || fail "corrupted copy"
+fi
+
+verbose "$tid: put to remote directory (no slash)"
+sftpclean
+${SFTP} -q -S "$SSH" -F $OBJ/ssh_config -b - \
+    "sftp://${USER}@somehost:${PORT}/${DIR}" > /dev/null 2>&1 << EOF
+	version
+	put ${DATA} copy
+EOF
+r=$?
+if [ $r -ne 0 ]; then
+	fail "sftp failed with $r"
+else
+	cmp ${DATA} ${DIR}/copy || fail "corrupted copy"
+fi
+
+sftpclean
diff --git a/regress/sftp.sh b/regress/sftp.sh
index b8e9f75..a5c88f5 100644
--- a/regress/sftp.sh
+++ b/regress/sftp.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: sftp.sh,v 1.5 2013/05/17 10:28:11 dtucker Exp $
+#	$OpenBSD: sftp.sh,v 1.6 2017/10/30 21:59:43 djm Exp $
 #	Placed in the Public Domain.
 
 tid="basic sftp put/get"
@@ -22,11 +22,11 @@
 		r=$?
 		if [ $r -ne 0 ]; then
 			fail "sftp failed with $r"
-		else 
+		else
 			cmp $DATA ${COPY}.1 || fail "corrupted copy after get"
 			cmp $DATA ${COPY}.2 || fail "corrupted copy after put"
 		fi
 	done
 done
-rm -f ${COPY}.1 ${COPY}.2                
+rm -f ${COPY}.1 ${COPY}.2
 rm -f $SFTPCMDFILE
diff --git a/regress/ssh-com.sh b/regress/ssh-com.sh
index 4371d52..b1a2505 100644
--- a/regress/ssh-com.sh
+++ b/regress/ssh-com.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: ssh-com.sh,v 1.9 2015/05/08 07:29:00 djm Exp $
+#	$OpenBSD: ssh-com.sh,v 1.10 2017/05/08 01:52:49 djm Exp $
 #	Placed in the Public Domain.
 
 tid="connect to ssh.com server"
@@ -87,7 +87,7 @@
                 fail "ssh connect to sshd2 ${v} failed"
         fi
 
-	ciphers="3des-cbc blowfish-cbc arcfour"
+	ciphers="3des-cbc"
 	macs="hmac-md5"
 	case $v in
 	2.4.*)
diff --git a/regress/sshcfgparse.sh b/regress/sshcfgparse.sh
index 010e028..e0ce568 100644
--- a/regress/sshcfgparse.sh
+++ b/regress/sshcfgparse.sh
@@ -1,8 +1,27 @@
-#	$OpenBSD: sshcfgparse.sh,v 1.2 2016/07/14 01:24:21 dtucker Exp $
+#	$OpenBSD: sshcfgparse.sh,v 1.4 2018/07/04 13:51:12 djm Exp $
 #	Placed in the Public Domain.
 
 tid="ssh config parse"
 
+expect_result_present() {
+	_str="$1" ; shift
+	for _expect in "$@" ; do
+		echo "$f" | tr ',' '\n' | grep "^$_expect\$" >/dev/null
+		if test $? -ne 0 ; then
+			fail "missing expected \"$_expect\" from \"$_str\""
+		fi
+	done
+}
+expect_result_absent() {
+	_str="$1" ; shift
+	for _expect in "$@" ; do
+		echo "$f" | tr ',' '\n' | grep "^$_expect\$" >/dev/null
+		if test $? -eq 0 ; then
+			fail "unexpected \"$_expect\" present in \"$_str\""
+		fi
+	done
+}
+
 verbose "reparse minimal config"
 (${SSH} -G -F $OBJ/ssh_config somehost >$OBJ/ssh_config.1 &&
  ${SSH} -G -F $OBJ/ssh_config.1 somehost >$OBJ/ssh_config.2 &&
@@ -25,5 +44,46 @@
     awk '/clearallforwardings/{print $2}'`
 test "$f" = "no" || fail "clearallforwardings override"
 
+verbose "user first match"
+user=`awk '$1=="User" {print $2}' $OBJ/ssh_config`
+f=`${SSH} -GF $OBJ/ssh_config host | awk '/^user /{print $2}'`
+test "$f" = "$user" || fail "user from config, expected '$user' got '$f'"
+f=`${SSH} -GF $OBJ/ssh_config -o user=foo -l bar baz@host | awk '/^user /{print $2}'`
+test "$f" = "foo" || fail "user first match -oUser, expected 'foo' got '$f' "
+f=`${SSH} -GF $OBJ/ssh_config -lbar baz@host user=foo baz@host | awk '/^user /{print $2}'`
+test "$f" = "bar" || fail "user first match -l, expected 'bar' got '$f'"
+f=`${SSH} -GF $OBJ/ssh_config baz@host -o user=foo -l bar baz@host | awk '/^user /{print $2}'`
+test "$f" = "baz" || fail "user first match user@host, expected 'baz' got '$f'"
+
+verbose "pubkeyacceptedkeytypes"
+# Default set
+f=`${SSH} -GF none host | awk '/^pubkeyacceptedkeytypes /{print $2}'`
+expect_result_present "$f" "ssh-ed25519" "ssh-ed25519-cert-v01.*"
+expect_result_absent "$f" "ssh-dss"
+# Explicit override
+f=`${SSH} -GF none -opubkeyacceptedkeytypes=ssh-ed25519 host | \
+    awk '/^pubkeyacceptedkeytypes /{print $2}'`
+expect_result_present "$f" "ssh-ed25519"
+expect_result_absent "$f" "ssh-ed25519-cert-v01.*" "ssh-dss"
+# Removal from default set
+f=`${SSH} -GF none -opubkeyacceptedkeytypes=-ssh-ed25519-cert* host | \
+    awk '/^pubkeyacceptedkeytypes /{print $2}'`
+expect_result_present "$f" "ssh-ed25519"
+expect_result_absent "$f" "ssh-ed25519-cert-v01.*" "ssh-dss"
+f=`${SSH} -GF none -opubkeyacceptedkeytypes=-ssh-ed25519 host | \
+    awk '/^pubkeyacceptedkeytypes /{print $2}'`
+expect_result_present "$f" "ssh-ed25519-cert-v01.*"
+expect_result_absent "$f" "ssh-ed25519" "ssh-dss"
+# Append to default set.
+# XXX this will break for !WITH_OPENSSL
+f=`${SSH} -GF none -opubkeyacceptedkeytypes=+ssh-dss-cert* host | \
+    awk '/^pubkeyacceptedkeytypes /{print $2}'`
+expect_result_present "$f" "ssh-ed25519" "ssh-dss-cert-v01.*"
+expect_result_absent "$f" "ssh-dss"
+f=`${SSH} -GF none -opubkeyacceptedkeytypes=+ssh-dss host | \
+    awk '/^pubkeyacceptedkeytypes /{print $2}'`
+expect_result_present "$f" "ssh-ed25519" "ssh-ed25519-cert-v01.*" "ssh-dss"
+expect_result_absent "$f" "ssh-dss-cert-v01.*"
+
 # cleanup
 rm -f $OBJ/ssh_config.[012]
diff --git a/regress/sshd-log-wrapper.sh b/regress/sshd-log-wrapper.sh
index c00934c..29dc44a 100644
--- a/regress/sshd-log-wrapper.sh
+++ b/regress/sshd-log-wrapper.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-#       $OpenBSD: sshd-log-wrapper.sh,v 1.3 2013/04/07 02:16:03 dtucker Exp $
+#       $OpenBSD: sshd-log-wrapper.sh,v 1.4 2016/11/25 02:56:49 dtucker Exp $
 #       Placed in the Public Domain.
 #
 # simple wrapper for sshd proxy mode to catch stderr output
diff --git a/regress/stderr-after-eof.sh b/regress/stderr-after-eof.sh
index 218ac6b..9065245 100644
--- a/regress/stderr-after-eof.sh
+++ b/regress/stderr-after-eof.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: stderr-after-eof.sh,v 1.2 2013/05/17 04:29:14 dtucker Exp $
+#	$OpenBSD: stderr-after-eof.sh,v 1.3 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="stderr data after eof"
@@ -10,7 +10,7 @@
 	(date;echo $i) | md5 >> ${DATA}
 done
 
-${SSH} -2 -F $OBJ/ssh_proxy otherhost \
+${SSH} -F $OBJ/ssh_proxy otherhost \
 	exec sh -c \'"exec > /dev/null; sleep 2; cat ${DATA} 1>&2 $s"\' \
 	2> ${COPY}
 r=$?
diff --git a/regress/stderr-data.sh b/regress/stderr-data.sh
index 8c8149a..0ceb72b 100644
--- a/regress/stderr-data.sh
+++ b/regress/stderr-data.sh
@@ -1,13 +1,12 @@
-#	$OpenBSD: stderr-data.sh,v 1.4 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: stderr-data.sh,v 1.5 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="stderr data transfer"
 
 for n in '' -n; do
-for p in ${SSH_PROTOCOLS}; do
-	verbose "test $tid: proto $p ($n)"
-	${SSH} $n -$p -F $OBJ/ssh_proxy otherhost \
-		exec sh -c \'"exec > /dev/null; sleep 3; cat ${DATA} 1>&2 $s"\' \
+	verbose "test $tid: ($n)"
+	${SSH} $n -F $OBJ/ssh_proxy otherhost exec \
+	    sh -c \'"exec > /dev/null; sleep 3; cat ${DATA} 1>&2 $s"\' \
 		2> ${COPY}
 	r=$?
 	if [ $r -ne 0 ]; then
@@ -16,8 +15,8 @@
 	cmp ${DATA} ${COPY}	|| fail "stderr corrupt"
 	rm -f ${COPY}
 
-	${SSH} $n -$p -F $OBJ/ssh_proxy otherhost \
-		exec sh -c \'"echo a; exec > /dev/null; sleep 3; cat ${DATA} 1>&2 $s"\' \
+	${SSH} $n -F $OBJ/ssh_proxy otherhost exec \
+	    sh -c \'"echo a; exec > /dev/null; sleep 3; cat ${DATA} 1>&2 $s"\' \
 		> /dev/null 2> ${COPY}
 	r=$?
 	if [ $r -ne 0 ]; then
@@ -26,4 +25,3 @@
 	cmp ${DATA} ${COPY}	|| fail "stderr corrupt"
 	rm -f ${COPY}
 done
-done
diff --git a/regress/test-exec.sh b/regress/test-exec.sh
index dc033cd..40d46e3 100644
--- a/regress/test-exec.sh
+++ b/regress/test-exec.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: test-exec.sh,v 1.59 2017/02/07 23:03:11 dtucker Exp $
+#	$OpenBSD: test-exec.sh,v 1.64 2018/08/10 01:35:49 dtucker Exp $
 #	Placed in the Public Domain.
 
 #SUDO=sudo
@@ -76,6 +76,9 @@
 SFTPSERVER=/usr/libexec/openssh/sftp-server
 SCP=scp
 
+# Set by make_tmpdir() on demand (below).
+SSH_REGRESS_TMP=
+
 # Interop testing
 PLINK=plink
 PUTTYGEN=puttygen
@@ -130,12 +133,6 @@
 	esac
 fi
 
-SSH_PROTOCOLS=2
-#SSH_PROTOCOLS=`$SSH -Q protocol-version`
-if [ "x$TEST_SSH_PROTOCOLS" != "x" ]; then
-	SSH_PROTOCOLS="${TEST_SSH_PROTOCOLS}"
-fi
-
 # Path to sshd must be absolute for rexec
 case "$SSHD" in
 /*) ;;
@@ -169,9 +166,13 @@
 	esac
 
 	if [ x"$VG_SKIP" = "x" ]; then
+		VG_LEAK="--leak-check=no"
+		if [ x"$VALGRIND_CHECK_LEAKS" != "x" ]; then
+			VG_LEAK="--leak-check=full"
+		fi
 		VG_IGNORE="/bin/*,/sbin/*,/usr/*,/var/*"
 		VG_LOG="$OBJ/valgrind-out/${VG_TEST}."
-		VG_OPTS="--track-origins=yes --leak-check=full"
+		VG_OPTS="--track-origins=yes $VG_LEAK"
 		VG_OPTS="$VG_OPTS --trace-children=yes"
 		VG_OPTS="$VG_OPTS --trace-children-skip=${VG_IGNORE}"
 		VG_PATH="valgrind"
@@ -310,13 +311,26 @@
 					i=`expr $i + 1`
 					sleep $i
 				done
-				test -f $PIDFILE && \
-				    fatal "sshd didn't exit port $PORT pid $pid"
+				if test -f $PIDFILE; then
+					if $SUDO kill -0 $pid; then
+						echo "sshd didn't exit " \
+						    "port $PORT pid $pid"
+					else
+						echo "sshd died without cleanup"
+					fi
+					exit 1
+				fi
 			fi
 		fi
 	fi
 }
 
+make_tmpdir ()
+{
+	SSH_REGRESS_TMP="$($OBJ/mkdtemp openssh-XXXXXXXX)" || \
+	    fatal "failed to create temporary directory"
+}
+
 # helper
 cleanup ()
 {
@@ -327,6 +341,9 @@
 			kill $SSH_PID
 		fi
 	fi
+	if [ "x$SSH_REGRESS_TMP" != "x" ]; then
+		rm -rf "$SSH_REGRESS_TMP"
+	fi
 	stop_sshd
 }
 
@@ -374,7 +391,10 @@
 	save_debug_log "FAIL: $@"
 	RESULT=1
 	echo "$@"
-
+	if test "x$TEST_SSH_FAIL_FATAL" != "x" ; then
+		cleanup
+		exit $RESULT
+	fi
 }
 
 fatal ()
@@ -386,22 +406,11 @@
 	exit $RESULT
 }
 
-ssh_version ()
-{
-	echo ${SSH_PROTOCOLS} | grep "$1" >/dev/null
-}
-
 RESULT=0
 PIDFILE=$OBJ/pidfile
 
 trap fatal 3 2
 
-if ssh_version 1; then
-	PROTO="2,1"
-else
-	PROTO="2"
-fi
-
 # create server config
 cat << EOF > $OBJ/sshd_config
 	StrictModes		no
@@ -460,11 +469,8 @@
 
 rm -f $OBJ/known_hosts $OBJ/authorized_keys_$USER
 
-if ssh_version 1; then
-	SSH_KEYTYPES="rsa rsa1"
-else
-	SSH_KEYTYPES="rsa ed25519"
-fi
+SSH_KEYTYPES="rsa ed25519"
+
 trace "generate keys"
 for t in ${SSH_KEYTYPES}; do
 	# generate user key
@@ -516,6 +522,7 @@
 	# Add a PuTTY key to authorized_keys
 	rm -f ${OBJ}/putty.rsa2
 	if ! puttygen -t rsa -o ${OBJ}/putty.rsa2 \
+	    --random-device=/dev/urandom \
 	    --new-passphrase /dev/null < /dev/null > /dev/null; then
 		echo "Your installed version of PuTTY is too old to support --new-passphrase; trying without (may require manual interaction) ..." >&2
 		puttygen -t rsa -o ${OBJ}/putty.rsa2 < /dev/null > /dev/null
@@ -524,10 +531,13 @@
 	    >> $OBJ/authorized_keys_$USER
 
 	# Convert rsa2 host key to PuTTY format
-	${SRC}/ssh2putty.sh 127.0.0.1 $PORT $OBJ/rsa > \
+	cp $OBJ/rsa $OBJ/rsa_oldfmt
+	${SSHKEYGEN} -p -N '' -m PEM -f $OBJ/rsa_oldfmt >/dev/null
+	${SRC}/ssh2putty.sh 127.0.0.1 $PORT $OBJ/rsa_oldfmt > \
 	    ${OBJ}/.putty/sshhostkeys
-	${SRC}/ssh2putty.sh 127.0.0.1 22 $OBJ/rsa >> \
+	${SRC}/ssh2putty.sh 127.0.0.1 22 $OBJ/rsa_oldfmt >> \
 	    ${OBJ}/.putty/sshhostkeys
+	rm -f $OBJ/rsa_oldfmt
 
 	# Setup proxied session
 	mkdir -p ${OBJ}/.putty/sessions
@@ -539,6 +549,9 @@
 	echo "ProxyTelnetCommand=sh ${SRC}/sshd-log-wrapper.sh ${TEST_SSHD_LOGFILE} ${SSHD} -i -f $OBJ/sshd_proxy" >> ${OBJ}/.putty/sessions/localhost_proxy
 	echo "ProxyLocalhost=1" >> ${OBJ}/.putty/sessions/localhost_proxy
 
+	PUTTYDIR=${OBJ}/.putty
+	export PUTTYDIR
+
 	REGRESS_INTEROP_PUTTY=yes
 fi
 
diff --git a/regress/transfer.sh b/regress/transfer.sh
index 36c1463..cf174a0 100644
--- a/regress/transfer.sh
+++ b/regress/transfer.sh
@@ -1,26 +1,23 @@
-#	$OpenBSD: transfer.sh,v 1.3 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: transfer.sh,v 1.4 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="transfer data"
 
-for p in ${SSH_PROTOCOLS}; do
-	verbose "$tid: proto $p"
+rm -f ${COPY}
+${SSH} -n -q -F $OBJ/ssh_proxy somehost cat ${DATA} > ${COPY}
+if [ $? -ne 0 ]; then
+	fail "ssh cat $DATA failed"
+fi
+cmp ${DATA} ${COPY}		|| fail "corrupted copy"
+
+for s in 10 100 1k 32k 64k 128k 256k; do
+	trace "dd-size ${s}"
 	rm -f ${COPY}
-	${SSH} -n -q -$p -F $OBJ/ssh_proxy somehost cat ${DATA} > ${COPY}
+	dd if=$DATA obs=${s} 2> /dev/null | \
+		${SSH} -q -F $OBJ/ssh_proxy somehost "cat > ${COPY}"
 	if [ $? -ne 0 ]; then
 		fail "ssh cat $DATA failed"
 	fi
-	cmp ${DATA} ${COPY}		|| fail "corrupted copy"
-
-	for s in 10 100 1k 32k 64k 128k 256k; do
-		trace "proto $p dd-size ${s}"
-		rm -f ${COPY}
-		dd if=$DATA obs=${s} 2> /dev/null | \
-			${SSH} -q -$p -F $OBJ/ssh_proxy somehost "cat > ${COPY}"
-		if [ $? -ne 0 ]; then
-			fail "ssh cat $DATA failed"
-		fi
-		cmp $DATA ${COPY}		|| fail "corrupted copy"
-	done
+	cmp $DATA ${COPY}		|| fail "corrupted copy"
 done
 rm -f ${COPY}
diff --git a/regress/try-ciphers.sh b/regress/try-ciphers.sh
index 889a735..e04268b 100644
--- a/regress/try-ciphers.sh
+++ b/regress/try-ciphers.sh
@@ -1,4 +1,4 @@
-#	$OpenBSD: try-ciphers.sh,v 1.25 2015/03/24 20:22:17 markus Exp $
+#	$OpenBSD: try-ciphers.sh,v 1.26 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="try ciphers"
@@ -8,14 +8,14 @@
 for c in `${SSH} -Q cipher`; do
 	n=0
 	for m in `${SSH} -Q mac`; do
-		trace "proto 2 cipher $c mac $m"
-		verbose "test $tid: proto 2 cipher $c mac $m"
+		trace "cipher $c mac $m"
+		verbose "test $tid: cipher $c mac $m"
 		cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
 		echo "Ciphers=$c" >> $OBJ/sshd_proxy
 		echo "MACs=$m" >> $OBJ/sshd_proxy
-		${SSH} -F $OBJ/ssh_proxy -2 -m $m -c $c somehost true
+		${SSH} -F $OBJ/ssh_proxy -m $m -c $c somehost true
 		if [ $? -ne 0 ]; then
-			fail "ssh -2 failed with mac $m cipher $c"
+			fail "ssh failed with mac $m cipher $c"
 		fi
 		# No point trying all MACs for AEAD ciphers since they
 		# are ignored.
@@ -26,17 +26,3 @@
 	done
 done
 
-if ssh_version 1; then
-	ciphers="3des blowfish"
-else
-	ciphers=""
-fi
-for c in $ciphers; do
-	trace "proto 1 cipher $c"
-	verbose "test $tid: proto 1 cipher $c"
-	${SSH} -F $OBJ/ssh_proxy -1 -c $c somehost true
-	if [ $? -ne 0 ]; then
-		fail "ssh -1 failed with cipher $c"
-	fi
-done
-
diff --git a/regress/unittests/Makefile b/regress/unittests/Makefile
index e70b166..e464b08 100644
--- a/regress/unittests/Makefile
+++ b/regress/unittests/Makefile
@@ -1,5 +1,7 @@
-#	$OpenBSD: Makefile,v 1.7 2016/08/19 06:44:13 djm Exp $
-REGRESS_FAIL_EARLY= yes
-SUBDIR=	test_helper sshbuf sshkey bitmap kex hostkeys utf8 match
+#	$OpenBSD: Makefile,v 1.10 2018/03/03 03:16:17 djm Exp $
+
+REGRESS_FAIL_EARLY?=	yes
+SUBDIR=	test_helper sshbuf sshkey bitmap kex hostkeys utf8 match conversion
+SUBDIR+=authopt
 
 .include <bsd.subdir.mk>
diff --git a/regress/unittests/Makefile.inc b/regress/unittests/Makefile.inc
index 3d9eaba..b509f44 100644
--- a/regress/unittests/Makefile.inc
+++ b/regress/unittests/Makefile.inc
@@ -1,4 +1,4 @@
-#	$OpenBSD: Makefile.inc,v 1.9 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile.inc,v 1.12 2017/12/21 00:41:22 djm Exp $
 
 .include <bsd.own.mk>
 .include <bsd.obj.mk>
@@ -30,8 +30,8 @@
 CDIAGFLAGS+=	-Wtrigraphs
 CDIAGFLAGS+=	-Wuninitialized
 CDIAGFLAGS+=	-Wunused
-.if ${COMPILER_VERSION} == "gcc4"
-CDIAGFLAGS+=	-Wpointer-sign
+CDIAGFLAGS+=	-Wno-unused-parameter
+.if ${COMPILER_VERSION:L} != "gcc3"
 CDIAGFLAGS+=	-Wold-style-definition
 .endif
 
@@ -47,17 +47,7 @@
 DPADD+=${.CURDIR}/../test_helper/libtest_helper.a
 .endif
 
-.if exists(${.CURDIR}/${SSHREL}/lib/${__objdir})
-LDADD+=-L${.CURDIR}/${SSHREL}/lib/${__objdir} -lssh
-LIBSSH=${.CURDIR}/${SSHREL}/lib/${__objdir}/libssh.a
-.else
-LDADD+=-L${.CURDIR}/${SSHREL}/lib -lssh
-LIBSSH=${.CURDIR}/${SSHREL}/lib/libssh.a
-.endif
-DPADD+=${LIBSSH}
-${PROG}: ${LIBSSH}
-${LIBSSH}:
-	cd ${.CURDIR}/${SSHREL} && ${MAKE} lib
+.PATH: ${.CURDIR}/${SSHREL}
 
 LDADD+= -lcrypto
 DPADD+= ${LIBCRYPTO}
diff --git a/regress/unittests/authopt/testdata/all_permit.cert b/regress/unittests/authopt/testdata/all_permit.cert
new file mode 100644
index 0000000..38ac573
--- /dev/null
+++ b/regress/unittests/authopt/testdata/all_permit.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIOv/h7mJS1WkRHukSvqPwKDiNVrcib/VqBLpbHW6xjWCAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgKFWCzCzQTh9UkoHphbgwaa86Q16Kern0UjqOr7Q+Jk8AAABTAAAAC3NzaC1lZDI1NTE5AAAAQNe1XDN+J4Eb82TH5J5sYypcabocufjTFRfpU57K+csRP41Yo1FCSEWx95ilUuNvK9Iv3yFDOeVPzdqRqzWoHwE= user key
diff --git a/regress/unittests/authopt/testdata/bad_sourceaddr.cert b/regress/unittests/authopt/testdata/bad_sourceaddr.cert
new file mode 100644
index 0000000..9732745
--- /dev/null
+++ b/regress/unittests/authopt/testdata/bad_sourceaddr.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAILFEJyunlz9scYU3mwbOEJoSSkeO1z20uNBw13tEn+lJAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAHwAAAA5zb3VyY2UtYWRkcmVzcwAAAAkAAAAFeHh4eHgAAACCAAAAFXBlcm1pdC1YMTEtZm9yd2FyZGluZwAAAAAAAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAFnBlcm1pdC1wb3J0LWZvcndhcmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnBlcm1pdC11c2VyLXJjAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIChVgsws0E4fVJKB6YW4MGmvOkNeinq59FI6jq+0PiZPAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEA5xY/OEAJ3tgg8/KJqaBR5KMdYYRDiMJ6u4VKS9lQOV1HJQvDDvjj3F5k53BIqTJRVQx242YWs+B3C4db/uLgB user key
diff --git a/regress/unittests/authopt/testdata/force_command.cert b/regress/unittests/authopt/testdata/force_command.cert
new file mode 100644
index 0000000..f7af27e
--- /dev/null
+++ b/regress/unittests/authopt/testdata/force_command.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIJkpCeqaVl6qnp7qa90KehAmHFecx3HW8HZQ22KEqeKBAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAHAAAAA1mb3JjZS1jb21tYW5kAAAABwAAAANmb28AAACCAAAAFXBlcm1pdC1YMTEtZm9yd2FyZGluZwAAAAAAAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAFnBlcm1pdC1wb3J0LWZvcndhcmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnBlcm1pdC11c2VyLXJjAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIChVgsws0E4fVJKB6YW4MGmvOkNeinq59FI6jq+0PiZPAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEAxbhjgbXvfEumRP1E7VH8nUfuJyVlDChhCxiPg9Nvb9PFK8cHdDUEybDCzKCsIDieRc3mtLTyEu7Kb52va/B4C user key
diff --git a/regress/unittests/authopt/testdata/host.cert b/regress/unittests/authopt/testdata/host.cert
new file mode 100644
index 0000000..6326d04
--- /dev/null
+++ b/regress/unittests/authopt/testdata/host.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIFWMw3ftP29RSefnxQwdvK1KiE2G9Y7rPRrJ7ZsrDiOeAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAACAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAoVYLMLNBOH1SSgemFuDBprzpDXop6ufRSOo6vtD4mTwAAAFMAAAALc3NoLWVkMjU1MTkAAABAKTMqwPkaBg23RS7/aj347dc2kY4bWt/sHwzREYSrKRqZ5RNBnSvZOQ8m5euMCEuf92bZ8VJEdF653jRiW6VoBA== user key
diff --git a/regress/unittests/authopt/testdata/mktestdata.sh b/regress/unittests/authopt/testdata/mktestdata.sh
new file mode 100644
index 0000000..06a24e3
--- /dev/null
+++ b/regress/unittests/authopt/testdata/mktestdata.sh
@@ -0,0 +1,48 @@
+#/bin/sh
+
+set -xe
+
+rm -f ca_key ca_key.pub
+rm -f user_key user_key.pub
+rm -f *.cert
+
+ssh-keygen -q -f ca_key -t ed25519 -C CA -N ''
+ssh-keygen -q -f user_key -t ed25519 -C "user key" -N ''
+
+sign() {
+	output=$1
+	shift
+	set -xe
+	ssh-keygen -q -s ca_key -I user -n user \
+	    -V 19990101:19991231 -z 1 "$@" user_key.pub
+	mv user_key-cert.pub "$output"
+}
+
+sign all_permit.cert -Opermit-agent-forwarding -Opermit-port-forwarding \
+    -Opermit-pty -Opermit-user-rc -Opermit-X11-forwarding
+sign no_permit.cert -Oclear
+
+sign no_agentfwd.cert -Ono-agent-forwarding
+sign no_portfwd.cert -Ono-port-forwarding
+sign no_pty.cert -Ono-pty
+sign no_user_rc.cert -Ono-user-rc
+sign no_x11fwd.cert -Ono-X11-forwarding
+
+sign only_agentfwd.cert -Oclear -Opermit-agent-forwarding
+sign only_portfwd.cert -Oclear -Opermit-port-forwarding
+sign only_pty.cert -Oclear -Opermit-pty
+sign only_user_rc.cert -Oclear -Opermit-user-rc
+sign only_x11fwd.cert -Oclear -Opermit-X11-forwarding
+
+sign force_command.cert -Oforce-command="foo"
+sign sourceaddr.cert -Osource-address="127.0.0.1/32,::1/128"
+
+# ssh-keygen won't permit generation of certs with invalid source-address
+# values, so we do it as a custom extension.
+sign bad_sourceaddr.cert -Ocritical:source-address=xxxxx
+
+sign unknown_critical.cert -Ocritical:blah=foo
+
+sign host.cert -h
+
+rm -f user_key ca_key user_key.pub ca_key.pub
diff --git a/regress/unittests/authopt/testdata/no_agentfwd.cert b/regress/unittests/authopt/testdata/no_agentfwd.cert
new file mode 100644
index 0000000..bfa5c2e
--- /dev/null
+++ b/regress/unittests/authopt/testdata/no_agentfwd.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIL2qEsLCVtKaBkbCrZicxbPUorcHHrQ8yw5h/26krTOlAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAGMAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABZwZXJtaXQtcG9ydC1mb3J3YXJkaW5nAAAAAAAAAApwZXJtaXQtcHR5AAAAAAAAAA5wZXJtaXQtdXNlci1yYwAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAoVYLMLNBOH1SSgemFuDBprzpDXop6ufRSOo6vtD4mTwAAAFMAAAALc3NoLWVkMjU1MTkAAABAdRhISpol01OwV30g39PM/JD1t35muskX4lyCcGpFQ08GQtBuHE/hABOp6apbGBJIC7CZYYF+uHkD7PfGU3NPAQ== user key
diff --git a/regress/unittests/authopt/testdata/no_permit.cert b/regress/unittests/authopt/testdata/no_permit.cert
new file mode 100644
index 0000000..351e138
--- /dev/null
+++ b/regress/unittests/authopt/testdata/no_permit.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIGVQtVgp9sD4sc8esIhVWbZaM8d0NxpX3UbEVzTHm9feAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAoVYLMLNBOH1SSgemFuDBprzpDXop6ufRSOo6vtD4mTwAAAFMAAAALc3NoLWVkMjU1MTkAAABAIKlI0TqqraKjYTjIuKhwoxAV/XnzWRJHq8lNs4aj5yDb84un2xXDF/0vXoLjPgVcLgEbksBKKn0i4whp+xn9Ag== user key
diff --git a/regress/unittests/authopt/testdata/no_portfwd.cert b/regress/unittests/authopt/testdata/no_portfwd.cert
new file mode 100644
index 0000000..9457dc3
--- /dev/null
+++ b/regress/unittests/authopt/testdata/no_portfwd.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIE6gC/QjjuzGWVDkr8ZyaHhja80V+lKLC/MvmEFa+CEBAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAGQAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgKFWCzCzQTh9UkoHphbgwaa86Q16Kern0UjqOr7Q+Jk8AAABTAAAAC3NzaC1lZDI1NTE5AAAAQEzpgckYlfc1BK1ir0reDSXo9OIDx4UoDMrNXrFO6I44NXoJJ4TlUUJH07WcKp/Xp5ESCdyVZtqwgHQxZr0+PwI= user key
diff --git a/regress/unittests/authopt/testdata/no_pty.cert b/regress/unittests/authopt/testdata/no_pty.cert
new file mode 100644
index 0000000..e8154ec
--- /dev/null
+++ b/regress/unittests/authopt/testdata/no_pty.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIFFjhISpSDR3blDejuCf2T9Fe4aHW53jG7KOH2PV/E7jAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAHAAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgKFWCzCzQTh9UkoHphbgwaa86Q16Kern0UjqOr7Q+Jk8AAABTAAAAC3NzaC1lZDI1NTE5AAAAQF5c4BdxVYgqbMGAep414IGFK4deCFBCeNUTOLpKodrfb1M0gS4d2qoeMxZvMv5yMf/viKl/gallHzEmcrEcIQY= user key
diff --git a/regress/unittests/authopt/testdata/no_user_rc.cert b/regress/unittests/authopt/testdata/no_user_rc.cert
new file mode 100644
index 0000000..6676a0c
--- /dev/null
+++ b/regress/unittests/authopt/testdata/no_user_rc.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIFUM0VLATkYh05QeS5uuhB1X50NMom3jTWeQUmrPQ1FwAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAGwAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAoVYLMLNBOH1SSgemFuDBprzpDXop6ufRSOo6vtD4mTwAAAFMAAAALc3NoLWVkMjU1MTkAAABAcmJ3c2FCKJL9BCLv1Ij+uN1N+NWZmMXYionsSkv42Go4pMZiH3g8UfTd+OKq9Q7GAcCzGXa///6Dr/wqFssoDA== user key
diff --git a/regress/unittests/authopt/testdata/no_x11fwd.cert b/regress/unittests/authopt/testdata/no_x11fwd.cert
new file mode 100644
index 0000000..0aff9e6
--- /dev/null
+++ b/regress/unittests/authopt/testdata/no_x11fwd.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIPRKPAP+b5S+4zihdgoJrYNcMovFBgKZaJupIhN1kUvkAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAGUAAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAFnBlcm1pdC1wb3J0LWZvcndhcmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnBlcm1pdC11c2VyLXJjAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIChVgsws0E4fVJKB6YW4MGmvOkNeinq59FI6jq+0PiZPAAAAUwAAAAtzc2gtZWQyNTUxOQAAAECMzj6VDfT+BJmIEo1qUKdr8VDLExF92K7KkbNxTH77n7uip7TL24HDfXjYBCvqxSSn9KAGBhnWsIC/GPx6A+cP user key
diff --git a/regress/unittests/authopt/testdata/only_agentfwd.cert b/regress/unittests/authopt/testdata/only_agentfwd.cert
new file mode 100644
index 0000000..3cf64b0
--- /dev/null
+++ b/regress/unittests/authopt/testdata/only_agentfwd.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIOvJ28yW5uvA7yxE3ySuyFvPjcRYKAr03CYr4okGTNIFAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAB8AAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgKFWCzCzQTh9UkoHphbgwaa86Q16Kern0UjqOr7Q+Jk8AAABTAAAAC3NzaC1lZDI1NTE5AAAAQEG2uTgmOSk9dJ0s/Ol1EIERXFP9PF6AauF9t5jBMSthNyvSANSrC/1EIaf4TV5kMYfhZxJXoS0XHQjGndcq2AE= user key
diff --git a/regress/unittests/authopt/testdata/only_portfwd.cert b/regress/unittests/authopt/testdata/only_portfwd.cert
new file mode 100644
index 0000000..bb09c3a
--- /dev/null
+++ b/regress/unittests/authopt/testdata/only_portfwd.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIGPoYoExiSyHMyDEvOFgoNZXk5z91u7xq/7357X23TotAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAB4AAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAoVYLMLNBOH1SSgemFuDBprzpDXop6ufRSOo6vtD4mTwAAAFMAAAALc3NoLWVkMjU1MTkAAABAHN3YnwipcbDKVn+PObGSoaT9rwlau+yrPYZ50oetvCKng3RMjGaV+roqlv0vjjLcxE9J4Y0ti+9MXtQ0D7beBA== user key
diff --git a/regress/unittests/authopt/testdata/only_pty.cert b/regress/unittests/authopt/testdata/only_pty.cert
new file mode 100644
index 0000000..520c89f
--- /dev/null
+++ b/regress/unittests/authopt/testdata/only_pty.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAILvocWYto5Lg7P46YLbe7U4/b2h9Lr5rWqMZ4Cj4ra7RAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAABIAAAAKcGVybWl0LXB0eQAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAoVYLMLNBOH1SSgemFuDBprzpDXop6ufRSOo6vtD4mTwAAAFMAAAALc3NoLWVkMjU1MTkAAABASv2xQvp+Y6E8dCf5pzg3MZaan5bl1ToYXNcmQ3ysGrk9Djkcu8m3TytDpF471KmUejxy/iF4xjs9CDpk7h+SBQ== user key
diff --git a/regress/unittests/authopt/testdata/only_user_rc.cert b/regress/unittests/authopt/testdata/only_user_rc.cert
new file mode 100644
index 0000000..fb49c35
--- /dev/null
+++ b/regress/unittests/authopt/testdata/only_user_rc.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIJwsRZQ7kx4A8AQ0q/G/3i6sHM48kr4TxJtTcyy3lZAPAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAABYAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgKFWCzCzQTh9UkoHphbgwaa86Q16Kern0UjqOr7Q+Jk8AAABTAAAAC3NzaC1lZDI1NTE5AAAAQDhgEXsvoHr21XrxmiZq/sIjWeYapp11XvEVkkTBPVhBnPwtrrUeJbPmGs3gmJkQdv8BYajYpT7TXEX8GvEeLwU= user key
diff --git a/regress/unittests/authopt/testdata/only_x11fwd.cert b/regress/unittests/authopt/testdata/only_x11fwd.cert
new file mode 100644
index 0000000..6715585
--- /dev/null
+++ b/regress/unittests/authopt/testdata/only_x11fwd.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIDAhZFZBl3eu8Qa8I5BaHCz/mpH8xCjaPusBwo1eJ9OGAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAAAAAAB0AAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIChVgsws0E4fVJKB6YW4MGmvOkNeinq59FI6jq+0PiZPAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEDysfgbhniX/zdA8576rrDJpaO2D7QtQse2KWIM9XmREPkLKeP6FKiXKKFcPQiMyV28rptfvK8bBXAiOvITSUgL user key
diff --git a/regress/unittests/authopt/testdata/sourceaddr.cert b/regress/unittests/authopt/testdata/sourceaddr.cert
new file mode 100644
index 0000000..0fcf7b1
--- /dev/null
+++ b/regress/unittests/authopt/testdata/sourceaddr.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIJ54qqoPs87gtjN1aJoLUn7ZTYUtcaGxkzLyJvRkYG7nAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAALgAAAA5zb3VyY2UtYWRkcmVzcwAAABgAAAAUMTI3LjAuMC4xLzMyLDo6MS8xMjgAAACCAAAAFXBlcm1pdC1YMTEtZm9yd2FyZGluZwAAAAAAAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAFnBlcm1pdC1wb3J0LWZvcndhcmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnBlcm1pdC11c2VyLXJjAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIChVgsws0E4fVJKB6YW4MGmvOkNeinq59FI6jq+0PiZPAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEAppSUKQ/a9tw/HgIazWceCO3d48GU7mkV4iQMpWWs2nB1dFryY1GDtZrBggAjMviwmBXyM3jIk5vxJDINZXGQJ user key
diff --git a/regress/unittests/authopt/testdata/unknown_critical.cert b/regress/unittests/authopt/testdata/unknown_critical.cert
new file mode 100644
index 0000000..216960a
--- /dev/null
+++ b/regress/unittests/authopt/testdata/unknown_critical.cert
@@ -0,0 +1 @@
+ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIIjs/wRAB/p5QShSfqoU9cWnCLT3lSveUirk61A27KxVAAAAICeF4LbtRqwIRhewXifa5PKpbSU9P/K8CzeVYj8J/iBoAAAAAAAAAAEAAAABAAAABHVzZXIAAAAIAAAABHVzZXIAAAAANouDYAAAAAA4a2VgAAAAEwAAAARibGFoAAAABwAAAANmb28AAACCAAAAFXBlcm1pdC1YMTEtZm9yd2FyZGluZwAAAAAAAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAFnBlcm1pdC1wb3J0LWZvcndhcmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnBlcm1pdC11c2VyLXJjAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIChVgsws0E4fVJKB6YW4MGmvOkNeinq59FI6jq+0PiZPAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEDix3FV7JIBuHNAwtZOVIqGBq8lqhnEwP51DqPA43qt+Tzynm56EWxuFzgGehBPF3L8gl+fVqxIJmiQ9iHB0LUD user key
diff --git a/regress/unittests/authopt/tests.c b/regress/unittests/authopt/tests.c
new file mode 100644
index 0000000..0e8aacb
--- /dev/null
+++ b/regress/unittests/authopt/tests.c
@@ -0,0 +1,573 @@
+/* 	$OpenBSD: tests.c,v 1.1 2018/03/03 03:16:17 djm Exp $ */
+
+/*
+ * Regress test for keys options functions.
+ *
+ * Placed in the public domain
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "test_helper.h"
+
+#include "sshkey.h"
+#include "authfile.h"
+#include "auth-options.h"
+#include "misc.h"
+#include "log.h"
+
+static struct sshkey *
+load_key(const char *name)
+{
+	struct sshkey *ret;
+	int r;
+
+	r = sshkey_load_public(test_data_file(name), &ret, NULL);
+	ASSERT_INT_EQ(r, 0);
+	ASSERT_PTR_NE(ret, NULL);
+	return ret;
+}
+
+static struct sshauthopt *
+default_authkey_opts(void)
+{
+	struct sshauthopt *ret = sshauthopt_new();
+
+	ASSERT_PTR_NE(ret, NULL);
+	ret->permit_port_forwarding_flag = 1;
+	ret->permit_agent_forwarding_flag = 1;
+	ret->permit_x11_forwarding_flag = 1;
+	ret->permit_pty_flag = 1;
+	ret->permit_user_rc = 1;
+	return ret;
+}
+
+static struct sshauthopt *
+default_authkey_restrict_opts(void)
+{
+	struct sshauthopt *ret = sshauthopt_new();
+
+	ASSERT_PTR_NE(ret, NULL);
+	ret->permit_port_forwarding_flag = 0;
+	ret->permit_agent_forwarding_flag = 0;
+	ret->permit_x11_forwarding_flag = 0;
+	ret->permit_pty_flag = 0;
+	ret->permit_user_rc = 0;
+	ret->restricted = 1;
+	return ret;
+}
+
+static char **
+commasplit(const char *s, size_t *np)
+{
+	char *ocp, *cp, *cp2, **ret = NULL;
+	size_t n;
+
+	ocp = cp = strdup(s);
+	ASSERT_PTR_NE(cp, NULL);
+	for (n = 0; (cp2 = strsep(&cp, ",")) != NULL;) {
+		ret = recallocarray(ret, n, n + 1, sizeof(*ret));
+		ASSERT_PTR_NE(ret, NULL);
+		cp2 = strdup(cp2);
+		ASSERT_PTR_NE(cp2, NULL);
+		ret[n++] = cp2;
+	}
+	free(ocp);
+	*np = n;
+	return ret;
+}
+
+static void
+compare_opts(const struct sshauthopt *opts,
+    const struct sshauthopt *expected)
+{
+	size_t i;
+
+	ASSERT_PTR_NE(opts, NULL);
+	ASSERT_PTR_NE(expected, NULL);
+	ASSERT_PTR_NE(expected, opts); /* bozo :) */
+
+#define FLAG_EQ(x) ASSERT_INT_EQ(opts->x, expected->x)
+	FLAG_EQ(permit_port_forwarding_flag);
+	FLAG_EQ(permit_agent_forwarding_flag);
+	FLAG_EQ(permit_x11_forwarding_flag);
+	FLAG_EQ(permit_pty_flag);
+	FLAG_EQ(permit_user_rc);
+	FLAG_EQ(restricted);
+	FLAG_EQ(cert_authority);
+#undef FLAG_EQ
+
+#define STR_EQ(x) \
+	do { \
+		if (expected->x == NULL) \
+			ASSERT_PTR_EQ(opts->x, expected->x); \
+		else \
+			ASSERT_STRING_EQ(opts->x, expected->x); \
+	} while (0)
+	STR_EQ(cert_principals);
+	STR_EQ(force_command);
+	STR_EQ(required_from_host_cert);
+	STR_EQ(required_from_host_keys);
+#undef STR_EQ
+
+#define ARRAY_EQ(nx, x) \
+	do { \
+		ASSERT_SIZE_T_EQ(opts->nx, expected->nx); \
+		if (expected->nx == 0) \
+			break; \
+		for (i = 0; i < expected->nx; i++) \
+			ASSERT_STRING_EQ(opts->x[i], expected->x[i]); \
+	} while (0)
+	ARRAY_EQ(nenv, env);
+	ARRAY_EQ(npermitopen, permitopen);
+#undef ARRAY_EQ
+}
+
+static void
+test_authkeys_parse(void)
+{
+	struct sshauthopt *opts, *expected;
+	const char *errstr;
+
+#define FAIL_TEST(label, keywords) \
+	do { \
+		TEST_START("sshauthopt_parse invalid " label); \
+		opts = sshauthopt_parse(keywords, &errstr); \
+		ASSERT_PTR_EQ(opts, NULL); \
+		ASSERT_PTR_NE(errstr, NULL); \
+		TEST_DONE(); \
+	} while (0) 
+#define CHECK_SUCCESS_AND_CLEANUP() \
+	do { \
+		if (errstr != NULL) \
+			ASSERT_STRING_EQ(errstr, ""); \
+		compare_opts(opts, expected); \
+		sshauthopt_free(expected); \
+		sshauthopt_free(opts); \
+	} while (0)
+
+	/* Basic tests */
+	TEST_START("sshauthopt_parse empty");
+	expected = default_authkey_opts();
+	opts = sshauthopt_parse("", &errstr);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	TEST_START("sshauthopt_parse trailing whitespace");
+	expected = default_authkey_opts();
+	opts = sshauthopt_parse(" ", &errstr);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	TEST_START("sshauthopt_parse restrict");
+	expected = default_authkey_restrict_opts();
+	opts = sshauthopt_parse("restrict", &errstr);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	/* Invalid syntax */
+	FAIL_TEST("trailing comma", "restrict,");
+	FAIL_TEST("bare comma", ",");
+	FAIL_TEST("unknown option", "BLAH");
+	FAIL_TEST("unknown option with trailing comma", "BLAH,");
+	FAIL_TEST("unknown option with trailing whitespace", "BLAH ");
+
+	/* force_tun_device */
+	TEST_START("sshauthopt_parse tunnel explicit");
+	expected = default_authkey_opts();
+	expected->force_tun_device = 1;
+	opts = sshauthopt_parse("tunnel=\"1\"", &errstr);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	TEST_START("sshauthopt_parse tunnel any");
+	expected = default_authkey_opts();
+	expected->force_tun_device = SSH_TUNID_ANY;
+	opts = sshauthopt_parse("tunnel=\"any\"", &errstr);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	FAIL_TEST("tunnel", "tunnel=\"blah\"");
+
+	/* Flag options */
+#define FLAG_TEST(keyword, var, val) \
+	do { \
+		TEST_START("sshauthopt_parse " keyword); \
+		expected = default_authkey_opts(); \
+		expected->var = val; \
+		opts = sshauthopt_parse(keyword, &errstr); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		expected = default_authkey_restrict_opts(); \
+		expected->var = val; \
+		opts = sshauthopt_parse("restrict,"keyword, &errstr); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		TEST_DONE(); \
+	} while (0)
+	/* Positive flags */
+	FLAG_TEST("cert-authority", cert_authority, 1);
+	FLAG_TEST("port-forwarding", permit_port_forwarding_flag, 1);
+	FLAG_TEST("agent-forwarding", permit_agent_forwarding_flag, 1);
+	FLAG_TEST("x11-forwarding", permit_x11_forwarding_flag, 1);
+	FLAG_TEST("pty", permit_pty_flag, 1);
+	FLAG_TEST("user-rc", permit_user_rc, 1);
+	/* Negative flags */
+	FLAG_TEST("no-port-forwarding", permit_port_forwarding_flag, 0);
+	FLAG_TEST("no-agent-forwarding", permit_agent_forwarding_flag, 0);
+	FLAG_TEST("no-x11-forwarding", permit_x11_forwarding_flag, 0);
+	FLAG_TEST("no-pty", permit_pty_flag, 0);
+	FLAG_TEST("no-user-rc", permit_user_rc, 0);
+#undef FLAG_TEST
+	FAIL_TEST("no-cert-authority", "no-cert-authority");
+
+	/* String options */
+#define STRING_TEST(keyword, var, val) \
+	do { \
+		TEST_START("sshauthopt_parse " keyword); \
+		expected = default_authkey_opts(); \
+		expected->var = strdup(val); \
+		ASSERT_PTR_NE(expected->var, NULL); \
+		opts = sshauthopt_parse(keyword "=" #val, &errstr); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		expected = default_authkey_restrict_opts(); \
+		expected->var = strdup(val); \
+		ASSERT_PTR_NE(expected->var, NULL); \
+		opts = sshauthopt_parse( \
+		    "restrict," keyword "=" #val ",restrict", &errstr); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		TEST_DONE(); \
+	} while (0)
+	STRING_TEST("command", force_command, "/bin/true");
+	STRING_TEST("principals", cert_principals, "gregor,josef,K");
+	STRING_TEST("from", required_from_host_keys, "127.0.0.0/8");
+#undef STRING_TEST
+	FAIL_TEST("unquoted command", "command=oops");
+	FAIL_TEST("unquoted principals", "principals=estragon");
+	FAIL_TEST("unquoted from", "from=127.0.0.1");
+
+	/* String array option tests */
+#define ARRAY_TEST(label, keywords, var, nvar, val) \
+	do { \
+		TEST_START("sshauthopt_parse " label); \
+		expected = default_authkey_opts(); \
+		expected->var = commasplit(val, &expected->nvar); \
+		ASSERT_PTR_NE(expected->var, NULL); \
+		opts = sshauthopt_parse(keywords, &errstr); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		expected = default_authkey_restrict_opts(); \
+		expected->var = commasplit(val, &expected->nvar); \
+		ASSERT_PTR_NE(expected->var, NULL); \
+		opts = sshauthopt_parse( \
+		    "restrict," keywords ",restrict", &errstr); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		TEST_DONE(); \
+	} while (0)
+	ARRAY_TEST("environment", "environment=\"foo=1\",environment=\"bar=2\"",
+	    env, nenv, "foo=1,bar=2");
+	ARRAY_TEST("permitopen", "permitopen=\"foo:123\",permitopen=\"bar:*\"",
+	    permitopen, npermitopen, "foo:123,bar:*");
+#undef ARRAY_TEST
+	FAIL_TEST("environment", "environment=\",=bah\"");
+	FAIL_TEST("permitopen port", "foo:bar");
+	FAIL_TEST("permitopen missing port", "foo:");
+	FAIL_TEST("permitopen missing port specification", "foo");
+	FAIL_TEST("permitopen invalid host", "[:");
+
+#undef CHECK_SUCCESS_AND_CLEANUP
+#undef FAIL_TEST
+}
+
+static void
+test_cert_parse(void)
+{
+	struct sshkey *cert;
+	struct sshauthopt *opts, *expected;
+
+#define CHECK_SUCCESS_AND_CLEANUP() \
+	do { \
+		compare_opts(opts, expected); \
+		sshauthopt_free(expected); \
+		sshauthopt_free(opts); \
+		sshkey_free(cert); \
+	} while (0)
+#define FLAG_TEST(keybase, var) \
+	do { \
+		TEST_START("sshauthopt_from_cert no_" keybase); \
+		cert = load_key("no_" keybase ".cert"); \
+		expected = default_authkey_opts(); \
+		expected->var = 0; \
+		opts = sshauthopt_from_cert(cert); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		TEST_DONE(); \
+		TEST_START("sshauthopt_from_cert only_" keybase); \
+		cert = load_key("only_" keybase ".cert"); \
+		expected = sshauthopt_new(); \
+		ASSERT_PTR_NE(expected, NULL); \
+		expected->var = 1; \
+		opts = sshauthopt_from_cert(cert); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		TEST_DONE(); \
+	} while (0)
+	FLAG_TEST("agentfwd", permit_agent_forwarding_flag);
+	FLAG_TEST("portfwd", permit_port_forwarding_flag);
+	FLAG_TEST("pty", permit_pty_flag);
+	FLAG_TEST("user_rc", permit_user_rc);
+	FLAG_TEST("x11fwd", permit_x11_forwarding_flag);
+#undef FLAG_TEST
+
+	TEST_START("sshauthopt_from_cert all permitted");
+	cert = load_key("all_permit.cert");
+	expected = default_authkey_opts();
+	opts = sshauthopt_from_cert(cert);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	TEST_START("sshauthopt_from_cert nothing permitted");
+	cert = load_key("no_permit.cert");
+	expected = sshauthopt_new();
+	ASSERT_PTR_NE(expected, NULL);
+	opts = sshauthopt_from_cert(cert);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	TEST_START("sshauthopt_from_cert force-command");
+	cert = load_key("force_command.cert");
+	expected = default_authkey_opts();
+	expected->force_command = strdup("foo");
+	ASSERT_PTR_NE(expected->force_command, NULL);
+	opts = sshauthopt_from_cert(cert);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	TEST_START("sshauthopt_from_cert source-address");
+	cert = load_key("sourceaddr.cert");
+	expected = default_authkey_opts();
+	expected->required_from_host_cert = strdup("127.0.0.1/32,::1/128");
+	ASSERT_PTR_NE(expected->required_from_host_cert, NULL);
+	opts = sshauthopt_from_cert(cert);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+#undef CHECK_SUCCESS_AND_CLEANUP
+
+#define FAIL_TEST(keybase) \
+	do { \
+		TEST_START("sshauthopt_from_cert " keybase); \
+		cert = load_key(keybase ".cert"); \
+		opts = sshauthopt_from_cert(cert); \
+		ASSERT_PTR_EQ(opts, NULL); \
+		sshkey_free(cert); \
+		TEST_DONE(); \
+	} while (0)
+	FAIL_TEST("host");
+	FAIL_TEST("bad_sourceaddr");
+	FAIL_TEST("unknown_critical");
+#undef FAIL_TEST
+}
+
+static void
+test_merge(void)
+{
+	struct sshkey *cert;
+	struct sshauthopt *key_opts, *cert_opts, *merge_opts, *expected;
+	const char *errstr;
+
+	/*
+	 * Prepare for a test by making some key and cert options and
+	 * attempting to merge them.
+	 */
+#define PREPARE(label, keyname, keywords) \
+	do { \
+		expected = NULL; \
+		TEST_START("sshauthopt_merge " label); \
+		cert = load_key(keyname ".cert"); \
+		cert_opts = sshauthopt_from_cert(cert); \
+		ASSERT_PTR_NE(cert_opts, NULL); \
+		key_opts = sshauthopt_parse(keywords, &errstr); \
+		if (errstr != NULL) \
+			ASSERT_STRING_EQ(errstr, ""); \
+		ASSERT_PTR_NE(key_opts, NULL); \
+		merge_opts = sshauthopt_merge(key_opts, \
+		    cert_opts, &errstr); \
+	} while (0)
+
+	/* Cleanup stuff allocated by PREPARE() */
+#define CLEANUP() \
+	do { \
+		sshauthopt_free(expected); \
+		sshauthopt_free(merge_opts); \
+		sshauthopt_free(key_opts); \
+		sshauthopt_free(cert_opts); \
+		sshkey_free(cert); \
+	} while (0)
+
+	/* Check the results of PREPARE() against expectation; calls CLEANUP */
+#define CHECK_SUCCESS_AND_CLEANUP() \
+	do { \
+		if (errstr != NULL) \
+			ASSERT_STRING_EQ(errstr, ""); \
+		compare_opts(merge_opts, expected); \
+		CLEANUP(); \
+	} while (0)
+
+	/* Check a single case of merging of flag options */
+#define FLAG_CASE(keybase, label, keyname, keywords, mostly_off, var, val) \
+	do { \
+		PREPARE(keybase " " label, keyname, keywords); \
+		expected = mostly_off ? \
+		    sshauthopt_new() : default_authkey_opts(); \
+		expected->var = val; \
+		ASSERT_PTR_NE(expected, NULL); \
+		CHECK_SUCCESS_AND_CLEANUP(); \
+		TEST_DONE(); \
+	} while (0)
+
+	/*
+	 * Fairly exhaustive exercise of a flag option. Tests
+	 * option both set and clear in certificate, set and clear in
+	 * authorized_keys and set and cleared via restrict keyword.
+	 */
+#define FLAG_TEST(keybase, keyword, var) \
+	do { \
+		FLAG_CASE(keybase, "keys:default,yes cert:default,no", \
+		    "no_" keybase, keyword, 0, var, 0); \
+		FLAG_CASE(keybase,"keys:-*,yes cert:default,no", \
+		    "no_" keybase, "restrict," keyword, 1, var, 0); \
+		FLAG_CASE(keybase, "keys:default,no cert:default,no", \
+		    "no_" keybase, "no-" keyword, 0, var, 0); \
+		FLAG_CASE(keybase, "keys:-*,no cert:default,no", \
+		    "no_" keybase, "restrict,no-" keyword, 1, var, 0); \
+		\
+		FLAG_CASE(keybase, "keys:default,yes cert:-*,yes", \
+		    "only_" keybase, keyword, 1, var, 1); \
+		FLAG_CASE(keybase,"keys:-*,yes cert:-*,yes", \
+		    "only_" keybase, "restrict," keyword, 1, var, 1); \
+		FLAG_CASE(keybase, "keys:default,no cert:-*,yes", \
+		    "only_" keybase, "no-" keyword, 1, var, 0); \
+		FLAG_CASE(keybase, "keys:-*,no cert:-*,yes", \
+		    "only_" keybase, "restrict,no-" keyword, 1, var, 0); \
+		\
+		FLAG_CASE(keybase, "keys:default,yes cert:-*", \
+		    "no_permit", keyword, 1, var, 0); \
+		FLAG_CASE(keybase,"keys:-*,yes cert:-*", \
+		    "no_permit", "restrict," keyword, 1, var, 0); \
+		FLAG_CASE(keybase, "keys:default,no cert:-*", \
+		    "no_permit", "no-" keyword, 1, var, 0); \
+		FLAG_CASE(keybase, "keys:-*,no cert:-*", \
+		    "no_permit", "restrict,no-" keyword, 1, var, 0); \
+		\
+		FLAG_CASE(keybase, "keys:default,yes cert:*", \
+		    "all_permit", keyword, 0, var, 1); \
+		FLAG_CASE(keybase,"keys:-*,yes cert:*", \
+		    "all_permit", "restrict," keyword, 1, var, 1); \
+		FLAG_CASE(keybase, "keys:default,no cert:*", \
+		    "all_permit", "no-" keyword, 0, var, 0); \
+		FLAG_CASE(keybase, "keys:-*,no cert:*", \
+		    "all_permit", "restrict,no-" keyword, 1, var, 0); \
+		\
+	} while (0)
+	FLAG_TEST("portfwd", "port-forwarding", permit_port_forwarding_flag);
+	FLAG_TEST("agentfwd", "agent-forwarding", permit_agent_forwarding_flag);
+	FLAG_TEST("pty", "pty", permit_pty_flag);
+	FLAG_TEST("user_rc", "user-rc", permit_user_rc);
+	FLAG_TEST("x11fwd", "x11-forwarding", permit_x11_forwarding_flag);
+#undef FLAG_TEST
+
+	PREPARE("source-address both", "sourceaddr", "from=\"127.0.0.1\"");
+	expected = default_authkey_opts();
+	expected->required_from_host_cert = strdup("127.0.0.1/32,::1/128");
+	ASSERT_PTR_NE(expected->required_from_host_cert, NULL);
+	expected->required_from_host_keys = strdup("127.0.0.1");
+	ASSERT_PTR_NE(expected->required_from_host_keys, NULL);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("source-address none", "all_permit", "");
+	expected = default_authkey_opts();
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("source-address keys", "all_permit", "from=\"127.0.0.1\"");
+	expected = default_authkey_opts();
+	expected->required_from_host_keys = strdup("127.0.0.1");
+	ASSERT_PTR_NE(expected->required_from_host_keys, NULL);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("source-address cert", "sourceaddr", "");
+	expected = default_authkey_opts();
+	expected->required_from_host_cert = strdup("127.0.0.1/32,::1/128");
+	ASSERT_PTR_NE(expected->required_from_host_cert, NULL);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("force-command both", "force_command", "command=\"foo\"");
+	expected = default_authkey_opts();
+	expected->force_command = strdup("foo");
+	ASSERT_PTR_NE(expected->force_command, NULL);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("force-command none", "all_permit", "");
+	expected = default_authkey_opts();
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("force-command keys", "all_permit", "command=\"bar\"");
+	expected = default_authkey_opts();
+	expected->force_command = strdup("bar");
+	ASSERT_PTR_NE(expected->force_command, NULL);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("force-command cert", "force_command", "");
+	expected = default_authkey_opts();
+	expected->force_command = strdup("foo");
+	ASSERT_PTR_NE(expected->force_command, NULL);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("force-command mismatch", "force_command", "command=\"bar\"");
+	ASSERT_PTR_EQ(merge_opts, NULL);
+	CLEANUP();
+	TEST_DONE();
+
+	PREPARE("tunnel", "all_permit", "tunnel=\"6\"");
+	expected = default_authkey_opts();
+	expected->force_tun_device = 6;
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("permitopen", "all_permit",
+	    "permitopen=\"127.0.0.1:*\",permitopen=\"127.0.0.1:123\"");
+	expected = default_authkey_opts();
+	expected->permitopen = commasplit("127.0.0.1:*,127.0.0.1:123",
+	    &expected->npermitopen);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+
+	PREPARE("environment", "all_permit",
+	    "environment=\"foo=a\",environment=\"bar=b\"");
+	expected = default_authkey_opts();
+	expected->env = commasplit("foo=a,bar=b", &expected->nenv);
+	CHECK_SUCCESS_AND_CLEANUP();
+	TEST_DONE();
+}
+
+void
+tests(void)
+{
+	extern char *__progname;
+	LogLevel ll = test_is_verbose() ?
+	    SYSLOG_LEVEL_DEBUG3 : SYSLOG_LEVEL_QUIET;
+
+	/* test_cert_parse() are a bit spammy to error() by default... */
+	log_init(__progname, ll, SYSLOG_FACILITY_USER, 1);
+
+	test_authkeys_parse();
+	test_cert_parse();
+	test_merge();
+}
diff --git a/regress/unittests/bitmap/Makefile b/regress/unittests/bitmap/Makefile
index bd21949..fe30acc 100644
--- a/regress/unittests/bitmap/Makefile
+++ b/regress/unittests/bitmap/Makefile
@@ -1,7 +1,11 @@
-#	$OpenBSD: Makefile,v 1.3 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile,v 1.4 2017/12/21 00:41:22 djm Exp $
 
 PROG=test_bitmap
 SRCS=tests.c
+
+# From usr.sbin/ssh
+SRCS+=bitmap.c atomicio.c
+
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
diff --git a/regress/unittests/conversion/Makefile b/regress/unittests/conversion/Makefile
new file mode 100644
index 0000000..8b2a09c
--- /dev/null
+++ b/regress/unittests/conversion/Makefile
@@ -0,0 +1,15 @@
+#	$OpenBSD: Makefile,v 1.2 2017/12/21 00:41:22 djm Exp $
+
+PROG=test_conversion
+SRCS=tests.c
+
+# From usr.bin/ssh
+SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
+SRCS+=atomicio.c misc.c xmalloc.c log.c uidswap.c cleanup.c fatal.c ssherr.c
+
+REGRESS_TARGETS=run-regress-${PROG}
+
+run-regress-${PROG}: ${PROG}
+	env ${TEST_ENV} ./${PROG}
+
+.include <bsd.regress.mk>
diff --git a/regress/unittests/conversion/tests.c b/regress/unittests/conversion/tests.c
new file mode 100644
index 0000000..6dd77ef
--- /dev/null
+++ b/regress/unittests/conversion/tests.c
@@ -0,0 +1,51 @@
+/* 	$OpenBSD: tests.c,v 1.1 2017/03/14 01:20:29 dtucker Exp $ */
+/*
+ * Regress test for conversions
+ *
+ * Placed in the public domain
+ */
+
+#include "includes.h"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <stdio.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+
+#include "../test_helper/test_helper.h"
+
+#include "misc.h"
+
+void
+tests(void)
+{
+	char buf[1024];
+
+	TEST_START("conversion_convtime");
+	ASSERT_LONG_EQ(convtime("0"), 0);
+	ASSERT_LONG_EQ(convtime("1"), 1);
+	ASSERT_LONG_EQ(convtime("1S"), 1);
+	/* from the examples in the comment above the function */
+	ASSERT_LONG_EQ(convtime("90m"), 5400);
+	ASSERT_LONG_EQ(convtime("1h30m"), 5400);
+	ASSERT_LONG_EQ(convtime("2d"), 172800);
+	ASSERT_LONG_EQ(convtime("1w"), 604800);
+
+	/* negative time is not allowed */
+	ASSERT_LONG_EQ(convtime("-7"), -1);
+	ASSERT_LONG_EQ(convtime("-9d"), -1);
+	
+	/* overflow */
+	snprintf(buf, sizeof buf, "%llu", (unsigned long long)LONG_MAX + 1);
+	ASSERT_LONG_EQ(convtime(buf), -1);
+
+	/* overflow with multiplier */
+	snprintf(buf, sizeof buf, "%lluM", (unsigned long long)LONG_MAX/60 + 1);
+	ASSERT_LONG_EQ(convtime(buf), -1);
+	ASSERT_LONG_EQ(convtime("1000000000000000000000w"), -1);
+	TEST_DONE();
+}
diff --git a/regress/unittests/hostkeys/Makefile b/regress/unittests/hostkeys/Makefile
index ae3c342..3368851 100644
--- a/regress/unittests/hostkeys/Makefile
+++ b/regress/unittests/hostkeys/Makefile
@@ -1,7 +1,20 @@
-#	$OpenBSD: Makefile,v 1.3 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile,v 1.4 2017/12/21 00:41:22 djm Exp $
 
 PROG=test_hostkeys
 SRCS=tests.c test_iterate.c
+
+# From usr.bin/ssh
+SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
+SRCS+=atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c ssh-dss.c
+SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
+SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
+SRCS+=addrmatch.c bitmap.c hostfile.c
+SRCS+=ed25519.c hash.c ge25519.c fe25519.c sc25519.c verify.c
+SRCS+=cipher-chachapoly.c chacha.c poly1305.c
+
+SRCS+=digest-openssl.c
+#SRCS+=digest-libc.c
+
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
diff --git a/regress/unittests/hostkeys/mktestdata.sh b/regress/unittests/hostkeys/mktestdata.sh
index 36890ba..5a46de9 100644
--- a/regress/unittests/hostkeys/mktestdata.sh
+++ b/regress/unittests/hostkeys/mktestdata.sh
@@ -1,11 +1,11 @@
 #!/bin/sh
-# $OpenBSD: mktestdata.sh,v 1.1 2015/02/16 22:18:34 djm Exp $
+# $OpenBSD: mktestdata.sh,v 1.2 2017/04/30 23:33:48 djm Exp $
 
 set -ex
 
 cd testdata
 
-rm -f rsa1* rsa* dsa* ecdsa* ed25519*
+rm -f rsa* dsa* ecdsa* ed25519*
 rm -f known_hosts*
 
 gen_all() {
@@ -13,13 +13,12 @@
 	_ecdsa_bits=256
 	test "x$_n" = "x1" && _ecdsa_bits=384
 	test "x$_n" = "x2" && _ecdsa_bits=521
-	ssh-keygen -qt rsa1 -b 1024 -C "RSA1 #$_n" -N "" -f rsa1_$_n
 	ssh-keygen -qt rsa -b 1024 -C "RSA #$_n" -N "" -f rsa_$_n
 	ssh-keygen -qt dsa -b 1024 -C "DSA #$_n" -N "" -f dsa_$_n
 	ssh-keygen -qt ecdsa -b $_ecdsa_bits -C "ECDSA #$_n" -N "" -f ecdsa_$_n
 	ssh-keygen -qt ed25519 -C "ED25519 #$_n" -N "" -f ed25519_$_n
 	# Don't need private keys
-	rm -f rsa1_$_n  rsa_$_n dsa_$_n ecdsa_$_n ed25519_$_n
+	rm -f rsa_$_n dsa_$_n ecdsa_$_n ed25519_$_n
 }
 
 hentries() {
@@ -64,7 +63,6 @@
 	echo
 
 	echo "# Revoked and CA keys"
-	printf "@revoked sisyphus.example.com " ; cat rsa1_4.pub
 	printf "@revoked sisyphus.example.com " ; cat ed25519_4.pub
 	printf "@cert-authority prometheus.example.com " ; cat ecdsa_4.pub
 	printf "@cert-authority *.example.com " ; cat dsa_4.pub
@@ -72,19 +70,13 @@
 	printf "\n"
 	echo "# Some invalid lines"
 	# Invalid marker
-	printf "@what sisyphus.example.com " ; cat rsa1_1.pub
+	printf "@what sisyphus.example.com " ; cat dsa_1.pub
 	# Key missing
 	echo "sisyphus.example.com      "
 	# Key blob missing
 	echo "prometheus.example.com ssh-ed25519 "
 	# Key blob truncated
 	echo "sisyphus.example.com ssh-dsa AAAATgAAAAdz"
-	# RSA1 key truncated after key bits
-	echo "prometheus.example.com 1024   "
-	# RSA1 key truncated after exponent
-	echo "sisyphus.example.com 1024 65535   "
-	# RSA1 key incorrect key bits
-	printf "prometheus.example.com 1025 " ; cut -d' ' -f2- < rsa1_1.pub
 	# Invalid type
 	echo "sisyphus.example.com ssh-XXX AAAATgAAAAdzc2gtWFhYAAAAP0ZVQ0tPRkZGVUNLT0ZGRlVDS09GRkZVQ0tPRkZGVUNLT0ZGRlVDS09GRkZVQ0tPRkZGVUNLT0ZGRlVDS09GRg=="
 	# Type mismatch with blob
diff --git a/regress/unittests/hostkeys/test_iterate.c b/regress/unittests/hostkeys/test_iterate.c
index 2eaaf06..d6963bd 100644
--- a/regress/unittests/hostkeys/test_iterate.c
+++ b/regress/unittests/hostkeys/test_iterate.c
@@ -1,4 +1,4 @@
-/* 	$OpenBSD: test_iterate.c,v 1.4 2015/03/31 22:59:01 djm Exp $ */
+/* 	$OpenBSD: test_iterate.c,v 1.6 2018/07/16 03:09:59 djm Exp $ */
 /*
  * Regress test for hostfile.h hostkeys_foreach()
  *
@@ -90,14 +90,6 @@
 	expected_keytype = (parse_key || expected->no_parse_keytype < 0) ?
 	    expected->l.keytype : expected->no_parse_keytype;
 
-#ifndef WITH_SSH1
-	if (parse_key && (expected->l.keytype == KEY_RSA1 ||
-	    expected->no_parse_keytype == KEY_RSA1)) {
-		expected_status = HKF_STATUS_INVALID;
-		expected_keytype = KEY_UNSPEC;
-		parse_key = 0;
-	}
-#endif
 #ifndef OPENSSL_HAS_ECC
 	if (expected->l.keytype == KEY_ECDSA ||
 	    expected->no_parse_keytype == KEY_ECDSA) {
@@ -150,10 +142,6 @@
 	for (i = 0; i < n; i++) {
 		if (expected[i].key_file == NULL)
 			continue;
-#ifndef WITH_SSH1
-		if (expected[i].l.keytype == KEY_RSA1)
-			continue;
-#endif
 #ifndef OPENSSL_HAS_ECC
 		if (expected[i].l.keytype == KEY_ECDSA)
 			continue;
@@ -164,6 +152,17 @@
 	}
 }
 
+static void
+cleanup_expected(struct expected *expected, size_t n)
+{
+	size_t i;
+
+	for (i = 0; i < n; i++) {
+		sshkey_free(expected[i].l.key);
+		expected[i].l.key = NULL;
+	}
+}
+
 struct expected expected_full[] = {
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,				/* path, don't care */
@@ -217,22 +216,9 @@
 		NULL,	/* filled at runtime */
 		"ED25519 #1",
 	} },
-	{ "rsa1_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
-		NULL,
-		5,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_NONE,
-		"sisyphus.example.com",
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #1",
-	} },
 	{ "rsa_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
 		NULL,
-		6,
+		5,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -245,7 +231,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		7,
+		6,
 		HKF_STATUS_COMMENT,
 		0,
 		"",
@@ -258,7 +244,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		8,
+		7,
 		HKF_STATUS_COMMENT,
 		0,
 		"# Plain host keys, hostnames + addresses",
@@ -271,7 +257,7 @@
 	} },
 	{ "dsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		9,
+		8,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -284,7 +270,7 @@
 	} },
 	{ "ecdsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		10,
+		9,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -297,7 +283,7 @@
 	} },
 	{ "ed25519_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		11,
+		10,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -308,22 +294,9 @@
 		NULL,	/* filled at runtime */
 		"ED25519 #2",
 	} },
-	{ "rsa1_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
-		NULL,
-		12,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_NONE,
-		"prometheus.example.com,192.0.2.1,2001:db8::1",
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #2",
-	} },
 	{ "rsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		13,
+		11,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -336,7 +309,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		14,
+		12,
 		HKF_STATUS_COMMENT,
 		0,
 		"",
@@ -349,7 +322,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		15,
+		13,
 		HKF_STATUS_COMMENT,
 		0,
 		"# Some hosts with wildcard names / IPs",
@@ -362,7 +335,7 @@
 	} },
 	{ "dsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		16,
+		14,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -375,7 +348,7 @@
 	} },
 	{ "ecdsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		17,
+		15,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -388,7 +361,7 @@
 	} },
 	{ "ed25519_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		18,
+		16,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -399,22 +372,9 @@
 		NULL,	/* filled at runtime */
 		"ED25519 #3",
 	} },
-	{ "rsa1_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
-		NULL,
-		19,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_NONE,
-		"*.example.com,192.0.2.*,2001:*",
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #3",
-	} },
 	{ "rsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
 		NULL,
-		20,
+		17,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -427,7 +387,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		21,
+		18,
 		HKF_STATUS_COMMENT,
 		0,
 		"",
@@ -440,7 +400,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		22,
+		19,
 		HKF_STATUS_COMMENT,
 		0,
 		"# Hashed hostname and address entries",
@@ -453,7 +413,7 @@
 	} },
 	{ "dsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
 		NULL,
-		23,
+		20,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -466,7 +426,7 @@
 	} },
 	{ "ecdsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
 		NULL,
-		24,
+		21,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -479,7 +439,7 @@
 	} },
 	{ "ed25519_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
 		NULL,
-		25,
+		22,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -490,22 +450,9 @@
 		NULL,	/* filled at runtime */
 		"ED25519 #5",
 	} },
-	{ "rsa1_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
-		NULL,
-		26,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_NONE,
-		NULL,
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #5",
-	} },
 	{ "rsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
 		NULL,
-		27,
+		23,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -518,7 +465,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		28,
+		24,
 		HKF_STATUS_COMMENT,
 		0,
 		"",
@@ -536,7 +483,7 @@
 	 */
 	{ "dsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
 		NULL,
-		29,
+		25,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -549,7 +496,7 @@
 	} },
 	{ "dsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
 		NULL,
-		30,
+		26,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -562,7 +509,7 @@
 	} },
 	{ "dsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
 		NULL,
-		31,
+		27,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -575,7 +522,7 @@
 	} },
 	{ "ecdsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
 		NULL,
-		32,
+		28,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -588,7 +535,7 @@
 	} },
 	{ "ecdsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
 		NULL,
-		33,
+		29,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -601,7 +548,7 @@
 	} },
 	{ "ecdsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
 		NULL,
-		34,
+		30,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -614,7 +561,7 @@
 	} },
 	{ "ed25519_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
 		NULL,
-		35,
+		31,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -627,7 +574,7 @@
 	} },
 	{ "ed25519_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
 		NULL,
-		36,
+		32,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -640,7 +587,7 @@
 	} },
 	{ "ed25519_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
 		NULL,
-		37,
+		33,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -651,48 +598,9 @@
 		NULL,	/* filled at runtime */
 		"ED25519 #6",
 	} },
-	{ "rsa1_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
-		NULL,
-		38,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_NONE,
-		NULL,
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #6",
-	} },
-	{ "rsa1_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
-		NULL,
-		39,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_NONE,
-		NULL,
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #6",
-	} },
-	{ "rsa1_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
-		NULL,
-		40,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_NONE,
-		NULL,
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #6",
-	} },
 	{ "rsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
 		NULL,
-		41,
+		34,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -705,7 +613,7 @@
 	} },
 	{ "rsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
 		NULL,
-		42,
+		35,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -718,7 +626,7 @@
 	} },
 	{ "rsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
 		NULL,
-		43,
+		36,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -731,7 +639,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		44,
+		37,
 		HKF_STATUS_COMMENT,
 		0,
 		"",
@@ -744,7 +652,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		45,
+		38,
 		HKF_STATUS_COMMENT,
 		0,
 		"",
@@ -757,7 +665,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		46,
+		39,
 		HKF_STATUS_COMMENT,
 		0,
 		"# Revoked and CA keys",
@@ -768,22 +676,9 @@
 		NULL,
 		NULL,
 	} },
-	{ "rsa1_4.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
-		NULL,
-		47,
-		HKF_STATUS_OK,
-		0,
-		NULL,
-		MRK_REVOKE,
-		"sisyphus.example.com",
-		NULL,
-		KEY_RSA1,
-		NULL,	/* filled at runtime */
-		"RSA1 #4",
-	} },
 	{ "ed25519_4.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
 		NULL,
-		48,
+		40,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -796,7 +691,7 @@
 	} },
 	{ "ecdsa_4.pub" , -1, -1, HKF_MATCH_HOST, 0, 0, 0, -1, {
 		NULL,
-		49,
+		41,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -809,7 +704,7 @@
 	} },
 	{ "dsa_4.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, 0, 0, -1, {
 		NULL,
-		50,
+		42,
 		HKF_STATUS_OK,
 		0,
 		NULL,
@@ -822,7 +717,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		51,
+		43,
 		HKF_STATUS_COMMENT,
 		0,
 		"",
@@ -835,7 +730,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		52,
+		44,
 		HKF_STATUS_COMMENT,
 		0,
 		"# Some invalid lines",
@@ -848,7 +743,7 @@
 	} },
 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
 		NULL,
-		53,
+		45,
 		HKF_STATUS_INVALID,
 		0,
 		NULL,
@@ -861,7 +756,7 @@
 	} },
 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
 		NULL,
-		54,
+		46,
 		HKF_STATUS_INVALID,
 		0,
 		NULL,
@@ -874,7 +769,7 @@
 	} },
 	{ NULL, -1, -1, HKF_MATCH_HOST, 0, 0, 0, -1, {
 		NULL,
-		55,
+		47,
 		HKF_STATUS_INVALID,
 		0,
 		NULL,
@@ -887,7 +782,7 @@
 	} },
 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
 		NULL,
-		56,
+		48,
 		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
 		0,
 		NULL,
@@ -898,48 +793,9 @@
 		NULL,
 		NULL,
 	} },
-	{ NULL, -1, -1, HKF_MATCH_HOST, 0, 0, 0, -1, {
-		NULL,
-		57,
-		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
-		0,
-		NULL,
-		MRK_NONE,
-		"prometheus.example.com",
-		NULL,
-		KEY_UNSPEC,
-		NULL,
-		NULL,
-	} },
-	{ NULL, HKF_STATUS_OK, KEY_RSA1, 0, HKF_MATCH_HOST, 0, 0, -1, {
-		NULL,
-		58,
-		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
-		0,
-		NULL,
-		MRK_NONE,
-		"sisyphus.example.com",
-		NULL,
-		KEY_UNSPEC,
-		NULL,
-		NULL,
-	} },
-	{ NULL, HKF_STATUS_OK, KEY_RSA1, HKF_MATCH_HOST, 0, 0, 0, -1, {
-		NULL,
-		59,
-		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
-		0,
-		NULL,
-		MRK_NONE,
-		"prometheus.example.com",
-		NULL,
-		KEY_UNSPEC,
-		NULL,	/* filled at runtime */
-		NULL,
-	} },
 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
 		NULL,
-		60,
+		49,
 		HKF_STATUS_INVALID,
 		0,
 		NULL,
@@ -952,7 +808,7 @@
 	} },
 	{ NULL, HKF_STATUS_OK, KEY_RSA, HKF_MATCH_HOST, 0, 0, 0, -1, {
 		NULL,
-		61,
+		50,
 		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
 		0,
 		NULL,
@@ -980,6 +836,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, NULL, NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate all without key parse");
@@ -990,6 +847,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, NULL, NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify host 1");
@@ -1001,6 +859,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "prometheus.example.com", NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify host 2");
@@ -1012,6 +871,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "sisyphus.example.com", NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match host 1");
@@ -1023,6 +883,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "prometheus.example.com", NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match host 2");
@@ -1034,6 +895,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "sisyphus.example.com", NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify host missing");
@@ -1044,6 +906,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "actaeon.example.org", NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match host missing");
@@ -1054,6 +917,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "actaeon.example.org", NULL, ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify IPv4");
@@ -1065,6 +929,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "tiresias.example.org", "192.0.2.1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify IPv6");
@@ -1076,6 +941,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "tiresias.example.org", "2001:db8::1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match IPv4");
@@ -1087,6 +953,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "tiresias.example.org", "192.0.2.1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match IPv6");
@@ -1098,6 +965,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "tiresias.example.org", "2001:db8::1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify addr missing");
@@ -1108,6 +976,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "tiresias.example.org", "192.168.0.1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match addr missing");
@@ -1118,6 +987,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "tiresias.example.org", "::1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify host 2 and IPv4");
@@ -1130,6 +1000,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "sisyphus.example.com", "192.0.2.1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match host 1 and IPv6");
@@ -1141,7 +1012,9 @@
 	ctx.match_ipv6 = 1;
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
-	    check, &ctx, "prometheus.example.com", "2001:db8::1", ctx.flags), 0);
+	    check, &ctx, "prometheus.example.com",
+	    "2001:db8::1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate specify host 2 and IPv4 w/ key parse");
@@ -1154,6 +1027,7 @@
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
 	    check, &ctx, "sisyphus.example.com", "192.0.2.1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 
 	TEST_START("hostkeys_iterate match host 1 and IPv6 w/ key parse");
@@ -1165,7 +1039,9 @@
 	ctx.match_ipv6 = 1;
 	prepare_expected(expected_full, ctx.nexpected);
 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
-	    check, &ctx, "prometheus.example.com", "2001:db8::1", ctx.flags), 0);
+	    check, &ctx, "prometheus.example.com",
+	    "2001:db8::1", ctx.flags), 0);
+	cleanup_expected(expected_full, ctx.nexpected);
 	TEST_DONE();
 }
 
diff --git a/regress/unittests/hostkeys/testdata/known_hosts b/regress/unittests/hostkeys/testdata/known_hosts
index 3740f67..4446f45 100644
--- a/regress/unittests/hostkeys/testdata/known_hosts
+++ b/regress/unittests/hostkeys/testdata/known_hosts
@@ -2,60 +2,49 @@
 sisyphus.example.com ssh-dss AAAAB3NzaC1kc3MAAACBAOqffHxEW4c+Z9q/r3l4sYK8F7qrBsU8XF9upGsW62T9InROFFq9IO0x3pQ6mDA0Wtw0sqcDmkPCHPyP4Ok/fU3/drLaZusHoVYu8pBBrWsIDrKgkeX9TEodBsSrYdl4Sqtqq9EZv9+DttV6LStZrgYyUTOKwOF95wGantpLynX5AAAAFQDdt+zjRNlETDsgmxcSYFgREirJrQAAAIBQlrPaiPhR24FhnMLcHH4016vL7AqDDID6Qw7PhbXGa4/XlxWMIigjBKrIPKvnZ6p712LSnCKtcbfdx0MtmJlNa01CYqPaRhgRaf+uGdvTkTUcdaq8R5lLJL+JMNwUhcC8ijm3NqEjXjffuebGe1EzIeiITbA7Nndcd+GytwRDegAAAIEAkRYPjSVcUxfUHhHdpP6V8CuY1+CYSs9EPJ7iiWTDuXWVIBTU32oJLAnrmAcOwtIzEfPvm+rff5FI/Yhon2pB3VTXhPPEBjYzE5qANanAT4e6tzAVc5f3DUhHaDknwRYfDz86GFvuLtDjeE/UZ9t6OofYoEsCBpYozLAprBvNIQY= DSA #1
 sisyphus.example.com ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBF6yQEtD9yBw9gmDRf477WBBzvWhAa0ioBI3nbA4emKykj0RbuQd5C4XdQAEOZGzE7v//FcCjwB2wi+JH5eKkxCtN6CjohDASZ1huoIV2UVyYIicZJEEOg1IWjjphvaxtw== ECDSA #1
 sisyphus.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK9ks7jkua5YWIwByRnnnc6UPJQWI75O0e/UJdPYU1JI ED25519 #1
-sisyphus.example.com 1024 65537 153895431603677073925890314548566704948446776958334195280085080329934839226701954473292358821568047724356487621573742372399387931887004184139835510820577359977148363519970774657801798872789118894962853659233045778161859413980935372685480527355016624825696983269800574755126132814333241868538220824608980319407 RSA1 #1
 sisyphus.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDg4hB4vAZHJ0PVRiJajOv/GlytFWNpv5/9xgB9+5BIbvp8LOrFZ5D9K0Gsmwpd4G4rfaAz8j896DhMArg0vtkilIPPGt/6VzWMERgvaIQPJ/IE99X3+fjcAG56oAWwy29JX10lQMzBPU6XJIaN/zqpkb6qUBiAHBdLpxrFBBU0/w== RSA #1
 
 # Plain host keys, hostnames + addresses
 prometheus.example.com,192.0.2.1,2001:db8::1 ssh-dss AAAAB3NzaC1kc3MAAACBAI38Hy/61/O5Bp6yUG8J5XQCeNjRS0xvjlCdzKLyXCueMa+L+X2L/u9PWUsy5SVbTjGgpB8sF6UkCNsV+va7S8zCCHas2MZ7GPlxP6GZBkRPTIFR0N/Pu7wfBzDQz0t0iL4VmxBfTBQv/SxkGWZg+yHihIQP9fwdSAwD/7aVh6ItAAAAFQDSyihIUlINlswM0PJ8wXSti3yIMwAAAIB+oqzaB6ozqs8YxpN5oQOBa/9HEBQEsp8RSIlQmVubXRNgktp42n+Ii1waU9UUk8DX5ahhIeR6B7ojWkqmDAji4SKpoHf4kmr6HvYo85ZSTSx0W4YK/gJHSpDJwhlT52tAfb1JCbWSObjl09B4STv7KedCHcR5oXQvvrV+XoKOSAAAAIAue/EXrs2INw1RfaKNHC0oqOMxmRitv0BFMuNVPo1VDj39CE5kA7AHjwvS1TNeaHtK5Hhgeb6vsmLmNPTOc8xCob0ilyQbt9O0GbONeF2Ge7D2UJyULA/hxql+tCYFIC6yUrmo35fF9XiNisXLoaflk9fjp7ROWWVwnki/jstaQw== DSA #2
 prometheus.example.com,192.0.2.1,2001:db8::1 ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAB8qVcXwgBM92NCmReQlPrZAoui4Bz/mW0VUBFOpHXXW1n+15b/Y7Pc6UBd/ITTZmaBciXY+PWaSBGdwc5GdqGdLgFyJ/QAGrFMPNpVutm/82gNQzlxpNwjbMcKyiZEXzSgnjS6DzMQ0WuSMdzIBXq8OW/Kafxg4ZkU6YqALUXxlQMZuQ== ECDSA #2
 prometheus.example.com,192.0.2.1,2001:db8::1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIBp6PVW0z2o9C4Ukv/JOgmK7QMFe1pD1s3ADFF7IQob ED25519 #2
-prometheus.example.com,192.0.2.1,2001:db8::1 1024 65537 135970715082947442639683969597180728933388298633245835186618852623800675939308729462220235058285909679252157995530180587329132927339620517781785310829060832352381015614725360278571924286986474946772141568893116432268565829418506866604294073334978275702221949783314402806080929601995102334442541344606109853641 RSA1 #2
 prometheus.example.com,192.0.2.1,2001:db8::1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDmbUhNabB5AmBDX6GNHZ3lbn7pRxqfpW+f53QqNGlK0sLV+0gkMIrOfUp1kdE2ZLE6tfzdicatj/RlH6/wuo4yyYb+Pyx3G0vxdmAIiA4aANq38XweDucBC0TZkRWVHK+Gs5V/uV0z7N0axJvkkJujMLvST3CRiiWwlficBc6yVQ== RSA #2
 
 # Some hosts with wildcard names / IPs
 *.example.com,192.0.2.*,2001:* ssh-dss AAAAB3NzaC1kc3MAAACBAI6lz2Ip9bzE7TGuDD4SjO9S4Ac90gq0h6ai1O06eI8t/Ot2uJ5Jk2QyVr2jvIZHDl/5bwBx7+5oyjlwRoUrAPPD814wf5tU2tSnmdu1Wbf0cBswif5q0r4tevzmopp/AtgH11QHo3u0/pfyJd10qBDLV2FaYSKMmZvyPfZJ0s9pAAAAFQD5Eqjl6Rx2qVePodD9OwAPT0bU6wAAAIAfnDm6csZF0sFaJR3NIJvaYgSGr8s7cqlsk2gLltB/1wOOO2yX+NeEC+B0H93hlMfaUsPa08bwgmYxnavSMqEBpmtPceefJiEd68zwYqXd38f88wyWZ9Z5iwaI/6OVZPHzCbDxOa4ewVTevRNYUKP1xUTZNT8/gSMfZLYPk4T2AQAAAIAUKroozRMyV+3V/rxt0gFnNxRXBKk+9cl3vgsQ7ktkI9cYg7V1T2K0XF21AVMK9gODszy6PBJjV6ruXBV6TRiqIbQauivp3bHHKYsG6wiJNqwdbVwIjfvv8nn1qFoZQLXG3sdONr9NwN8KzrX89OV0BlR2dVM5qqp+YxOXymP9yg== DSA #3
 *.example.com,192.0.2.*,2001:* ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIb3BhJZk+vUQPg5TQc1koIzuGqloCq7wjr9LjlhG24IBeiFHLsdWw74HDlH4DrOmlxToVYk2lTdnjARleRByjk= ECDSA #3
 *.example.com,192.0.2.*,2001:* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBlYfExtYZAPqYvYdrlpGlSWhh/XNHcH3v3c2JzsVNbB ED25519 #3
-*.example.com,192.0.2.*,2001:* 1024 65537 125895605498029643697051635076028105429632810811904702876152645261610759866299221305725069141163240694267669117205342283569102183636228981857946763978553664895308762890072813014496700601576921921752482059207749978374872713540759920335553799711267170948655579130584031555334229966603000896364091459595522912269 RSA1 #3
 *.example.com,192.0.2.*,2001:* ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDX8F93W3SH4ZSus4XUQ2cw9dqcuyUETTlKEeGv3zlknV3YCoe2Mp04naDhiuwj8sOsytrZSESzLY1ZEyzrjxE6ZFVv8NKgck/AbRjcwlRFOcx9oKUxOrXRa0IoXlTq0kyjKCJfaHBKnGitZThknCPTbVmpATkm5xx6J0WEDozfoQ== RSA #3
 
 # Hashed hostname and address entries
-|1|6FWxoqTCAfm8sZ7T/q73OmxCFGM=|S4eQmusok4cbyDzzGEFGIAthDbw= ssh-dss AAAAB3NzaC1kc3MAAACBALrFy7w5ihlaOG+qR+6fj+vm5EQaO3qwxgACLcgH+VfShuOG4mkx8qFJmf+OZ3fh5iKngjNZfKtfcqI7zHWdk6378TQfQC52/kbZukjNXOLCpyNkogahcjA00onIoTK1RUDuMW28edAHwPFbpttXDTaqis+8JPMY8hZwsZGENCzTAAAAFQD6+It5vozwGgaN9ROYPMlByhi6jwAAAIBz2mcAC694vNzz9b6614gkX9d9E99PzJYfU1MPkXDziKg7MrjBw7Opd5y1jL09S3iL6lSTlHkKwVKvQ3pOwWRwXXRrKVus4I0STveoApm526jmp6mY0YEtqR98vMJ0v97h1ydt8FikKlihefCsnXVicb8887PXs2Y8C6GuFT3tfQAAAIBbmHtV5tPcrMRDkULhaQ/Whap2VKvT2DUhIHA7lx6oy/KpkltOpxDZOIGUHKqffGbiR7Jh01/y090AY5L2eCf0S2Ytx93+eADwVVpJbFJo6zSwfeey2Gm6L2oA+rCz9zTdmtZoekpD3/RAOQjnJIAPwbs7mXwabZTw4xRtiYIRrw== DSA #5
-|1|hTrfD0CuuB9ZbOa1CHFYvIk/gKE=|tPmW50t7flncm1UyM+DR97ubDNU= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPIudcagzq4QPtP1jkpje34+0POLB0jwT64hqrbCqhTH2T800KDZ0h2vwlJYa3OP3Oqru9AB5pnuHsKw7mAhUGY= ECDSA #5
-|1|fOGqe75X5ZpTz4c7DitP4E8/y30=|Lmcch2fh54bUYoV//S2VqDFVeiY= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINf63qSV8rD57N+digID8t28WVhd3Yf2K2UhaoG8TsWQ ED25519 #5
-|1|0RVzLjY3lwE3MRweguaAXaCCWk8=|DbcIgJQcRZJMYI6NYDOM6oJycPk= 1024 65537 127931411493401587586867047972295564331543694182352197506125410692673654572057908999642645524647232712160516076508316152810117209181150078352725299319149726341058893406440426414316276977768958023952319602422835879783057966985348561111880658922724668687074412548487722084792283453716871417610020757212399252171 RSA1 #5
-|1|4q79XnHpKBNQhyMLAqbPPDN+JKo=|k1Wvjjb52zDdrXWM801+wX5oH8U= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC/C15Q4sfnk7BZff1er8bscay+5s51oD4eWArlHWMK/ZfYeeTAccTy+7B7Jv+MS4nKCpflrvJI2RQz4kS8vF0ATdBbi4jeWefStlHNg0HLhnCY7NAfDIlRdaN9lm3Pqm2vmr+CkqwcJaSpycDg8nPN9yNAuD6pv7NDuUnECezojQ== RSA #5
+|1|z3xOIdT5ue3Vuf3MzT67kaioqjw=|GZhhe5uwDOBQrC9N4cCjpbLpSn4= ssh-dss AAAAB3NzaC1kc3MAAACBALrFy7w5ihlaOG+qR+6fj+vm5EQaO3qwxgACLcgH+VfShuOG4mkx8qFJmf+OZ3fh5iKngjNZfKtfcqI7zHWdk6378TQfQC52/kbZukjNXOLCpyNkogahcjA00onIoTK1RUDuMW28edAHwPFbpttXDTaqis+8JPMY8hZwsZGENCzTAAAAFQD6+It5vozwGgaN9ROYPMlByhi6jwAAAIBz2mcAC694vNzz9b6614gkX9d9E99PzJYfU1MPkXDziKg7MrjBw7Opd5y1jL09S3iL6lSTlHkKwVKvQ3pOwWRwXXRrKVus4I0STveoApm526jmp6mY0YEtqR98vMJ0v97h1ydt8FikKlihefCsnXVicb8887PXs2Y8C6GuFT3tfQAAAIBbmHtV5tPcrMRDkULhaQ/Whap2VKvT2DUhIHA7lx6oy/KpkltOpxDZOIGUHKqffGbiR7Jh01/y090AY5L2eCf0S2Ytx93+eADwVVpJbFJo6zSwfeey2Gm6L2oA+rCz9zTdmtZoekpD3/RAOQjnJIAPwbs7mXwabZTw4xRtiYIRrw== DSA #5
+|1|B7t/AYabn8zgwU47Cb4A/Nqt3eI=|arQPZyRphkzisr7w6wwikvhaOyE= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPIudcagzq4QPtP1jkpje34+0POLB0jwT64hqrbCqhTH2T800KDZ0h2vwlJYa3OP3Oqru9AB5pnuHsKw7mAhUGY= ECDSA #5
+|1|JR81WxEocTP5d7goIRkl8fHBbno=|l6sj6FOsoXxgEZMzn/BnOfPKN68= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINf63qSV8rD57N+digID8t28WVhd3Yf2K2UhaoG8TsWQ ED25519 #5
+|1|W7x4zY6KtTZJgsopyOusJqvVPag=|QauLt7hKezBZFZi2i4Xopho7Nsk= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC/C15Q4sfnk7BZff1er8bscay+5s51oD4eWArlHWMK/ZfYeeTAccTy+7B7Jv+MS4nKCpflrvJI2RQz4kS8vF0ATdBbi4jeWefStlHNg0HLhnCY7NAfDIlRdaN9lm3Pqm2vmr+CkqwcJaSpycDg8nPN9yNAuD6pv7NDuUnECezojQ== RSA #5
 
-|1|0M6PIx6THA3ipIOvTl3fcgn2z+A=|bwEJAOwJz+Sm7orFdgj170mD/zY= ssh-dss AAAAB3NzaC1kc3MAAACBAIutigAse65TCW6hHDOEGXenE9L4L0talHbs65hj3UUNtWflKdQeXLofqXgW8AwaDKmnuRPrxRoxVNXj84n45wtBEdt4ztmdAZteAbXSnHqpcxME3jDxh3EtxzGPXLs+RUmKPVguraSgo7W2oN7KFx6VM+AcAtxANSTlvDid3s47AAAAFQCd9Q3kkHSLWe77sW0eRaayI45ovwAAAIAw6srGF6xvFasI44Y3r9JJ2K+3ezozl3ldL3p2+p2HG3iWafC4SdV8pB6ZIxKlYAywiiFb3LzH/JweGFq1jtoFDRM3MlYORBevydU4zPz7b5QLDVB0sY4evYtWmg2BFJvoWRfhLnlZVW7h5N8v4fNIwdVmVsw4Ljes7iF2HRGhHgAAAIBDFT3fww2Oby1xUA6G9pDAcVikrQFqp1sJRylNTUyeyQ37SNAGzYxwHJFgQr8gZLdRQ1UW+idYpqVbVNcYFMOiw/zSqK2OfVwPZ9U+TTKdc992ChSup6vJEKM/ZVIyDWDbJr7igQ4ahy7jo9mFvm8ljN926EnspQzCvs0Dxk6tHA== DSA #6
-|1|a6WGHcL+9gX3e96tMlgDSDJwtSg=|5Dqlb/yqNEf7jgfllrp/ygLmRV8= ssh-dss AAAAB3NzaC1kc3MAAACBAIutigAse65TCW6hHDOEGXenE9L4L0talHbs65hj3UUNtWflKdQeXLofqXgW8AwaDKmnuRPrxRoxVNXj84n45wtBEdt4ztmdAZteAbXSnHqpcxME3jDxh3EtxzGPXLs+RUmKPVguraSgo7W2oN7KFx6VM+AcAtxANSTlvDid3s47AAAAFQCd9Q3kkHSLWe77sW0eRaayI45ovwAAAIAw6srGF6xvFasI44Y3r9JJ2K+3ezozl3ldL3p2+p2HG3iWafC4SdV8pB6ZIxKlYAywiiFb3LzH/JweGFq1jtoFDRM3MlYORBevydU4zPz7b5QLDVB0sY4evYtWmg2BFJvoWRfhLnlZVW7h5N8v4fNIwdVmVsw4Ljes7iF2HRGhHgAAAIBDFT3fww2Oby1xUA6G9pDAcVikrQFqp1sJRylNTUyeyQ37SNAGzYxwHJFgQr8gZLdRQ1UW+idYpqVbVNcYFMOiw/zSqK2OfVwPZ9U+TTKdc992ChSup6vJEKM/ZVIyDWDbJr7igQ4ahy7jo9mFvm8ljN926EnspQzCvs0Dxk6tHA== DSA #6
-|1|OeCpi7Pn5Q6c8la4fPf9G8YctT8=|sC6D7lDXTafIpokZJ1+1xWg2R6Q= ssh-dss AAAAB3NzaC1kc3MAAACBAIutigAse65TCW6hHDOEGXenE9L4L0talHbs65hj3UUNtWflKdQeXLofqXgW8AwaDKmnuRPrxRoxVNXj84n45wtBEdt4ztmdAZteAbXSnHqpcxME3jDxh3EtxzGPXLs+RUmKPVguraSgo7W2oN7KFx6VM+AcAtxANSTlvDid3s47AAAAFQCd9Q3kkHSLWe77sW0eRaayI45ovwAAAIAw6srGF6xvFasI44Y3r9JJ2K+3ezozl3ldL3p2+p2HG3iWafC4SdV8pB6ZIxKlYAywiiFb3LzH/JweGFq1jtoFDRM3MlYORBevydU4zPz7b5QLDVB0sY4evYtWmg2BFJvoWRfhLnlZVW7h5N8v4fNIwdVmVsw4Ljes7iF2HRGhHgAAAIBDFT3fww2Oby1xUA6G9pDAcVikrQFqp1sJRylNTUyeyQ37SNAGzYxwHJFgQr8gZLdRQ1UW+idYpqVbVNcYFMOiw/zSqK2OfVwPZ9U+TTKdc992ChSup6vJEKM/ZVIyDWDbJr7igQ4ahy7jo9mFvm8ljN926EnspQzCvs0Dxk6tHA== DSA #6
-|1|BHESVyiJ7G2NN0lxrw7vT109jmk=|TKof+015J77bXqibsh0N1Lp0MKk= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK1wRLyKtvK3Mmhd0XPkKwW4ev1KBVf8J4aG8lESq1TsaqqfOXYGyxMq5pN8fCGiD5UPOqyTYz/ZNzClRhJRHao= ECDSA #6
-|1|wY53mZNASDJ5/P3JYCJ4FUNa6WQ=|v8p0MfV5lqlZB2J0yLxl/gsWVQo= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK1wRLyKtvK3Mmhd0XPkKwW4ev1KBVf8J4aG8lESq1TsaqqfOXYGyxMq5pN8fCGiD5UPOqyTYz/ZNzClRhJRHao= ECDSA #6
-|1|horeoyFPwfKhyFN+zJZ5LCfOo/I=|2ofvp0tNwCbKsV8FuiFA4gQG2Z8= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK1wRLyKtvK3Mmhd0XPkKwW4ev1KBVf8J4aG8lESq1TsaqqfOXYGyxMq5pN8fCGiD5UPOqyTYz/ZNzClRhJRHao= ECDSA #6
-|1|Aw4fXumZfx6jEIJuDGIyeEMd81A=|5FdLtdm2JeKNsS8IQeQlGYIadOE= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPLW0ZwCkRQldpLa4I5BpwGa/om+WE6OgC8jdVqakt0Z ED25519 #6
-|1|+dGUNpv6GblrDd5fgHLlOWpSbEo=|He/pQ1yJjtiCyTNWpGwjBD4sZFI= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPLW0ZwCkRQldpLa4I5BpwGa/om+WE6OgC8jdVqakt0Z ED25519 #6
-|1|E/PACGl8m1T7QnPedOoooozstP0=|w6DQAFT8yZgj0Hlkz5R1TppYHCA= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPLW0ZwCkRQldpLa4I5BpwGa/om+WE6OgC8jdVqakt0Z ED25519 #6
-|1|SaoyMStgxpYfwedSXBAghi8Zo0s=|Gz78k69GaE6iViV3OOvbStKqyTA= 1024 65537 140883028436203600354693376066567741282115117509696517282419557936340193768851493584179972504103033755515036493433917203732876685813283050574208967197963391667532902202382549275760997891673884333346000558018002659506756213191532156293935482587878596032743105911487673274674568768638010598205190227631909167257 RSA1 #6
-|1|8qfGeiT5WTCzWYbXPQ+lsLg7km4=|1sIBwiSUr8IGkvrUGm3/9QYurmA= 1024 65537 140883028436203600354693376066567741282115117509696517282419557936340193768851493584179972504103033755515036493433917203732876685813283050574208967197963391667532902202382549275760997891673884333346000558018002659506756213191532156293935482587878596032743105911487673274674568768638010598205190227631909167257 RSA1 #6
-|1|87M1OtyHg1BZiDY3rT6lYsZFnAU=|eddAQVcMNbn2OB87XWXFQnYo6R4= 1024 65537 140883028436203600354693376066567741282115117509696517282419557936340193768851493584179972504103033755515036493433917203732876685813283050574208967197963391667532902202382549275760997891673884333346000558018002659506756213191532156293935482587878596032743105911487673274674568768638010598205190227631909167257 RSA1 #6
-|1|60w3wFfC0XWI+rRmRlxIRhh8lwE=|yMhsGrzBJKiesAdSQ/PVgkCrDKk= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQClu/3I6GG1Ai89Imnw0vXmWJ2OW0ftQwRrsbIAD0qzLFYpkJ76QWnzpCehvK9u0L5hcw7z2Y6mRLcSBsqONc+HVU73Qi7M4zHRvtjprPs3SOyLpf0J9sL1WiHBDwg2P0miHMCdqHDd5nVXkJB2d4eeecmgezGLa29NOHZjbza5yw== RSA #6
-|1|5gdEMmLUJC7grqWhRJPy2OTaSyE=|/XTfmLMa/B8npcVCGFRdaHl+d/0= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQClu/3I6GG1Ai89Imnw0vXmWJ2OW0ftQwRrsbIAD0qzLFYpkJ76QWnzpCehvK9u0L5hcw7z2Y6mRLcSBsqONc+HVU73Qi7M4zHRvtjprPs3SOyLpf0J9sL1WiHBDwg2P0miHMCdqHDd5nVXkJB2d4eeecmgezGLa29NOHZjbza5yw== RSA #6
-|1|6FGCWUr42GHdMB/eifnHNCuwgdk=|ONJvYZ/ANmi59R5HrOhLPmvYENM= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQClu/3I6GG1Ai89Imnw0vXmWJ2OW0ftQwRrsbIAD0qzLFYpkJ76QWnzpCehvK9u0L5hcw7z2Y6mRLcSBsqONc+HVU73Qi7M4zHRvtjprPs3SOyLpf0J9sL1WiHBDwg2P0miHMCdqHDd5nVXkJB2d4eeecmgezGLa29NOHZjbza5yw== RSA #6
+|1|mxnU8luzqWLvfVi5qBm5xVIyCRM=|9Epopft7LBd80Bf6RmWPIpwa8yU= ssh-dss AAAAB3NzaC1kc3MAAACBAIutigAse65TCW6hHDOEGXenE9L4L0talHbs65hj3UUNtWflKdQeXLofqXgW8AwaDKmnuRPrxRoxVNXj84n45wtBEdt4ztmdAZteAbXSnHqpcxME3jDxh3EtxzGPXLs+RUmKPVguraSgo7W2oN7KFx6VM+AcAtxANSTlvDid3s47AAAAFQCd9Q3kkHSLWe77sW0eRaayI45ovwAAAIAw6srGF6xvFasI44Y3r9JJ2K+3ezozl3ldL3p2+p2HG3iWafC4SdV8pB6ZIxKlYAywiiFb3LzH/JweGFq1jtoFDRM3MlYORBevydU4zPz7b5QLDVB0sY4evYtWmg2BFJvoWRfhLnlZVW7h5N8v4fNIwdVmVsw4Ljes7iF2HRGhHgAAAIBDFT3fww2Oby1xUA6G9pDAcVikrQFqp1sJRylNTUyeyQ37SNAGzYxwHJFgQr8gZLdRQ1UW+idYpqVbVNcYFMOiw/zSqK2OfVwPZ9U+TTKdc992ChSup6vJEKM/ZVIyDWDbJr7igQ4ahy7jo9mFvm8ljN926EnspQzCvs0Dxk6tHA== DSA #6
+|1|klvLmvh2vCpkNMDEjVvrE8SJWTg=|e/dqEEBLnbgqmwEesl4cDRu/7TM= ssh-dss AAAAB3NzaC1kc3MAAACBAIutigAse65TCW6hHDOEGXenE9L4L0talHbs65hj3UUNtWflKdQeXLofqXgW8AwaDKmnuRPrxRoxVNXj84n45wtBEdt4ztmdAZteAbXSnHqpcxME3jDxh3EtxzGPXLs+RUmKPVguraSgo7W2oN7KFx6VM+AcAtxANSTlvDid3s47AAAAFQCd9Q3kkHSLWe77sW0eRaayI45ovwAAAIAw6srGF6xvFasI44Y3r9JJ2K+3ezozl3ldL3p2+p2HG3iWafC4SdV8pB6ZIxKlYAywiiFb3LzH/JweGFq1jtoFDRM3MlYORBevydU4zPz7b5QLDVB0sY4evYtWmg2BFJvoWRfhLnlZVW7h5N8v4fNIwdVmVsw4Ljes7iF2HRGhHgAAAIBDFT3fww2Oby1xUA6G9pDAcVikrQFqp1sJRylNTUyeyQ37SNAGzYxwHJFgQr8gZLdRQ1UW+idYpqVbVNcYFMOiw/zSqK2OfVwPZ9U+TTKdc992ChSup6vJEKM/ZVIyDWDbJr7igQ4ahy7jo9mFvm8ljN926EnspQzCvs0Dxk6tHA== DSA #6
+|1|wsk3ddB3UjuxEsoeNCeZjZ6NvZs=|O3O/q2Z/u7DrxoTiIq6kzCevQT0= ssh-dss AAAAB3NzaC1kc3MAAACBAIutigAse65TCW6hHDOEGXenE9L4L0talHbs65hj3UUNtWflKdQeXLofqXgW8AwaDKmnuRPrxRoxVNXj84n45wtBEdt4ztmdAZteAbXSnHqpcxME3jDxh3EtxzGPXLs+RUmKPVguraSgo7W2oN7KFx6VM+AcAtxANSTlvDid3s47AAAAFQCd9Q3kkHSLWe77sW0eRaayI45ovwAAAIAw6srGF6xvFasI44Y3r9JJ2K+3ezozl3ldL3p2+p2HG3iWafC4SdV8pB6ZIxKlYAywiiFb3LzH/JweGFq1jtoFDRM3MlYORBevydU4zPz7b5QLDVB0sY4evYtWmg2BFJvoWRfhLnlZVW7h5N8v4fNIwdVmVsw4Ljes7iF2HRGhHgAAAIBDFT3fww2Oby1xUA6G9pDAcVikrQFqp1sJRylNTUyeyQ37SNAGzYxwHJFgQr8gZLdRQ1UW+idYpqVbVNcYFMOiw/zSqK2OfVwPZ9U+TTKdc992ChSup6vJEKM/ZVIyDWDbJr7igQ4ahy7jo9mFvm8ljN926EnspQzCvs0Dxk6tHA== DSA #6
+|1|B8epmkLSni+vGZDijr/EwxeR2k4=|7ct8yzNOVJhKm3ZD2w0XIT7df8E= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK1wRLyKtvK3Mmhd0XPkKwW4ev1KBVf8J4aG8lESq1TsaqqfOXYGyxMq5pN8fCGiD5UPOqyTYz/ZNzClRhJRHao= ECDSA #6
+|1|JojD885UhYhbCu571rgyM/5PpYU=|BJaU2aE1FebQZy3B5tzTDRWFRG0= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK1wRLyKtvK3Mmhd0XPkKwW4ev1KBVf8J4aG8lESq1TsaqqfOXYGyxMq5pN8fCGiD5UPOqyTYz/ZNzClRhJRHao= ECDSA #6
+|1|5t7UDHDybVrDZVQPCpwdnr6nk4k=|EqJ73W/veIL3H2x+YWHcJxI5ETA= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK1wRLyKtvK3Mmhd0XPkKwW4ev1KBVf8J4aG8lESq1TsaqqfOXYGyxMq5pN8fCGiD5UPOqyTYz/ZNzClRhJRHao= ECDSA #6
+|1|OCcBfGc/b9+ip+W6Gp+3ftdluO4=|VbrKUdzOOtIBOOmEE+jlK4SD3Xc= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPLW0ZwCkRQldpLa4I5BpwGa/om+WE6OgC8jdVqakt0Z ED25519 #6
+|1|9fLN0YdP+BJ25lKuKvYuOdUo93w=|vZyr0rOiX01hv5XbghhHMW+Zb3U= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPLW0ZwCkRQldpLa4I5BpwGa/om+WE6OgC8jdVqakt0Z ED25519 #6
+|1|nc9RoaaQ0s5jdPxwlUmluGHU3uk=|un6OsJajokKQ3MgyS9mfDNeyP6U= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPLW0ZwCkRQldpLa4I5BpwGa/om+WE6OgC8jdVqakt0Z ED25519 #6
+|1|rsHB6juT9q6GOY91qOeOwL6TSJE=|ps/vXF9Izuues5PbOn887Gw/2Dg= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQClu/3I6GG1Ai89Imnw0vXmWJ2OW0ftQwRrsbIAD0qzLFYpkJ76QWnzpCehvK9u0L5hcw7z2Y6mRLcSBsqONc+HVU73Qi7M4zHRvtjprPs3SOyLpf0J9sL1WiHBDwg2P0miHMCdqHDd5nVXkJB2d4eeecmgezGLa29NOHZjbza5yw== RSA #6
+|1|BsckdLH2aRyWQooRmv+Yo3t4dKg=|Lf3tJc5Iyx0KxNwAG89FsImsfEE= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQClu/3I6GG1Ai89Imnw0vXmWJ2OW0ftQwRrsbIAD0qzLFYpkJ76QWnzpCehvK9u0L5hcw7z2Y6mRLcSBsqONc+HVU73Qi7M4zHRvtjprPs3SOyLpf0J9sL1WiHBDwg2P0miHMCdqHDd5nVXkJB2d4eeecmgezGLa29NOHZjbza5yw== RSA #6
+|1|plqkBA4hq7UATyd5+/Xl+zL7ghw=|stacofaUed46666mfqxp9gJFjt4= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQClu/3I6GG1Ai89Imnw0vXmWJ2OW0ftQwRrsbIAD0qzLFYpkJ76QWnzpCehvK9u0L5hcw7z2Y6mRLcSBsqONc+HVU73Qi7M4zHRvtjprPs3SOyLpf0J9sL1WiHBDwg2P0miHMCdqHDd5nVXkJB2d4eeecmgezGLa29NOHZjbza5yw== RSA #6
 
 
 # Revoked and CA keys
-@revoked sisyphus.example.com 1024 65537 174143366122697048196335388217056770310345753698079464367148030836533360510864881734142526411160017107552815906024399248049666856133771656680462456979369587903909343046704480897527203474513676654933090991684252819423129896444427656841613263783484827101210734799449281639493127615902427443211183258155381810593 RSA1 #4
 @revoked sisyphus.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDFP8L9REfN/iYy1KIRtFqSCn3V2+vOCpoZYENFGLdOF ED25519 #4
 @cert-authority prometheus.example.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHZd0OXHIWwK3xnjAdMZ1tojxWycdu38pORO/UX5cqsKMgGCKQVBWWO3TFk1ePkGIE9VMWT1hCGqWRRwYlH+dSE= ECDSA #4
 @cert-authority *.example.com ssh-dss AAAAB3NzaC1kc3MAAACBAKvjnFHm0VvMr5h2Zu3nURsxQKGoxm+DCzYDxRYcilK07Cm5c4XTrFbA2X86+9sGs++W7QRMcTJUYIg0a+UtIMtAjwORd6ZPXM2K5dBW+gh1oHyvKi767tWX7I2c+1ZPJDY95mUUfZQUEfdy9eGDSBmw/pSsveQ1ur6XNUh/MtP/AAAAFQDHnXk/9jBJAdce1pHtLWnbdPSGdQAAAIEAm2OLy8tZBfiEO3c3X1yyB/GTcDwrQCqRMDkhnsmrliec3dWkOfNTzu+MrdvF8ymTWLEqPpbMheYtvNyZ3TF0HO5W7aVBpdGZbOdOAIfB+6skqGbI8A5Up1d7dak/bSsqL2r5NjwbDOdq+1hBzzvbl/qjh+sQarV2zHrpKoQaV28AAACANtkBVedBbqIAdphCrN/LbUi9WlyuF9UZz+tlpVLYrj8GJVwnplV2tvOmUw6yP5/pzCimTsao8dpL5PWxm7fKxLWVxA+lEsA4WeC885CiZn8xhdaJOCN+NyJ2bqkz+4VPI7oDGBm0aFwUqJn+M1PiSgvI50XdF2dBsFRTRNY0wzA= DSA #4
 
 # Some invalid lines
-@what sisyphus.example.com 1024 65537 153895431603677073925890314548566704948446776958334195280085080329934839226701954473292358821568047724356487621573742372399387931887004184139835510820577359977148363519970774657801798872789118894962853659233045778161859413980935372685480527355016624825696983269800574755126132814333241868538220824608980319407 RSA1 #1
+@what sisyphus.example.com ssh-dss AAAAB3NzaC1kc3MAAACBAOqffHxEW4c+Z9q/r3l4sYK8F7qrBsU8XF9upGsW62T9InROFFq9IO0x3pQ6mDA0Wtw0sqcDmkPCHPyP4Ok/fU3/drLaZusHoVYu8pBBrWsIDrKgkeX9TEodBsSrYdl4Sqtqq9EZv9+DttV6LStZrgYyUTOKwOF95wGantpLynX5AAAAFQDdt+zjRNlETDsgmxcSYFgREirJrQAAAIBQlrPaiPhR24FhnMLcHH4016vL7AqDDID6Qw7PhbXGa4/XlxWMIigjBKrIPKvnZ6p712LSnCKtcbfdx0MtmJlNa01CYqPaRhgRaf+uGdvTkTUcdaq8R5lLJL+JMNwUhcC8ijm3NqEjXjffuebGe1EzIeiITbA7Nndcd+GytwRDegAAAIEAkRYPjSVcUxfUHhHdpP6V8CuY1+CYSs9EPJ7iiWTDuXWVIBTU32oJLAnrmAcOwtIzEfPvm+rff5FI/Yhon2pB3VTXhPPEBjYzE5qANanAT4e6tzAVc5f3DUhHaDknwRYfDz86GFvuLtDjeE/UZ9t6OofYoEsCBpYozLAprBvNIQY= DSA #1
 sisyphus.example.com      
 prometheus.example.com ssh-ed25519 
 sisyphus.example.com ssh-dsa AAAATgAAAAdz
-prometheus.example.com 1024   
-sisyphus.example.com 1024 65535   
-prometheus.example.com 1025 65537 153895431603677073925890314548566704948446776958334195280085080329934839226701954473292358821568047724356487621573742372399387931887004184139835510820577359977148363519970774657801798872789118894962853659233045778161859413980935372685480527355016624825696983269800574755126132814333241868538220824608980319407 RSA1 #1
 sisyphus.example.com ssh-XXX AAAATgAAAAdzc2gtWFhYAAAAP0ZVQ0tPRkZGVUNLT0ZGRlVDS09GRkZVQ0tPRkZGVUNLT0ZGRlVDS09GRkZVQ0tPRkZGVUNLT0ZGRlVDS09GRg==
 prometheus.example.com ssh-rsa AAAATgAAAAdzc2gtWFhYAAAAP0ZVQ0tPRkZGVUNLT0ZGRlVDS09GRkZVQ0tPRkZGVUNLT0ZGRlVDS09GRkZVQ0tPRkZGVUNLT0ZGRlVDS09GRg==
diff --git a/regress/unittests/kex/Makefile b/regress/unittests/kex/Makefile
index 7ed3126..5c61307 100644
--- a/regress/unittests/kex/Makefile
+++ b/regress/unittests/kex/Makefile
@@ -1,7 +1,24 @@
-#	$OpenBSD: Makefile,v 1.4 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile,v 1.5 2017/12/21 00:41:22 djm Exp $
 
 PROG=test_kex
 SRCS=tests.c test_kex.c
+
+# From usr.bin/ssh
+SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
+SRCS+=atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c ssh-dss.c
+SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
+SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
+SRCS+=addrmatch.c bitmap.c packet.c dispatch.c canohost.c ssh_api.c
+SRCS+=kex.c kexc25519.c kexc25519c.c kexc25519s.c kexdh.c kexdhc.c kexdhs.c
+SRCS+=kexecdh.c kexecdhc.c kexecdhs.c kexgex.c kexgexc.c kexgexs.c
+SRCS+=dh.c compat.c
+SRCS+=ed25519.c hash.c ge25519.c fe25519.c sc25519.c verify.c
+SRCS+=cipher-chachapoly.c chacha.c poly1305.c
+SRCS+=smult_curve25519_ref.c
+
+SRCS+=digest-openssl.c
+#SRCS+=digest-libc.c
+
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
diff --git a/regress/unittests/match/Makefile b/regress/unittests/match/Makefile
index bd4aed8..87e7582 100644
--- a/regress/unittests/match/Makefile
+++ b/regress/unittests/match/Makefile
@@ -1,7 +1,13 @@
-#	$OpenBSD: Makefile,v 1.3 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile,v 1.4 2017/12/21 03:01:49 djm Exp $
 
 PROG=test_match
 SRCS=tests.c
+
+# From usr.bin/ssh
+SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
+SRCS+=match.c misc.c log.c uidswap.c fatal.c ssherr.c addrmatch.c xmalloc.c
+SRCS+=cleanup.c atomicio.c
+
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
diff --git a/regress/unittests/match/tests.c b/regress/unittests/match/tests.c
index e159336..3d9af55 100644
--- a/regress/unittests/match/tests.c
+++ b/regress/unittests/match/tests.c
@@ -1,4 +1,4 @@
-/* 	$OpenBSD: tests.c,v 1.4 2017/02/03 23:01:42 djm Exp $ */
+/* 	$OpenBSD: tests.c,v 1.5 2018/07/04 13:51:45 djm Exp $ */
 /*
  * Regress test for matching functions
  *
@@ -105,7 +105,7 @@
 
 #define CHECK_FILTER(string,filter,expected) \
 	do { \
-		char *result = match_filter_list((string), (filter)); \
+		char *result = match_filter_blacklist((string), (filter)); \
 		ASSERT_STRING_EQ(result, expected); \
 		free(result); \
 	} while (0)
diff --git a/regress/unittests/sshbuf/Makefile b/regress/unittests/sshbuf/Makefile
index 69b2756..81d4f27 100644
--- a/regress/unittests/sshbuf/Makefile
+++ b/regress/unittests/sshbuf/Makefile
@@ -1,4 +1,6 @@
-#	$OpenBSD: Makefile,v 1.5 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile,v 1.6 2017/12/21 00:41:22 djm Exp $
+
+.include <bsd.regress.mk>
 
 PROG=test_sshbuf
 SRCS=tests.c
@@ -10,5 +12,11 @@
 SRCS+=test_sshbuf_getput_fuzz.c
 SRCS+=test_sshbuf_fixed.c
 
-.include <bsd.regress.mk>
+# From usr.bin/ssh
+SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
+SRCS+=atomicio.c
+
+run-regress-${PROG}: ${PROG}
+	env ${TEST_ENV} ./${PROG}
+ 
 
diff --git a/regress/unittests/sshkey/Makefile b/regress/unittests/sshkey/Makefile
index cfbfcf8..1c940be 100644
--- a/regress/unittests/sshkey/Makefile
+++ b/regress/unittests/sshkey/Makefile
@@ -1,7 +1,20 @@
-#	$OpenBSD: Makefile,v 1.4 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile,v 1.5 2017/12/21 00:41:22 djm Exp $
 
 PROG=test_sshkey
 SRCS=tests.c test_sshkey.c test_file.c test_fuzz.c common.c
+
+# From usr.bin/ssh
+SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
+SRCS+=atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c ssh-dss.c
+SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
+SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
+SRCS+=addrmatch.c bitmap.c
+SRCS+=ed25519.c hash.c ge25519.c fe25519.c sc25519.c verify.c
+SRCS+=cipher-chachapoly.c chacha.c poly1305.c
+
+SRCS+=digest-openssl.c
+#SRCS+=digest-libc.c
+
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
diff --git a/regress/unittests/sshkey/mktestdata.sh b/regress/unittests/sshkey/mktestdata.sh
index e111001..8047bc6 100755
--- a/regress/unittests/sshkey/mktestdata.sh
+++ b/regress/unittests/sshkey/mktestdata.sh
@@ -1,25 +1,8 @@
 #!/bin/sh
-# $OpenBSD: mktestdata.sh,v 1.5 2015/07/07 14:53:30 markus Exp $
+# $OpenBSD: mktestdata.sh,v 1.6 2017/04/30 23:33:48 djm Exp $
 
 PW=mekmitasdigoat
 
-rsa1_params() {
-	_in="$1"
-	_outbase="$2"
-	set -e
-	ssh-keygen -f $_in -e -m pkcs8 | \
-	    openssl rsa -noout -text -pubin | \
-	    awk '/^Modulus:$/,/^Exponent:/' | \
-	    grep -v '^[a-zA-Z]' | tr -d ' \n:' > ${_outbase}.n
-	# XXX need conversion support in ssh-keygen for the other params
-	for x in n ; do
-		echo "" >> ${_outbase}.$x
-		echo ============ ${_outbase}.$x
-		cat ${_outbase}.$x
-		echo ============
-	done
-}
-
 rsa_params() {
 	_in="$1"
 	_outbase="$2"
@@ -87,20 +70,18 @@
 
 cd testdata
 
-rm -f rsa1_1 rsa_1 dsa_1 ecdsa_1 ed25519_1
-rm -f rsa1_2 rsa_2 dsa_2 ecdsa_2 ed25519_2
+rm -f rsa_1 dsa_1 ecdsa_1 ed25519_1
+rm -f rsa_2 dsa_2 ecdsa_2 ed25519_2
 rm -f rsa_n dsa_n ecdsa_n # new-format keys
-rm -f rsa1_1_pw rsa_1_pw dsa_1_pw ecdsa_1_pw ed25519_1_pw
+rm -f rsa_1_pw dsa_1_pw ecdsa_1_pw ed25519_1_pw
 rm -f rsa_n_pw dsa_n_pw ecdsa_n_pw
 rm -f pw *.pub *.bn.* *.param.* *.fp *.fp.bb
 
-ssh-keygen -t rsa1 -b 1024 -C "RSA1 test key #1" -N "" -f rsa1_1
 ssh-keygen -t rsa -b 1024 -C "RSA test key #1" -N "" -f rsa_1
 ssh-keygen -t dsa -b 1024 -C "DSA test key #1" -N "" -f dsa_1
 ssh-keygen -t ecdsa -b 256 -C "ECDSA test key #1" -N "" -f ecdsa_1
 ssh-keygen -t ed25519 -C "ED25519 test key #1" -N "" -f ed25519_1
 
-ssh-keygen -t rsa1 -b 2048 -C "RSA1 test key #2" -N "" -f rsa1_2
 ssh-keygen -t rsa -b 2048 -C "RSA test key #2" -N "" -f rsa_2
 ssh-keygen -t dsa -b 1024 -C "DSA test key #2" -N "" -f dsa_2
 ssh-keygen -t ecdsa -b 521 -C "ECDSA test key #2" -N "" -f ecdsa_2
@@ -110,7 +91,6 @@
 cp dsa_1 dsa_n
 cp ecdsa_1 ecdsa_n
 
-cp rsa1_1 rsa1_1_pw
 cp rsa_1 rsa_1_pw
 cp dsa_1 dsa_1_pw
 cp ecdsa_1 ecdsa_1_pw
@@ -119,7 +99,6 @@
 cp dsa_1 dsa_n_pw
 cp ecdsa_1 ecdsa_n_pw
 
-ssh-keygen -pf rsa1_1_pw -N "$PW"
 ssh-keygen -pf rsa_1_pw -N "$PW"
 ssh-keygen -pf dsa_1_pw -N "$PW"
 ssh-keygen -pf ecdsa_1_pw -N "$PW"
@@ -128,8 +107,6 @@
 ssh-keygen -opf dsa_n_pw -N "$PW"
 ssh-keygen -opf ecdsa_n_pw -N "$PW"
 
-rsa1_params rsa1_1 rsa1_1.param
-rsa1_params rsa1_2 rsa1_2.param
 rsa_params rsa_1 rsa_1.param
 rsa_params rsa_2 rsa_2.param
 dsa_params dsa_1 dsa_1.param
@@ -160,12 +137,10 @@
 ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \
     -V 19990101:20110101 -z 8 ed25519_1.pub
 
-ssh-keygen -lf rsa1_1 | awk '{print $2}' > rsa1_1.fp
 ssh-keygen -lf rsa_1 | awk '{print $2}' > rsa_1.fp
 ssh-keygen -lf dsa_1 | awk '{print $2}' > dsa_1.fp
 ssh-keygen -lf ecdsa_1 | awk '{print $2}' > ecdsa_1.fp
 ssh-keygen -lf ed25519_1 | awk '{print $2}' > ed25519_1.fp
-ssh-keygen -lf rsa1_2 | awk '{print $2}' > rsa1_2.fp
 ssh-keygen -lf rsa_2 | awk '{print $2}' > rsa_2.fp
 ssh-keygen -lf dsa_2 | awk '{print $2}' > dsa_2.fp
 ssh-keygen -lf ecdsa_2 | awk '{print $2}' > ecdsa_2.fp
@@ -176,12 +151,10 @@
 ssh-keygen -lf ed25519_1-cert.pub  | awk '{print $2}' > ed25519_1-cert.fp
 ssh-keygen -lf rsa_1-cert.pub  | awk '{print $2}' > rsa_1-cert.fp
 
-ssh-keygen -Bf rsa1_1 | awk '{print $2}' > rsa1_1.fp.bb
 ssh-keygen -Bf rsa_1 | awk '{print $2}' > rsa_1.fp.bb
 ssh-keygen -Bf dsa_1 | awk '{print $2}' > dsa_1.fp.bb
 ssh-keygen -Bf ecdsa_1 | awk '{print $2}' > ecdsa_1.fp.bb
 ssh-keygen -Bf ed25519_1 | awk '{print $2}' > ed25519_1.fp.bb
-ssh-keygen -Bf rsa1_2 | awk '{print $2}' > rsa1_2.fp.bb
 ssh-keygen -Bf rsa_2 | awk '{print $2}' > rsa_2.fp.bb
 ssh-keygen -Bf dsa_2 | awk '{print $2}' > dsa_2.fp.bb
 ssh-keygen -Bf ecdsa_2 | awk '{print $2}' > ecdsa_2.fp.bb
diff --git a/regress/unittests/sshkey/test_file.c b/regress/unittests/sshkey/test_file.c
index 906491f..99b7e21 100644
--- a/regress/unittests/sshkey/test_file.c
+++ b/regress/unittests/sshkey/test_file.c
@@ -1,4 +1,4 @@
-/* 	$OpenBSD: test_file.c,v 1.5 2015/10/06 01:20:59 djm Exp $ */
+/* 	$OpenBSD: test_file.c,v 1.6 2017/04/30 23:33:48 djm Exp $ */
 /*
  * Regress test for sshkey.h key management API
  *
@@ -51,55 +51,6 @@
 	pw = load_text_file("pw");
 	TEST_DONE();
 
-#ifdef WITH_SSH1
-	TEST_START("parse RSA1 from private");
-	buf = load_file("rsa1_1");
-	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
-	sshbuf_free(buf);
-	ASSERT_PTR_NE(k1, NULL);
-	a = load_bignum("rsa1_1.param.n");
-	ASSERT_BIGNUM_EQ(k1->rsa->n, a);
-	BN_free(a);
-	TEST_DONE();
-
-	TEST_START("parse RSA1 from private w/ passphrase");
-	buf = load_file("rsa1_1_pw");
-	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
-	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
-	sshbuf_free(buf);
-	ASSERT_PTR_NE(k2, NULL);
-	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
-	sshkey_free(k2);
-	TEST_DONE();
-
-	TEST_START("load RSA1 from public");
-	ASSERT_INT_EQ(sshkey_load_public(test_data_file("rsa1_1.pub"), &k2,
-	    NULL), 0);
-	ASSERT_PTR_NE(k2, NULL);
-	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
-	sshkey_free(k2);
-	TEST_DONE();
-
-	TEST_START("RSA1 key hex fingerprint");
-	buf = load_text_file("rsa1_1.fp");
-	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
-	ASSERT_PTR_NE(cp, NULL);
-	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
-	sshbuf_free(buf);
-	free(cp);
-	TEST_DONE();
-
-	TEST_START("RSA1 key bubblebabble fingerprint");
-	buf = load_text_file("rsa1_1.fp.bb");
-	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
-	ASSERT_PTR_NE(cp, NULL);
-	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
-	sshbuf_free(buf);
-	free(cp);
-	TEST_DONE();
-
-	sshkey_free(k1);
-#endif
 
 	TEST_START("parse RSA from private");
 	buf = load_file("rsa_1");
diff --git a/regress/unittests/sshkey/test_fuzz.c b/regress/unittests/sshkey/test_fuzz.c
index 1f414e0..d3b0c92 100644
--- a/regress/unittests/sshkey/test_fuzz.c
+++ b/regress/unittests/sshkey/test_fuzz.c
@@ -1,4 +1,4 @@
-/* 	$OpenBSD: test_fuzz.c,v 1.6 2015/12/07 02:20:46 djm Exp $ */
+/* 	$OpenBSD: test_fuzz.c,v 1.8 2017/12/21 00:41:22 djm Exp $ */
 /*
  * Fuzz tests for key parsing
  *
@@ -83,7 +83,7 @@
 	fuzz = fuzz_begin(FUZZ_1_BIT_FLIP | /* too slow FUZZ_2_BIT_FLIP | */
 	    FUZZ_1_BYTE_FLIP | FUZZ_2_BYTE_FLIP |
 	    FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END, sig, l);
-	ASSERT_INT_EQ(sshkey_verify(k, sig, l, c, sizeof(c), 0), 0);
+	ASSERT_INT_EQ(sshkey_verify(k, sig, l, c, sizeof(c), NULL, 0), 0);
 	free(sig);
 	TEST_ONERROR(onerror, fuzz);
 	for(; !fuzz_done(fuzz); fuzz_next(fuzz)) {
@@ -91,7 +91,7 @@
 		if (fuzz_matches_original(fuzz))
 			continue;
 		ASSERT_INT_NE(sshkey_verify(k, fuzz_ptr(fuzz), fuzz_len(fuzz),
-		    c, sizeof(c), 0), 0);
+		    c, sizeof(c), NULL, 0), 0);
 	}
 	fuzz_cleanup(fuzz);
 }
@@ -104,49 +104,6 @@
 	struct fuzz *fuzz;
 	int r;
 
-#ifdef WITH_SSH1
-	TEST_START("fuzz RSA1 private");
-	buf = load_file("rsa1_1");
-	fuzz = fuzz_begin(FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP |
-	    FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END,
-	    sshbuf_mutable_ptr(buf), sshbuf_len(buf));
-	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
-	sshkey_free(k1);
-	sshbuf_free(buf);
-	ASSERT_PTR_NE(fuzzed = sshbuf_new(), NULL);
-	TEST_ONERROR(onerror, fuzz);
-	for(; !fuzz_done(fuzz); fuzz_next(fuzz)) {
-		r = sshbuf_put(fuzzed, fuzz_ptr(fuzz), fuzz_len(fuzz));
-		ASSERT_INT_EQ(r, 0);
-		if (sshkey_parse_private_fileblob(fuzzed, "", &k1, NULL) == 0)
-			sshkey_free(k1);
-		sshbuf_reset(fuzzed);
-	}
-	sshbuf_free(fuzzed);
-	fuzz_cleanup(fuzz);
-	TEST_DONE();
-
-	TEST_START("fuzz RSA1 public");
-	buf = load_file("rsa1_1_pw");
-	fuzz = fuzz_begin(FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP |
-	    FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END,
-	    sshbuf_mutable_ptr(buf), sshbuf_len(buf));
-	ASSERT_INT_EQ(sshkey_parse_public_rsa1_fileblob(buf, &k1, NULL), 0);
-	sshkey_free(k1);
-	sshbuf_free(buf);
-	ASSERT_PTR_NE(fuzzed = sshbuf_new(), NULL);
-	TEST_ONERROR(onerror, fuzz);
-	for(; !fuzz_done(fuzz); fuzz_next(fuzz)) {
-		r = sshbuf_put(fuzzed, fuzz_ptr(fuzz), fuzz_len(fuzz));
-		ASSERT_INT_EQ(r, 0);
-		if (sshkey_parse_public_rsa1_fileblob(fuzzed, &k1, NULL) == 0)
-			sshkey_free(k1);
-		sshbuf_reset(fuzzed);
-	}
-	sshbuf_free(fuzzed);
-	fuzz_cleanup(fuzz);
-	TEST_DONE();
-#endif
 
 	TEST_START("fuzz RSA private");
 	buf = load_file("rsa_1");
diff --git a/regress/unittests/sshkey/test_sshkey.c b/regress/unittests/sshkey/test_sshkey.c
index 1476dc2..72367bd 100644
--- a/regress/unittests/sshkey/test_sshkey.c
+++ b/regress/unittests/sshkey/test_sshkey.c
@@ -1,4 +1,4 @@
-/* 	$OpenBSD: test_sshkey.c,v 1.10 2016/05/02 09:52:00 djm Exp $ */
+/* 	$OpenBSD: test_sshkey.c,v 1.14 2018/07/13 02:13:19 djm Exp $ */
 /*
  * Regress test for sshkey.h key management API
  *
@@ -121,11 +121,11 @@
 	ASSERT_INT_EQ(sshkey_sign(k, &sig, &len, d, l, sig_alg, 0), 0);
 	ASSERT_SIZE_T_GT(len, 8);
 	ASSERT_PTR_NE(sig, NULL);
-	ASSERT_INT_EQ(sshkey_verify(k, sig, len, d, l, 0), 0);
-	ASSERT_INT_NE(sshkey_verify(bad, sig, len, d, l, 0), 0);
+	ASSERT_INT_EQ(sshkey_verify(k, sig, len, d, l, NULL, 0), 0);
+	ASSERT_INT_NE(sshkey_verify(bad, sig, len, d, l, NULL, 0), 0);
 	/* Fuzz test is more comprehensive, this is just a smoke test */
 	sig[len - 5] ^= 0x10;
-	ASSERT_INT_NE(sshkey_verify(k, sig, len, d, l, 0), 0);
+	ASSERT_INT_NE(sshkey_verify(k, sig, len, d, l, NULL, 0), 0);
 	free(sig);
 }
 
@@ -193,16 +193,6 @@
 	sshkey_free(k1);
 	TEST_DONE();
 
-	TEST_START("new/free KEY_RSA1");
-	k1 = sshkey_new(KEY_RSA1);
-	ASSERT_PTR_NE(k1, NULL);
-	ASSERT_PTR_NE(k1->rsa, NULL);
-	ASSERT_PTR_NE(k1->rsa->n, NULL);
-	ASSERT_PTR_NE(k1->rsa->e, NULL);
-	ASSERT_PTR_EQ(k1->rsa->p, NULL);
-	sshkey_free(k1);
-	TEST_DONE();
-
 	TEST_START("new/free KEY_RSA");
 	k1 = sshkey_new(KEY_RSA);
 	ASSERT_PTR_NE(k1, NULL);
@@ -263,19 +253,19 @@
 
 	TEST_START("generate KEY_RSA too small modulus");
 	ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 128, &k1),
-	    SSH_ERR_INVALID_ARGUMENT);
+	    SSH_ERR_KEY_LENGTH);
 	ASSERT_PTR_EQ(k1, NULL);
 	TEST_DONE();
 
 	TEST_START("generate KEY_RSA too large modulus");
 	ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 1 << 20, &k1),
-	    SSH_ERR_INVALID_ARGUMENT);
+	    SSH_ERR_KEY_LENGTH);
 	ASSERT_PTR_EQ(k1, NULL);
 	TEST_DONE();
 
 	TEST_START("generate KEY_DSA wrong bits");
 	ASSERT_INT_EQ(sshkey_generate(KEY_DSA, 2048, &k1),
-	    SSH_ERR_INVALID_ARGUMENT);
+	    SSH_ERR_KEY_LENGTH);
 	ASSERT_PTR_EQ(k1, NULL);
 	sshkey_free(k1);
 	TEST_DONE();
@@ -283,7 +273,7 @@
 #ifdef OPENSSL_HAS_ECC
 	TEST_START("generate KEY_ECDSA wrong bits");
 	ASSERT_INT_EQ(sshkey_generate(KEY_ECDSA, 42, &k1),
-	    SSH_ERR_INVALID_ARGUMENT);
+	    SSH_ERR_KEY_LENGTH);
 	ASSERT_PTR_EQ(k1, NULL);
 	sshkey_free(k1);
 	TEST_DONE();
@@ -291,7 +281,7 @@
 
 	TEST_START("generate KEY_RSA");
 	ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 767, &kr),
-	    SSH_ERR_INVALID_ARGUMENT);
+	    SSH_ERR_KEY_LENGTH);
 	ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 1024, &kr), 0);
 	ASSERT_PTR_NE(kr, NULL);
 	ASSERT_PTR_NE(kr->rsa, NULL);
@@ -444,10 +434,13 @@
 	ASSERT_PTR_NE(k1->cert->principals[1], NULL);
 	ASSERT_PTR_NE(k1->cert->principals[2], NULL);
 	ASSERT_PTR_NE(k1->cert->principals[3], NULL);
+	k1->cert->nprincipals = 4;
 	k1->cert->valid_after = 0;
 	k1->cert->valid_before = (u_int64_t)-1;
+	sshbuf_free(k1->cert->critical);
 	k1->cert->critical = sshbuf_new();
 	ASSERT_PTR_NE(k1->cert->critical, NULL);
+	sshbuf_free(k1->cert->extensions);
 	k1->cert->extensions = sshbuf_new();
 	ASSERT_PTR_NE(k1->cert->extensions, NULL);
 	put_opt(k1->cert->critical, "force-command", "/usr/bin/true");
diff --git a/regress/unittests/test_helper/test_helper.c b/regress/unittests/test_helper/test_helper.c
index 26ca26b..866f349 100644
--- a/regress/unittests/test_helper/test_helper.c
+++ b/regress/unittests/test_helper/test_helper.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: test_helper.c,v 1.6 2015/03/03 20:42:49 djm Exp $	*/
+/*	$OpenBSD: test_helper.c,v 1.8 2018/02/08 08:46:20 djm Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller <djm@mindrot.org>
  *
@@ -166,6 +166,18 @@
 	return 0;
 }
 
+int
+test_is_verbose()
+{
+	return verbose_mode;
+}
+
+int
+test_is_quiet()
+{
+	return quiet_mode;
+}
+
 const char *
 test_data_file(const char *name)
 {
@@ -442,6 +454,17 @@
 }
 
 void
+assert_long(const char *file, int line, const char *a1, const char *a2,
+    long aa1, long aa2, enum test_predicate pred)
+{
+	TEST_CHECK(aa1, aa2, pred);
+	test_header(file, line, a1, a2, "LONG", pred);
+	fprintf(stderr, "%12s = %ld / 0x%lx\n", a1, aa1, aa1);
+	fprintf(stderr, "%12s = %ld / 0x%lx\n", a2, aa2, aa2);
+	test_die();
+}
+
+void
 assert_long_long(const char *file, int line, const char *a1, const char *a2,
     long long aa1, long long aa2, enum test_predicate pred)
 {
diff --git a/regress/unittests/test_helper/test_helper.h b/regress/unittests/test_helper/test_helper.h
index 1d9c669..6da0066 100644
--- a/regress/unittests/test_helper/test_helper.h
+++ b/regress/unittests/test_helper/test_helper.h
@@ -1,4 +1,4 @@
-/*	$OpenBSD: test_helper.h,v 1.6 2015/01/18 19:52:44 djm Exp $	*/
+/*	$OpenBSD: test_helper.h,v 1.8 2018/02/08 08:46:20 djm Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller <djm@mindrot.org>
  *
@@ -43,6 +43,8 @@
 void test_info(char *s, size_t len);
 void set_onerror_func(test_onerror_func_t *f, void *ctx);
 void test_done(void);
+int test_is_verbose(void);
+int test_is_quiet(void);
 void test_subtest_info(const char *fmt, ...)
     __attribute__((format(printf, 1, 2)));
 void ssl_err_check(const char *file, int line);
@@ -67,6 +69,9 @@
 void assert_u_int(const char *file, int line,
     const char *a1, const char *a2,
     u_int aa1, u_int aa2, enum test_predicate pred);
+void assert_long(const char *file, int line,
+    const char *a1, const char *a2,
+    long aa1, long aa2, enum test_predicate pred);
 void assert_long_long(const char *file, int line,
     const char *a1, const char *a2,
     long long aa1, long long aa2, enum test_predicate pred);
@@ -110,6 +115,8 @@
 	assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
 #define ASSERT_U_INT_EQ(a1, a2) \
 	assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
+#define ASSERT_LONG_EQ(a1, a2) \
+	assert_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
 #define ASSERT_LONG_LONG_EQ(a1, a2) \
 	assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
 #define ASSERT_CHAR_EQ(a1, a2) \
@@ -139,6 +146,8 @@
 	assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
 #define ASSERT_U_INT_NE(a1, a2) \
 	assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
+#define ASSERT_LONG_NE(a1, a2) \
+	assert_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
 #define ASSERT_LONG_LONG_NE(a1, a2) \
 	assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
 #define ASSERT_CHAR_NE(a1, a2) \
@@ -166,6 +175,8 @@
 	assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
 #define ASSERT_U_INT_LT(a1, a2) \
 	assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
+#define ASSERT_LONG_LT(a1, a2) \
+	assert_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
 #define ASSERT_LONG_LONG_LT(a1, a2) \
 	assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
 #define ASSERT_CHAR_LT(a1, a2) \
@@ -193,6 +204,8 @@
 	assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
 #define ASSERT_U_INT_LE(a1, a2) \
 	assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
+#define ASSERT_LONG_LE(a1, a2) \
+	assert_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
 #define ASSERT_LONG_LONG_LE(a1, a2) \
 	assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
 #define ASSERT_CHAR_LE(a1, a2) \
@@ -220,6 +233,8 @@
 	assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
 #define ASSERT_U_INT_GT(a1, a2) \
 	assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
+#define ASSERT_LONG_GT(a1, a2) \
+	assert_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
 #define ASSERT_LONG_LONG_GT(a1, a2) \
 	assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
 #define ASSERT_CHAR_GT(a1, a2) \
@@ -247,6 +262,8 @@
 	assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
 #define ASSERT_U_INT_GE(a1, a2) \
 	assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
+#define ASSERT_LONG_GE(a1, a2) \
+	assert_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
 #define ASSERT_LONG_LONG_GE(a1, a2) \
 	assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
 #define ASSERT_CHAR_GE(a1, a2) \
diff --git a/regress/unittests/utf8/Makefile b/regress/unittests/utf8/Makefile
index a975264..f8eec04 100644
--- a/regress/unittests/utf8/Makefile
+++ b/regress/unittests/utf8/Makefile
@@ -1,7 +1,11 @@
-#	$OpenBSD: Makefile,v 1.4 2016/11/01 13:43:27 tb Exp $
+#	$OpenBSD: Makefile,v 1.5 2017/12/21 00:41:22 djm Exp $
 
 PROG=test_utf8
 SRCS=tests.c
+
+# From usr.bin/ssh
+SRCS+=utf8.c atomicio.c
+
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
diff --git a/regress/valgrind-unit.sh b/regress/valgrind-unit.sh
index 433cb06..4143ead 100755
--- a/regress/valgrind-unit.sh
+++ b/regress/valgrind-unit.sh
@@ -7,10 +7,12 @@
 test "x$OBJ" = "x" && OBJ=$PWD
 
 # This mostly replicates the logic in test-exec.sh for running the
-# regress tests under valgrind.
+# regress tests under valgrind, except that we unconditionally enable
+# leak checking because the unit tests should be clean.
+VG_LEAK="--leak-check=full"
 VG_TEST=`basename $UNIT_BINARY`
 VG_LOG="$OBJ/valgrind-out/${VG_TEST}.%p"
-VG_OPTS="--track-origins=yes --leak-check=full --log-file=${VG_LOG}"
+VG_OPTS="--track-origins=yes $VG_LEAK --log-file=${VG_LOG}"
 VG_OPTS="$VG_OPTS --trace-children=yes"
 VG_PATH="valgrind"
 if [ "x$VALGRIND_PATH" != "x" ]; then
diff --git a/regress/yes-head.sh b/regress/yes-head.sh
index 1fc7542..2759eb8 100644
--- a/regress/yes-head.sh
+++ b/regress/yes-head.sh
@@ -1,15 +1,13 @@
-#	$OpenBSD: yes-head.sh,v 1.5 2015/03/03 22:35:19 markus Exp $
+#	$OpenBSD: yes-head.sh,v 1.6 2017/04/30 23:34:55 djm Exp $
 #	Placed in the Public Domain.
 
 tid="yes pipe head"
 
-for p in ${SSH_PROTOCOLS}; do
-	lines=`${SSH} -$p -F $OBJ/ssh_proxy thishost 'sh -c "while true;do echo yes;done | _POSIX2_VERSION=199209 head -2000"' | (sleep 3 ; wc -l)`
-	if [ $? -ne 0 ]; then
-		fail "yes|head test failed"
-		lines = 0;
-	fi
-	if [ $lines -ne 2000 ]; then
-		fail "yes|head returns $lines lines instead of 2000"
-	fi
-done
+lines=`${SSH} -F $OBJ/ssh_proxy thishost 'sh -c "while true;do echo yes;done | _POSIX2_VERSION=199209 head -2000"' | (sleep 3 ; wc -l)`
+if [ $? -ne 0 ]; then
+	fail "yes|head test failed"
+	lines = 0;
+fi
+if [ $lines -ne 2000 ]; then
+	fail "yes|head returns $lines lines instead of 2000"
+fi
diff --git a/rsa.c b/rsa.c
deleted file mode 100644
index 5ecacef..0000000
--- a/rsa.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/* $OpenBSD: rsa.c,v 1.32 2014/06/24 01:13:21 djm Exp $ */
-/*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- *                    All rights reserved
- *
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose.  Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
- *
- *
- * Copyright (c) 1999 Niels Provos.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *
- * Description of the RSA algorithm can be found e.g. from the following
- * sources:
- *
- *   Bruce Schneier: Applied Cryptography.  John Wiley & Sons, 1994.
- *
- *   Jennifer Seberry and Josed Pieprzyk: Cryptography: An Introduction to
- *   Computer Security.  Prentice-Hall, 1989.
- *
- *   Man Young Rhee: Cryptography and Secure Data Communications.  McGraw-Hill,
- *   1994.
- *
- *   R. Rivest, A. Shamir, and L. M. Adleman: Cryptographic Communications
- *   System and Method.  US Patent 4,405,829, 1983.
- *
- *   Hans Riesel: Prime Numbers and Computer Methods for Factorization.
- *   Birkhauser, 1994.
- *
- *   The RSA Frequently Asked Questions document by RSA Data Security,
- *   Inc., 1995.
- *
- *   RSA in 3 lines of perl by Adam Back <aba@atlax.ex.ac.uk>, 1995, as
- * included below:
- *
- *     [gone - had to be deleted - what a pity]
- */
-
-#include "includes.h"
-
-#include <sys/types.h>
-
-#include <stdarg.h>
-#include <string.h>
-
-#include "rsa.h"
-#include "log.h"
-#include "ssherr.h"
-
-int
-rsa_public_encrypt(BIGNUM *out, BIGNUM *in, RSA *key)
-{
-	u_char *inbuf = NULL, *outbuf = NULL;
-	int len, ilen, olen, r = SSH_ERR_INTERNAL_ERROR;
-
-	if (BN_num_bits(key->e) < 2 || !BN_is_odd(key->e))
-		return SSH_ERR_INVALID_ARGUMENT;
-
-	olen = BN_num_bytes(key->n);
-	if ((outbuf = malloc(olen)) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-
-	ilen = BN_num_bytes(in);
-	if ((inbuf = malloc(ilen)) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-	BN_bn2bin(in, inbuf);
-
-	if ((len = RSA_public_encrypt(ilen, inbuf, outbuf, key,
-	    RSA_PKCS1_PADDING)) <= 0) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-
-	if (BN_bin2bn(outbuf, len, out) == NULL) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-	r = 0;
-
- out:
-	if (outbuf != NULL) {
-		explicit_bzero(outbuf, olen);
-		free(outbuf);
-	}
-	if (inbuf != NULL) {
-		explicit_bzero(inbuf, ilen);
-		free(inbuf);
-	}
-	return r;
-}
-
-int
-rsa_private_decrypt(BIGNUM *out, BIGNUM *in, RSA *key)
-{
-	u_char *inbuf = NULL, *outbuf = NULL;
-	int len, ilen, olen, r = SSH_ERR_INTERNAL_ERROR;
-
-	olen = BN_num_bytes(key->n);
-	if ((outbuf = malloc(olen)) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-
-	ilen = BN_num_bytes(in);
-	if ((inbuf = malloc(ilen)) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-	BN_bn2bin(in, inbuf);
-
-	if ((len = RSA_private_decrypt(ilen, inbuf, outbuf, key,
-	    RSA_PKCS1_PADDING)) <= 0) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	} else if (BN_bin2bn(outbuf, len, out) == NULL) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-	r = 0;
- out:
-	if (outbuf != NULL) {
-		explicit_bzero(outbuf, olen);
-		free(outbuf);
-	}
-	if (inbuf != NULL) {
-		explicit_bzero(inbuf, ilen);
-		free(inbuf);
-	}
-	return r;
-}
-
-/* calculate p-1 and q-1 */
-int
-rsa_generate_additional_parameters(RSA *rsa)
-{
-	BIGNUM *aux = NULL;
-	BN_CTX *ctx = NULL;
-	int r;
-
-	if ((ctx = BN_CTX_new()) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-	if ((aux = BN_new()) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-
-	if ((BN_sub(aux, rsa->q, BN_value_one()) == 0) ||
-	    (BN_mod(rsa->dmq1, rsa->d, aux, ctx) == 0) ||
-	    (BN_sub(aux, rsa->p, BN_value_one()) == 0) ||
-	    (BN_mod(rsa->dmp1, rsa->d, aux, ctx) == 0)) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-	r = 0;
- out:
-	BN_clear_free(aux);
-	BN_CTX_free(ctx);
-	return r;
-}
-
diff --git a/rsa.h b/rsa.h
deleted file mode 100644
index c476707..0000000
--- a/rsa.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $OpenBSD: rsa.h,v 1.17 2014/06/24 01:13:21 djm Exp $ */
-
-/*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- *                    All rights reserved
- * RSA key generation, encryption and decryption.
- *
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose.  Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
- */
-
-#ifndef RSA_H
-#define RSA_H
-
-#include <openssl/bn.h>
-#include <openssl/rsa.h>
-
-int	 rsa_public_encrypt(BIGNUM *, BIGNUM *, RSA *);
-int	 rsa_private_decrypt(BIGNUM *, BIGNUM *, RSA *);
-int	 rsa_generate_additional_parameters(RSA *);
-
-#endif				/* RSA_H */
diff --git a/sandbox-capsicum.c b/sandbox-capsicum.c
index 655f0d2..e10bad7 100644
--- a/sandbox-capsicum.c
+++ b/sandbox-capsicum.c
@@ -22,7 +22,7 @@
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/resource.h>
-#include <sys/capability.h>
+#include <sys/capsicum.h>
 
 #include <errno.h>
 #include <stdarg.h>
diff --git a/sandbox-seccomp-filter.c b/sandbox-seccomp-filter.c
index 2e1ed2c..12c4ee1 100644
--- a/sandbox-seccomp-filter.c
+++ b/sandbox-seccomp-filter.c
@@ -50,6 +50,9 @@
 #include <elf.h>
 
 #include <asm/unistd.h>
+#ifdef __s390__
+#include <asm/zcrypt.h>
+#endif
 
 #include <errno.h>
 #include <signal.h>
@@ -73,19 +76,35 @@
 # define SECCOMP_FILTER_FAIL SECCOMP_RET_TRAP
 #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */
 
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define ARG_LO_OFFSET  0
+# define ARG_HI_OFFSET  sizeof(uint32_t)
+#elif __BYTE_ORDER == __BIG_ENDIAN
+# define ARG_LO_OFFSET  sizeof(uint32_t)
+# define ARG_HI_OFFSET  0
+#else
+#error "Unknown endianness"
+#endif
+
 /* Simple helpers to avoid manual errors (but larger BPF programs). */
 #define SC_DENY(_nr, _errno) \
-	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_ ## _nr, 0, 1), \
+	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (_nr), 0, 1), \
 	BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ERRNO|(_errno))
 #define SC_ALLOW(_nr) \
-	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_ ## _nr, 0, 1), \
+	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (_nr), 0, 1), \
 	BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW)
 #define SC_ALLOW_ARG(_nr, _arg_nr, _arg_val) \
-	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_ ## _nr, 0, 4), \
-	/* load first syscall argument */ \
+	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (_nr), 0, 6), \
+	/* load and test first syscall argument, low word */ \
 	BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \
-	    offsetof(struct seccomp_data, args[(_arg_nr)])), \
-	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (_arg_val), 0, 1), \
+	    offsetof(struct seccomp_data, args[(_arg_nr)]) + ARG_LO_OFFSET), \
+	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, \
+	    ((_arg_val) & 0xFFFFFFFF), 0, 3), \
+	/* load and test first syscall argument, high word */ \
+	BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \
+	    offsetof(struct seccomp_data, args[(_arg_nr)]) + ARG_HI_OFFSET), \
+	BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, \
+	    (((uint32_t)((uint64_t)(_arg_val) >> 32)) & 0xFFFFFFFF), 0, 1), \
 	BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW), \
 	/* reload syscall number; all rules expect it in accumulator */ \
 	BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \
@@ -104,108 +123,138 @@
 
 	/* Syscalls to non-fatally deny */
 #ifdef __NR_lstat
-	SC_DENY(lstat, EACCES),
+	SC_DENY(__NR_lstat, EACCES),
 #endif
 #ifdef __NR_lstat64
-	SC_DENY(lstat64, EACCES),
+	SC_DENY(__NR_lstat64, EACCES),
 #endif
 #ifdef __NR_fstat
-	SC_DENY(fstat, EACCES),
+	SC_DENY(__NR_fstat, EACCES),
 #endif
 #ifdef __NR_fstat64
-	SC_DENY(fstat64, EACCES),
+	SC_DENY(__NR_fstat64, EACCES),
 #endif
 #ifdef __NR_open
-	SC_DENY(open, EACCES),
+	SC_DENY(__NR_open, EACCES),
 #endif
 #ifdef __NR_openat
-	SC_DENY(openat, EACCES),
+	SC_DENY(__NR_openat, EACCES),
 #endif
 #ifdef __NR_newfstatat
-	SC_DENY(newfstatat, EACCES),
+	SC_DENY(__NR_newfstatat, EACCES),
 #endif
 #ifdef __NR_stat
-	SC_DENY(stat, EACCES),
+	SC_DENY(__NR_stat, EACCES),
 #endif
 #ifdef __NR_stat64
-	SC_DENY(stat64, EACCES),
+	SC_DENY(__NR_stat64, EACCES),
 #endif
 
 	/* Syscalls to permit */
 #ifdef __NR_brk
-	SC_ALLOW(brk),
+	SC_ALLOW(__NR_brk),
 #endif
 #ifdef __NR_clock_gettime
-	SC_ALLOW(clock_gettime),
+	SC_ALLOW(__NR_clock_gettime),
 #endif
 #ifdef __NR_close
-	SC_ALLOW(close),
+	SC_ALLOW(__NR_close),
 #endif
 #ifdef __NR_exit
-	SC_ALLOW(exit),
+	SC_ALLOW(__NR_exit),
 #endif
 #ifdef __NR_exit_group
-	SC_ALLOW(exit_group),
+	SC_ALLOW(__NR_exit_group),
+#endif
+#ifdef __NR_geteuid
+	SC_ALLOW(__NR_geteuid),
+#endif
+#ifdef __NR_geteuid32
+	SC_ALLOW(__NR_geteuid32),
 #endif
 #ifdef __NR_getpgid
-	SC_ALLOW(getpgid),
+	SC_ALLOW(__NR_getpgid),
 #endif
 #ifdef __NR_getpid
-	SC_ALLOW(getpid),
+	SC_ALLOW(__NR_getpid),
 #endif
 #ifdef __NR_getrandom
-	SC_ALLOW(getrandom),
+	SC_ALLOW(__NR_getrandom),
 #endif
 #ifdef __NR_gettimeofday
-	SC_ALLOW(gettimeofday),
+	SC_ALLOW(__NR_gettimeofday),
+#endif
+#ifdef __NR_getuid
+	SC_ALLOW(__NR_getuid),
+#endif
+#ifdef __NR_getuid32
+	SC_ALLOW(__NR_getuid32),
 #endif
 #ifdef __NR_madvise
-	SC_ALLOW(madvise),
+	SC_ALLOW(__NR_madvise),
 #endif
 #ifdef __NR_mmap
-	SC_ALLOW(mmap),
+	SC_ALLOW(__NR_mmap),
 #endif
 #ifdef __NR_mmap2
-	SC_ALLOW(mmap2),
+	SC_ALLOW(__NR_mmap2),
 #endif
 #ifdef __NR_mremap
-	SC_ALLOW(mremap),
+	SC_ALLOW(__NR_mremap),
 #endif
 #ifdef __NR_munmap
-	SC_ALLOW(munmap),
+	SC_ALLOW(__NR_munmap),
+#endif
+#ifdef __NR_nanosleep
+	SC_ALLOW(__NR_nanosleep),
 #endif
 #ifdef __NR__newselect
-	SC_ALLOW(_newselect),
+	SC_ALLOW(__NR__newselect),
 #endif
 #ifdef __NR_poll
-	SC_ALLOW(poll),
+	SC_ALLOW(__NR_poll),
 #endif
 #ifdef __NR_pselect6
-	SC_ALLOW(pselect6),
+	SC_ALLOW(__NR_pselect6),
 #endif
 #ifdef __NR_read
-	SC_ALLOW(read),
+	SC_ALLOW(__NR_read),
 #endif
 #ifdef __NR_rt_sigprocmask
-	SC_ALLOW(rt_sigprocmask),
+	SC_ALLOW(__NR_rt_sigprocmask),
 #endif
 #ifdef __NR_select
-	SC_ALLOW(select),
+	SC_ALLOW(__NR_select),
 #endif
 #ifdef __NR_shutdown
-	SC_ALLOW(shutdown),
+	SC_ALLOW(__NR_shutdown),
 #endif
 #ifdef __NR_sigprocmask
-	SC_ALLOW(sigprocmask),
+	SC_ALLOW(__NR_sigprocmask),
 #endif
 #ifdef __NR_time
-	SC_ALLOW(time),
+	SC_ALLOW(__NR_time),
 #endif
 #ifdef __NR_write
-	SC_ALLOW(write),
+	SC_ALLOW(__NR_write),
 #endif
 #ifdef __NR_socketcall
-	SC_ALLOW_ARG(socketcall, 0, SYS_SHUTDOWN),
+	SC_ALLOW_ARG(__NR_socketcall, 0, SYS_SHUTDOWN),
+	SC_DENY(__NR_socketcall, EACCES),
+#endif
+#if defined(__NR_ioctl) && defined(__s390__)
+	/* Allow ioctls for ICA crypto card on s390 */
+	SC_ALLOW_ARG(__NR_ioctl, 1, Z90STAT_STATUS_MASK),
+	SC_ALLOW_ARG(__NR_ioctl, 1, ICARSAMODEXPO),
+	SC_ALLOW_ARG(__NR_ioctl, 1, ICARSACRT),
+#endif
+#if defined(__x86_64__) && defined(__ILP32__) && defined(__X32_SYSCALL_BIT)
+	/*
+	 * On Linux x32, the clock_gettime VDSO falls back to the
+	 * x86-64 syscall under some circumstances, e.g.
+	 * https://bugs.debian.org/849923
+	 */
+	SC_ALLOW(__NR_clock_gettime & ~__X32_SYSCALL_BIT),
 #endif
 
 	/* Default deny */
diff --git a/sandbox-solaris.c b/sandbox-solaris.c
index 343a010..56ddb9a 100644
--- a/sandbox-solaris.c
+++ b/sandbox-solaris.c
@@ -62,6 +62,12 @@
 #ifdef PRIV_NET_ACCESS
 	    priv_delset(box->pset, PRIV_NET_ACCESS) != 0 ||
 #endif
+#ifdef PRIV_DAX_ACCESS
+	    priv_delset(box->pset, PRIV_DAX_ACCESS) != 0 ||
+#endif
+#ifdef PRIV_SYS_IB_INFO
+	    priv_delset(box->pset, PRIV_SYS_IB_INFO) != 0 ||
+#endif
 	    priv_delset(box->pset, PRIV_PROC_EXEC) != 0 ||
 	    priv_delset(box->pset, PRIV_PROC_FORK) != 0 ||
 	    priv_delset(box->pset, PRIV_PROC_INFO) != 0 ||
diff --git a/sandbox-systrace.c b/sandbox-systrace.c
index b4d8d04..add4c46 100644
--- a/sandbox-systrace.c
+++ b/sandbox-systrace.c
@@ -59,6 +59,7 @@
 	{ SYS_getpgid, SYSTR_POLICY_PERMIT },
 	{ SYS_clock_gettime, SYSTR_POLICY_PERMIT },
 	{ SYS_gettimeofday, SYSTR_POLICY_PERMIT },
+	{ SYS_nanosleep, SYSTR_POLICY_PERMIT },
 	{ SYS_sigprocmask, SYSTR_POLICY_PERMIT },
 
 #ifdef SYS_getentropy
diff --git a/scp.1 b/scp.1
index 4ae8777..92abcaf 100644
--- a/scp.1
+++ b/scp.1
@@ -8,9 +8,9 @@
 .\"
 .\" Created: Sun May  7 00:14:37 1995 ylo
 .\"
-.\" $OpenBSD: scp.1,v 1.71 2016/07/16 06:57:55 jmc Exp $
+.\" $OpenBSD: scp.1,v 1.80 2018/07/19 10:28:47 dtucker Exp $
 .\"
-.Dd $Mdocdate: July 16 2016 $
+.Dd $Mdocdate: July 19 2018 $
 .Dt SCP 1
 .Os
 .Sh NAME
@@ -18,8 +18,7 @@
 .Nd secure copy (remote file copy program)
 .Sh SYNOPSIS
 .Nm scp
-.Bk -words
-.Op Fl 12346BCpqrv
+.Op Fl 346BCpqrv
 .Op Fl c Ar cipher
 .Op Fl F Ar ssh_config
 .Op Fl i Ar identity_file
@@ -27,20 +26,7 @@
 .Op Fl o Ar ssh_option
 .Op Fl P Ar port
 .Op Fl S Ar program
-.Sm off
-.Oo
-.Op Ar user No @
-.Ar host1 :
-.Oc Ar file1
-.Sm on
-.Ar ...
-.Sm off
-.Oo
-.Op Ar user No @
-.Ar host2 :
-.Oc Ar file2
-.Sm on
-.Ek
+.Ar source ... target
 .Sh DESCRIPTION
 .Nm
 copies files between hosts on a network.
@@ -53,26 +39,36 @@
 will ask for passwords or passphrases if they are needed for
 authentication.
 .Pp
-File names may contain a user and host specification to indicate
-that the file is to be copied to/from that host.
+The
+.Ar source
+and
+.Ar target
+may be specified as a local pathname, a remote host with optional path
+in the form
+.Sm off
+.Oo user @ Oc host : Op path ,
+.Sm on
+or a URI in the form
+.Sm off
+.No scp:// Oo user @ Oc host Oo : port Oc Op / path .
+.Sm on
 Local file names can be made explicit using absolute or relative pathnames
 to avoid
 .Nm
 treating file names containing
 .Sq :\&
 as host specifiers.
-Copies between two remote hosts are also permitted.
+.Pp
+When copying between two remote hosts, if the URI format is used, a
+.Ar port
+may only be specified on the
+.Ar target
+if the
+.Fl 3
+option is used.
 .Pp
 The options are as follows:
 .Bl -tag -width Ds
-.It Fl 1
-Forces
-.Nm
-to use protocol 1.
-.It Fl 2
-Forces
-.Nm
-to use protocol 2.
 .It Fl 3
 Copies between two remote hosts are transferred through the local host.
 Without this option the data is copied directly between the two remote
@@ -128,6 +124,7 @@
 .It AddressFamily
 .It BatchMode
 .It BindAddress
+.It BindInterface
 .It CanonicalDomains
 .It CanonicalizeFallbackLocal
 .It CanonicalizeHostname
@@ -136,10 +133,8 @@
 .It CertificateFile
 .It ChallengeResponseAuthentication
 .It CheckHostIP
-.It Cipher
 .It Ciphers
 .It Compression
-.It CompressionLevel
 .It ConnectionAttempts
 .It ConnectTimeout
 .It ControlMaster
@@ -170,21 +165,18 @@
 .It PKCS11Provider
 .It Port
 .It PreferredAuthentications
-.It Protocol
 .It ProxyCommand
 .It ProxyJump
 .It PubkeyAcceptedKeyTypes
 .It PubkeyAuthentication
 .It RekeyLimit
-.It RhostsRSAAuthentication
-.It RSAAuthentication
 .It SendEnv
 .It ServerAliveInterval
 .It ServerAliveCountMax
+.It SetEnv
 .It StrictHostKeyChecking
 .It TCPKeepAlive
 .It UpdateHostKeys
-.It UsePrivilegedPort
 .It User
 .It UserKnownHostsFile
 .It VerifyHostKeyDNS
diff --git a/scp.c b/scp.c
index b4db851..60682c6 100644
--- a/scp.c
+++ b/scp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scp.c,v 1.187 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: scp.c,v 1.197 2018/06/01 04:31:48 dtucker Exp $ */
 /*
  * scp - secure remote copy.  This is basically patched BSD rcp which
  * uses ssh to do the data transfer (instead of using rcmd).
@@ -99,6 +99,9 @@
 #include <pwd.h>
 #include <signal.h>
 #include <stdarg.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -109,6 +112,7 @@
 #endif
 
 #include "xmalloc.h"
+#include "ssh.h"
 #include "atomicio.h"
 #include "pathnames.h"
 #include "log.h"
@@ -120,8 +124,8 @@
 
 #define COPY_BUFLEN	16384
 
-int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout);
-int do_cmd2(char *host, char *remuser, char *cmd, int fdin, int fdout);
+int do_cmd(char *host, char *remuser, int port, char *cmd, int *fdin, int *fdout);
+int do_cmd2(char *host, char *remuser, int port, char *cmd, int fdin, int fdout);
 
 /* Struct for addargs */
 arglist args;
@@ -146,6 +150,9 @@
  */
 int throughlocal = 0;
 
+/* Non-standard port to use for the ssh connection or -1. */
+int sshport = -1;
+
 /* This is the program to execute for the secured connection. ("ssh" or -S) */
 char *ssh_program = _PATH_SSH_PROGRAM;
 
@@ -228,7 +235,7 @@
  */
 
 int
-do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout)
+do_cmd(char *host, char *remuser, int port, char *cmd, int *fdin, int *fdout)
 {
 	int pin[2], pout[2], reserved[2];
 
@@ -238,6 +245,9 @@
 		    ssh_program, host,
 		    remuser ? remuser : "(unspecified)", cmd);
 
+	if (port == -1)
+		port = sshport;
+
 	/*
 	 * Reserve two descriptors so that the real pipes won't get
 	 * descriptors 0 and 1 because that will screw up dup2 below.
@@ -271,6 +281,10 @@
 		close(pout[1]);
 
 		replacearg(&args, 0, "%s", ssh_program);
+		if (port != -1) {
+			addargs(&args, "-p");
+			addargs(&args, "%d", port);
+		}
 		if (remuser != NULL) {
 			addargs(&args, "-l");
 			addargs(&args, "%s", remuser);
@@ -297,12 +311,12 @@
 }
 
 /*
- * This functions executes a command simlar to do_cmd(), but expects the
+ * This function executes a command similar to do_cmd(), but expects the
  * input and output descriptors to be setup by a previous call to do_cmd().
  * This way the input and output of two commands can be connected.
  */
 int
-do_cmd2(char *host, char *remuser, char *cmd, int fdin, int fdout)
+do_cmd2(char *host, char *remuser, int port, char *cmd, int fdin, int fdout)
 {
 	pid_t pid;
 	int status;
@@ -313,6 +327,9 @@
 		    ssh_program, host,
 		    remuser ? remuser : "(unspecified)", cmd);
 
+	if (port == -1)
+		port = sshport;
+
 	/* Fork a child to execute the command on the remote host using ssh. */
 	pid = fork();
 	if (pid == 0) {
@@ -320,6 +337,10 @@
 		dup2(fdout, 1);
 
 		replacearg(&args, 0, "%s", ssh_program);
+		if (port != -1) {
+			addargs(&args, "-p");
+			addargs(&args, "%d", port);
+		}
 		if (remuser != NULL) {
 			addargs(&args, "-l");
 			addargs(&args, "%s", remuser);
@@ -364,14 +385,14 @@
 void sink(int, char *[]);
 void source(int, char *[]);
 void tolocal(int, char *[]);
-void toremote(char *, int, char *[]);
+void toremote(int, char *[]);
 void usage(void);
 
 int
 main(int argc, char **argv)
 {
 	int ch, fflag, tflag, status, n;
-	char *targ, **newargv;
+	char **newargv;
 	const char *errstr;
 	extern char *optarg;
 	extern int optind;
@@ -397,13 +418,19 @@
 	addargs(&args, "-oForwardAgent=no");
 	addargs(&args, "-oPermitLocalCommand=no");
 	addargs(&args, "-oClearAllForwardings=yes");
+	addargs(&args, "-oRemoteCommand=none");
+	addargs(&args, "-oRequestTTY=no");
 
 	fflag = tflag = 0;
 	while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q12346S:o:F:")) != -1)
 		switch (ch) {
 		/* User-visible flags. */
 		case '1':
+			fatal("SSH protocol v.1 is no longer supported");
+			break;
 		case '2':
+			/* Ignored */
+			break;
 		case '4':
 		case '6':
 		case 'C':
@@ -423,10 +450,9 @@
 			addargs(&args, "%s", optarg);
 			break;
 		case 'P':
-			addargs(&remote_remote_args, "-p");
-			addargs(&remote_remote_args, "%s", optarg);
-			addargs(&args, "-p");
-			addargs(&args, "%s", optarg);
+			sshport = a2port(optarg);
+			if (sshport <= 0)
+				fatal("bad port \"%s\"\n", optarg);
 			break;
 		case 'B':
 			addargs(&remote_remote_args, "-oBatchmode=yes");
@@ -526,8 +552,8 @@
 
 	(void) signal(SIGPIPE, lostconn);
 
-	if ((targ = colon(argv[argc - 1])))	/* Dest is remote host. */
-		toremote(targ, argc, argv);
+	if (colon(argv[argc - 1]))	/* Dest is remote host. */
+		toremote(argc, argv);
 	else {
 		if (targetshouldbedirectory)
 			verifydir(argv[argc - 1]);
@@ -582,72 +608,90 @@
 	return (response());
 }
 
-void
-toremote(char *targ, int argc, char **argv)
+static int
+parse_scp_uri(const char *uri, char **userp, char **hostp, int *portp,
+     char **pathp)
 {
-	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
+	int r;
+
+	r = parse_uri("scp", uri, userp, hostp, portp, pathp);
+	if (r == 0 && *pathp == NULL)
+		*pathp = xstrdup(".");
+	return r;
+}
+
+void
+toremote(int argc, char **argv)
+{
+	char *suser = NULL, *host = NULL, *src = NULL;
+	char *bp, *tuser, *thost, *targ;
+	int sport = -1, tport = -1;
 	arglist alist;
-	int i;
+	int i, r;
 	u_int j;
 
 	memset(&alist, '\0', sizeof(alist));
 	alist.list = NULL;
 
-	*targ++ = 0;
-	if (*targ == 0)
-		targ = ".";
-
-	arg = xstrdup(argv[argc - 1]);
-	if ((thost = strrchr(arg, '@'))) {
-		/* user@host */
-		*thost++ = 0;
-		tuser = arg;
-		if (*tuser == '\0')
-			tuser = NULL;
-	} else {
-		thost = arg;
-		tuser = NULL;
+	/* Parse target */
+	r = parse_scp_uri(argv[argc - 1], &tuser, &thost, &tport, &targ);
+	if (r == -1) {
+		fmprintf(stderr, "%s: invalid uri\n", argv[argc - 1]);
+		++errs;
+		goto out;
 	}
-
+	if (r != 0) {
+		if (parse_user_host_path(argv[argc - 1], &tuser, &thost,
+		    &targ) == -1) {
+			fmprintf(stderr, "%s: invalid target\n", argv[argc - 1]);
+			++errs;
+			goto out;
+		}
+	}
 	if (tuser != NULL && !okname(tuser)) {
-		free(arg);
-		return;
+		++errs;
+		goto out;
 	}
 
+	/* Parse source files */
 	for (i = 0; i < argc - 1; i++) {
-		src = colon(argv[i]);
-		if (src && throughlocal) {	/* extended remote to remote */
-			*src++ = 0;
-			if (*src == 0)
-				src = ".";
-			host = strrchr(argv[i], '@');
-			if (host) {
-				*host++ = 0;
-				host = cleanhostname(host);
-				suser = argv[i];
-				if (*suser == '\0')
-					suser = pwd->pw_name;
-				else if (!okname(suser))
-					continue;
-			} else {
-				host = cleanhostname(argv[i]);
-				suser = NULL;
-			}
+		free(suser);
+		free(host);
+		free(src);
+		r = parse_scp_uri(argv[i], &suser, &host, &sport, &src);
+		if (r == -1) {
+			fmprintf(stderr, "%s: invalid uri\n", argv[i]);
+			++errs;
+			continue;
+		}
+		if (r != 0) {
+			parse_user_host_path(argv[i], &suser, &host, &src);
+		}
+		if (suser != NULL && !okname(suser)) {
+			++errs;
+			continue;
+		}
+		if (host && throughlocal) {	/* extended remote to remote */
 			xasprintf(&bp, "%s -f %s%s", cmd,
 			    *src == '-' ? "-- " : "", src);
-			if (do_cmd(host, suser, bp, &remin, &remout) < 0)
+			if (do_cmd(host, suser, sport, bp, &remin, &remout) < 0)
 				exit(1);
 			free(bp);
-			host = cleanhostname(thost);
 			xasprintf(&bp, "%s -t %s%s", cmd,
 			    *targ == '-' ? "-- " : "", targ);
-			if (do_cmd2(host, tuser, bp, remin, remout) < 0)
+			if (do_cmd2(thost, tuser, tport, bp, remin, remout) < 0)
 				exit(1);
 			free(bp);
 			(void) close(remin);
 			(void) close(remout);
 			remin = remout = -1;
-		} else if (src) {	/* standard remote to remote */
+		} else if (host) {	/* standard remote to remote */
+			if (tport != -1 && tport != SSH_DEFAULT_PORT) {
+				/* This would require the remote support URIs */
+				fatal("target port not supported with two "
+				    "remote hosts without the -3 option");
+			}
+
 			freeargs(&alist);
 			addargs(&alist, "%s", ssh_program);
 			addargs(&alist, "-x");
@@ -657,23 +701,14 @@
 				addargs(&alist, "%s",
 				    remote_remote_args.list[j]);
 			}
-			*src++ = 0;
-			if (*src == 0)
-				src = ".";
-			host = strrchr(argv[i], '@');
 
-			if (host) {
-				*host++ = 0;
-				host = cleanhostname(host);
-				suser = argv[i];
-				if (*suser == '\0')
-					suser = pwd->pw_name;
-				else if (!okname(suser))
-					continue;
+			if (sport != -1) {
+				addargs(&alist, "-p");
+				addargs(&alist, "%d", sport);
+			}
+			if (suser) {
 				addargs(&alist, "-l");
 				addargs(&alist, "%s", suser);
-			} else {
-				host = cleanhostname(argv[i]);
 			}
 			addargs(&alist, "--");
 			addargs(&alist, "%s", host);
@@ -688,8 +723,7 @@
 			if (remin == -1) {
 				xasprintf(&bp, "%s -t %s%s", cmd,
 				    *targ == '-' ? "-- " : "", targ);
-				host = cleanhostname(thost);
-				if (do_cmd(host, tuser, bp, &remin,
+				if (do_cmd(thost, tuser, tport, bp, &remin,
 				    &remout) < 0)
 					exit(1);
 				if (response() < 0)
@@ -699,21 +733,42 @@
 			source(1, argv + i);
 		}
 	}
-	free(arg);
+out:
+	free(tuser);
+	free(thost);
+	free(targ);
+	free(suser);
+	free(host);
+	free(src);
 }
 
 void
 tolocal(int argc, char **argv)
 {
-	char *bp, *host, *src, *suser;
+	char *bp, *host = NULL, *src = NULL, *suser = NULL;
 	arglist alist;
-	int i;
+	int i, r, sport = -1;
 
 	memset(&alist, '\0', sizeof(alist));
 	alist.list = NULL;
 
 	for (i = 0; i < argc - 1; i++) {
-		if (!(src = colon(argv[i]))) {	/* Local to local. */
+		free(suser);
+		free(host);
+		free(src);
+		r = parse_scp_uri(argv[i], &suser, &host, &sport, &src);
+		if (r == -1) {
+			fmprintf(stderr, "%s: invalid uri\n", argv[i]);
+			++errs;
+			continue;
+		}
+		if (r != 0)
+			parse_user_host_path(argv[i], &suser, &host, &src);
+		if (suser != NULL && !okname(suser)) {
+			++errs;
+			continue;
+		}
+		if (!host) {	/* Local to local. */
 			freeargs(&alist);
 			addargs(&alist, "%s", _PATH_CP);
 			if (iamrecursive)
@@ -727,22 +782,10 @@
 				++errs;
 			continue;
 		}
-		*src++ = 0;
-		if (*src == 0)
-			src = ".";
-		if ((host = strrchr(argv[i], '@')) == NULL) {
-			host = argv[i];
-			suser = NULL;
-		} else {
-			*host++ = 0;
-			suser = argv[i];
-			if (*suser == '\0')
-				suser = pwd->pw_name;
-		}
-		host = cleanhostname(host);
+		/* Remote to local. */
 		xasprintf(&bp, "%s -f %s%s",
 		    cmd, *src == '-' ? "-- " : "", src);
-		if (do_cmd(host, suser, bp, &remin, &remout) < 0) {
+		if (do_cmd(host, suser, sport, bp, &remin, &remout) < 0) {
 			free(bp);
 			++errs;
 			continue;
@@ -752,6 +795,9 @@
 		(void) close(remin);
 		remin = remout = -1;
 	}
+	free(suser);
+	free(host);
+	free(src);
 }
 
 void
@@ -915,6 +961,11 @@
 	(void) response();
 }
 
+#define TYPE_OVERFLOW(type, val) \
+	((sizeof(type) == 4 && (val) > INT32_MAX) || \
+	 (sizeof(type) == 8 && (val) > INT64_MAX) || \
+	 (sizeof(type) != 4 && sizeof(type) != 8))
+
 void
 sink(int argc, char **argv)
 {
@@ -938,6 +989,9 @@
 #define	mtime	tv[1]
 #define	SCREWUP(str)	{ why = str; goto screwup; }
 
+	if (TYPE_OVERFLOW(time_t, 0) || TYPE_OVERFLOW(off_t, 0))
+		SCREWUP("Unexpected off_t/time_t size");
+
 	setimes = targisdir = 0;
 	mask = umask(0);
 	if (!pflag)
@@ -996,8 +1050,7 @@
 			ull = strtoull(cp, &cp, 10);
 			if (!cp || *cp++ != ' ')
 				SCREWUP("mtime.sec not delimited");
-			if ((time_t)ull < 0 ||
-			    (unsigned long long)(time_t)ull != ull)
+			if (TYPE_OVERFLOW(time_t, ull))
 				setimes = 0;	/* out of range */
 			mtime.tv_sec = ull;
 			mtime.tv_usec = strtol(cp, &cp, 10);
@@ -1009,8 +1062,7 @@
 			ull = strtoull(cp, &cp, 10);
 			if (!cp || *cp++ != ' ')
 				SCREWUP("atime.sec not delimited");
-			if ((time_t)ull < 0 ||
-			    (unsigned long long)(time_t)ull != ull)
+			if (TYPE_OVERFLOW(time_t, ull))
 				setimes = 0;	/* out of range */
 			atime.tv_sec = ull;
 			atime.tv_usec = strtol(cp, &cp, 10);
@@ -1040,13 +1092,20 @@
 				SCREWUP("bad mode");
 			mode = (mode << 3) | (*cp - '0');
 		}
+		if (!pflag)
+			mode &= ~mask;
 		if (*cp++ != ' ')
 			SCREWUP("mode not delimited");
 
-		for (size = 0; isdigit((unsigned char)*cp);)
-			size = size * 10 + (*cp++ - '0');
-		if (*cp++ != ' ')
+		if (!isdigit((unsigned char)*cp))
+			SCREWUP("size not present");
+		ull = strtoull(cp, &cp, 10);
+		if (!cp || *cp++ != ' ')
 			SCREWUP("size not delimited");
+		if (TYPE_OVERFLOW(off_t, ull))
+			SCREWUP("size out of range");
+		size = (off_t)ull;
+
 		if ((strchr(cp, '/') != NULL) || (strcmp(cp, "..") == 0)) {
 			run_err("error: unexpected filename: %s", cp);
 			exit(1);
@@ -1256,9 +1315,8 @@
 usage(void)
 {
 	(void) fprintf(stderr,
-	    "usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]\n"
-	    "           [-l limit] [-o ssh_option] [-P port] [-S program]\n"
-	    "           [[user@]host1:]file1 ... [[user@]host2:]file2\n");
+	    "usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]\n"
+	    "           [-l limit] [-o ssh_option] [-P port] [-S program] source ... target\n");
 	exit(1);
 }
 
@@ -1350,11 +1408,7 @@
 #endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
 	if (bp->cnt >= size)
 		return (bp);
-	if (bp->buf == NULL)
-		bp->buf = xmalloc(size);
-	else
-		bp->buf = xreallocarray(bp->buf, 1, size);
-	memset(bp->buf, 0, size);
+	bp->buf = xrecallocarray(bp->buf, bp->cnt, size, 1);
 	bp->cnt = size;
 	return (bp);
 }
diff --git a/servconf.c b/servconf.c
index 2f8e29d..c0f6af0 100644
--- a/servconf.c
+++ b/servconf.c
@@ -1,5 +1,5 @@
 
-/* $OpenBSD: servconf.c,v 1.304 2017/02/03 23:01:19 djm Exp $ */
+/* $OpenBSD: servconf.c,v 1.340 2018/08/12 20:19:13 djm Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
@@ -15,10 +15,16 @@
 
 #include <sys/types.h>
 #include <sys/socket.h>
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
+#ifdef HAVE_NET_ROUTE_H
+#include <net/route.h>
+#endif
 
 #include <ctype.h>
 #include <netdb.h>
@@ -39,13 +45,13 @@
 #include "xmalloc.h"
 #include "ssh.h"
 #include "log.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "misc.h"
 #include "servconf.h"
 #include "compat.h"
 #include "pathnames.h"
 #include "cipher.h"
-#include "key.h"
+#include "sshkey.h"
 #include "kex.h"
 #include "mac.h"
 #include "match.h"
@@ -53,17 +59,20 @@
 #include "groupaccess.h"
 #include "canohost.h"
 #include "packet.h"
+#include "ssherr.h"
 #include "hostfile.h"
 #include "auth.h"
 #include "myproposal.h"
 #include "digest.h"
 
-static void add_listen_addr(ServerOptions *, char *, int);
-static void add_one_listen_addr(ServerOptions *, char *, int);
+static void add_listen_addr(ServerOptions *, const char *,
+    const char *, int);
+static void add_one_listen_addr(ServerOptions *, const char *,
+    const char *, int);
 
 /* Use of privilege separation or not */
 extern int use_privsep;
-extern Buffer cfg;
+extern struct sshbuf *cfg;
 
 /* Initializes the server options to their default values. */
 
@@ -81,7 +90,9 @@
 	options->queued_listen_addrs = NULL;
 	options->num_queued_listens = 0;
 	options->listen_addrs = NULL;
+	options->num_listen_addrs = 0;
 	options->address_family = -1;
+	options->routing_domain = NULL;
 	options->num_host_key_files = 0;
 	options->num_host_cert_files = 0;
 	options->host_key_agent = NULL;
@@ -120,6 +131,7 @@
 	options->challenge_response_authentication = -1;
 	options->permit_empty_passwd = -1;
 	options->permit_user_env = -1;
+	options->permit_user_env_whitelist = NULL;
 	options->compression = -1;
 	options->rekey_limit = -1;
 	options->rekey_interval = -1;
@@ -148,8 +160,10 @@
 	options->client_alive_count_max = -1;
 	options->num_authkeys_files = 0;
 	options->num_accept_env = 0;
+	options->num_setenv = 0;
 	options->permit_tun = -1;
-	options->num_permitted_opens = -1;
+	options->permitted_opens = NULL;
+	options->permitted_listens = NULL;
 	options->adm_forced_command = NULL;
 	options->chroot_directory = NULL;
 	options->authorized_keys_command = NULL;
@@ -164,6 +178,7 @@
 	options->version_addendum = NULL;
 	options->fingerprint_hash = -1;
 	options->disable_forwarding = -1;
+	options->expose_userauth_info = -1;
 }
 
 /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */
@@ -176,21 +191,70 @@
 static void
 assemble_algorithms(ServerOptions *o)
 {
-	if (kex_assemble_names(KEX_SERVER_ENCRYPT, &o->ciphers) != 0 ||
-	    kex_assemble_names(KEX_SERVER_MAC, &o->macs) != 0 ||
-	    kex_assemble_names(KEX_SERVER_KEX, &o->kex_algorithms) != 0 ||
-	    kex_assemble_names(KEX_DEFAULT_PK_ALG,
-	    &o->hostkeyalgorithms) != 0 ||
-	    kex_assemble_names(KEX_DEFAULT_PK_ALG,
-	    &o->hostbased_key_types) != 0 ||
-	    kex_assemble_names(KEX_DEFAULT_PK_ALG, &o->pubkey_key_types) != 0)
-		fatal("kex_assemble_names failed");
+	char *all_cipher, *all_mac, *all_kex, *all_key;
+	int r;
+
+	all_cipher = cipher_alg_list(',', 0);
+	all_mac = mac_alg_list(',');
+	all_kex = kex_alg_list(',');
+	all_key = sshkey_alg_list(0, 0, 1, ',');
+#define ASSEMBLE(what, defaults, all) \
+	do { \
+		if ((r = kex_assemble_names(&o->what, defaults, all)) != 0) \
+			fatal("%s: %s: %s", __func__, #what, ssh_err(r)); \
+	} while (0)
+	ASSEMBLE(ciphers, KEX_SERVER_ENCRYPT, all_cipher);
+	ASSEMBLE(macs, KEX_SERVER_MAC, all_mac);
+	ASSEMBLE(kex_algorithms, KEX_SERVER_KEX, all_kex);
+	ASSEMBLE(hostkeyalgorithms, KEX_DEFAULT_PK_ALG, all_key);
+	ASSEMBLE(hostbased_key_types, KEX_DEFAULT_PK_ALG, all_key);
+	ASSEMBLE(pubkey_key_types, KEX_DEFAULT_PK_ALG, all_key);
+#undef ASSEMBLE
+	free(all_cipher);
+	free(all_mac);
+	free(all_kex);
+	free(all_key);
+}
+
+static void
+array_append(const char *file, const int line, const char *directive,
+    char ***array, u_int *lp, const char *s)
+{
+
+	if (*lp >= INT_MAX)
+		fatal("%s line %d: Too many %s entries", file, line, directive);
+
+	*array = xrecallocarray(*array, *lp, *lp + 1, sizeof(**array));
+	(*array)[*lp] = xstrdup(s);
+	(*lp)++;
+}
+
+void
+servconf_add_hostkey(const char *file, const int line,
+    ServerOptions *options, const char *path)
+{
+	char *apath = derelativise_path(path);
+
+	array_append(file, line, "HostKey",
+	    &options->host_key_files, &options->num_host_key_files, apath);
+	free(apath);
+}
+
+void
+servconf_add_hostcert(const char *file, const int line,
+    ServerOptions *options, const char *path)
+{
+	char *apath = derelativise_path(path);
+
+	array_append(file, line, "HostCertificate",
+	    &options->host_cert_files, &options->num_host_cert_files, apath);
+	free(apath);
 }
 
 void
 fill_default_server_options(ServerOptions *options)
 {
-	int i;
+	u_int i;
 
 	/* Portable-specific options */
 	if (options->use_pam == -1)
@@ -199,16 +263,18 @@
 	/* Standard Options */
 	if (options->num_host_key_files == 0) {
 		/* fill default hostkeys for protocols */
-		options->host_key_files[options->num_host_key_files++] =
-		    _PATH_HOST_RSA_KEY_FILE;
-		options->host_key_files[options->num_host_key_files++] =
-		    _PATH_HOST_DSA_KEY_FILE;
+		servconf_add_hostkey("[default]", 0, options,
+		    _PATH_HOST_RSA_KEY_FILE);
 #ifdef OPENSSL_HAS_ECC
-		options->host_key_files[options->num_host_key_files++] =
-		    _PATH_HOST_ECDSA_KEY_FILE;
+		servconf_add_hostkey("[default]", 0, options,
+		    _PATH_HOST_ECDSA_KEY_FILE);
 #endif
-		options->host_key_files[options->num_host_key_files++] =
-		    _PATH_HOST_ED25519_KEY_FILE;
+		servconf_add_hostkey("[default]", 0, options,
+		    _PATH_HOST_ED25519_KEY_FILE);
+#ifdef WITH_XMSS
+		servconf_add_hostkey("[default]", 0, options,
+		    _PATH_HOST_XMSS_KEY_FILE);
+#endif /* WITH_XMSS */
 	}
 	/* No certificates by default */
 	if (options->num_ports == 0)
@@ -216,7 +282,7 @@
 	if (options->address_family == -1)
 		options->address_family = AF_UNSPEC;
 	if (options->listen_addrs == NULL)
-		add_listen_addr(options, NULL, 0);
+		add_listen_addr(options, NULL, NULL, 0);
 	if (options->pid_file == NULL)
 		options->pid_file = xstrdup(_PATH_SSH_DAEMON_PID_FILE);
 	if (options->login_grace_time == -1)
@@ -279,8 +345,10 @@
 		options->challenge_response_authentication = 1;
 	if (options->permit_empty_passwd == -1)
 		options->permit_empty_passwd = 0;
-	if (options->permit_user_env == -1)
+	if (options->permit_user_env == -1) {
 		options->permit_user_env = 0;
+		options->permit_user_env_whitelist = NULL;
+	}
 	if (options->compression == -1)
 		options->compression = COMP_DELAYED;
 	if (options->rekey_limit == -1)
@@ -312,17 +380,21 @@
 	if (options->client_alive_count_max == -1)
 		options->client_alive_count_max = 3;
 	if (options->num_authkeys_files == 0) {
-		options->authorized_keys_files[options->num_authkeys_files++] =
-		    xstrdup(_PATH_SSH_USER_PERMITTED_KEYS);
-		options->authorized_keys_files[options->num_authkeys_files++] =
-		    xstrdup(_PATH_SSH_USER_PERMITTED_KEYS2);
+		array_append("[default]", 0, "AuthorizedKeysFiles",
+		    &options->authorized_keys_files,
+		    &options->num_authkeys_files,
+		    _PATH_SSH_USER_PERMITTED_KEYS);
+		array_append("[default]", 0, "AuthorizedKeysFiles",
+		    &options->authorized_keys_files,
+		    &options->num_authkeys_files,
+		    _PATH_SSH_USER_PERMITTED_KEYS2);
 	}
 	if (options->permit_tun == -1)
 		options->permit_tun = SSH_TUNMODE_NO;
 	if (options->ip_qos_interactive == -1)
-		options->ip_qos_interactive = IPTOS_LOWDELAY;
+		options->ip_qos_interactive = IPTOS_DSCP_AF21;
 	if (options->ip_qos_bulk == -1)
-		options->ip_qos_bulk = IPTOS_THROUGHPUT;
+		options->ip_qos_bulk = IPTOS_DSCP_CS1;
 	if (options->version_addendum == NULL)
 		options->version_addendum = xstrdup("");
 	if (options->fwd_opts.streamlocal_bind_mask == (mode_t)-1)
@@ -333,6 +405,8 @@
 		options->fingerprint_hash = SSH_FP_HASH_DEFAULT;
 	if (options->disable_forwarding == -1)
 		options->disable_forwarding = 0;
+	if (options->expose_userauth_info == -1)
+		options->expose_userauth_info = 0;
 
 	assemble_algorithms(options);
 
@@ -355,6 +429,7 @@
 	CLEAR_ON_NONE(options->authorized_principals_file);
 	CLEAR_ON_NONE(options->adm_forced_command);
 	CLEAR_ON_NONE(options->chroot_directory);
+	CLEAR_ON_NONE(options->routing_domain);
 	for (i = 0; i < options->num_host_key_files; i++)
 		CLEAR_ON_NONE(options->host_key_files[i]);
 	for (i = 0; i < options->num_host_cert_files; i++)
@@ -390,8 +465,7 @@
 	sPermitRootLogin, sLogFacility, sLogLevel,
 	sRhostsRSAAuthentication, sRSAAuthentication,
 	sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup,
-	sKerberosGetAFSToken,
-	sKerberosTgtPassing, sChallengeResponseAuthentication,
+	sKerberosGetAFSToken, sChallengeResponseAuthentication,
 	sPasswordAuthentication, sKbdInteractiveAuthentication,
 	sListenAddress, sAddressFamily,
 	sPrintMotd, sPrintLastLog, sIgnoreRhosts,
@@ -407,8 +481,8 @@
 	sHostKeyAlgorithms,
 	sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile,
 	sGssAuthentication, sGssCleanupCreds, sGssStrictAcceptor,
-	sAcceptEnv, sPermitTunnel,
-	sMatch, sPermitOpen, sForceCommand, sChrootDirectory,
+	sAcceptEnv, sSetEnv, sPermitTunnel,
+	sMatch, sPermitOpen, sPermitListen, sForceCommand, sChrootDirectory,
 	sUsePrivilegeSeparation, sAllowAgentForwarding,
 	sHostCertificate,
 	sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile,
@@ -418,6 +492,7 @@
 	sAuthenticationMethods, sHostKeyAgent, sPermitUserRC,
 	sStreamLocalBindMask, sStreamLocalBindUnlink,
 	sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding,
+	sExposeAuthInfo, sRDomain,
 	sDeprecated, sIgnore, sUnsupported
 } ServerOpCodes;
 
@@ -449,7 +524,7 @@
 	{ "keyregenerationinterval", sDeprecated, SSHCFG_GLOBAL },
 	{ "permitrootlogin", sPermitRootLogin, SSHCFG_ALL },
 	{ "syslogfacility", sLogFacility, SSHCFG_GLOBAL },
-	{ "loglevel", sLogLevel, SSHCFG_GLOBAL },
+	{ "loglevel", sLogLevel, SSHCFG_ALL },
 	{ "rhostsauthentication", sDeprecated, SSHCFG_GLOBAL },
 	{ "rhostsrsaauthentication", sDeprecated, SSHCFG_ALL },
 	{ "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL },
@@ -489,7 +564,7 @@
 	{ "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
 	{ "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL },
 	{ "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL },
-	{ "skeyauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, /* alias */
+	{ "skeyauthentication", sDeprecated, SSHCFG_GLOBAL },
 	{ "checkmail", sDeprecated, SSHCFG_GLOBAL },
 	{ "listenaddress", sListenAddress, SSHCFG_GLOBAL },
 	{ "addressfamily", sAddressFamily, SSHCFG_GLOBAL },
@@ -535,13 +610,15 @@
 	{ "clientalivecountmax", sClientAliveCountMax, SSHCFG_ALL },
 	{ "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_ALL },
 	{ "authorizedkeysfile2", sDeprecated, SSHCFG_ALL },
-	{ "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL},
+	{ "useprivilegeseparation", sDeprecated, SSHCFG_GLOBAL},
 	{ "acceptenv", sAcceptEnv, SSHCFG_ALL },
+	{ "setenv", sSetEnv, SSHCFG_ALL },
 	{ "permittunnel", sPermitTunnel, SSHCFG_ALL },
 	{ "permittty", sPermitTTY, SSHCFG_ALL },
 	{ "permituserrc", sPermitUserRC, SSHCFG_ALL },
 	{ "match", sMatch, SSHCFG_ALL },
 	{ "permitopen", sPermitOpen, SSHCFG_ALL },
+	{ "permitlisten", sPermitListen, SSHCFG_ALL },
 	{ "forcecommand", sForceCommand, SSHCFG_ALL },
 	{ "chrootdirectory", sChrootDirectory, SSHCFG_ALL },
 	{ "hostcertificate", sHostCertificate, SSHCFG_GLOBAL },
@@ -561,6 +638,8 @@
 	{ "allowstreamlocalforwarding", sAllowStreamLocalForwarding, SSHCFG_ALL },
 	{ "fingerprinthash", sFingerprintHash, SSHCFG_GLOBAL },
 	{ "disableforwarding", sDisableForwarding, SSHCFG_ALL },
+	{ "exposeauthinfo", sExposeAuthInfo, SSHCFG_ALL },
+	{ "rdomain", sRDomain, SSHCFG_ALL },
 	{ NULL, sBadOption, 0 }
 };
 
@@ -575,6 +654,20 @@
 	{ -1, NULL }
 };
 
+/* Returns an opcode name from its number */
+
+static const char *
+lookup_opcode_name(ServerOpCodes code)
+{
+	u_int i;
+
+	for (i = 0; keywords[i].name != NULL; i++)
+		if (keywords[i].opcode == code)
+			return(keywords[i].name);
+	return "UNKNOWN";
+}
+
+
 /*
  * Returns the number of the token pointed to by cp or sBadOption.
  */
@@ -614,23 +707,51 @@
 }
 
 static void
-add_listen_addr(ServerOptions *options, char *addr, int port)
+add_listen_addr(ServerOptions *options, const char *addr,
+    const char *rdomain, int port)
 {
 	u_int i;
 
-	if (port == 0)
-		for (i = 0; i < options->num_ports; i++)
-			add_one_listen_addr(options, addr, options->ports[i]);
-	else
-		add_one_listen_addr(options, addr, port);
+	if (port > 0)
+		add_one_listen_addr(options, addr, rdomain, port);
+	else {
+		for (i = 0; i < options->num_ports; i++) {
+			add_one_listen_addr(options, addr, rdomain,
+			    options->ports[i]);
+		}
+	}
 }
 
 static void
-add_one_listen_addr(ServerOptions *options, char *addr, int port)
+add_one_listen_addr(ServerOptions *options, const char *addr,
+    const char *rdomain, int port)
 {
 	struct addrinfo hints, *ai, *aitop;
 	char strport[NI_MAXSERV];
 	int gaierr;
+	u_int i;
+
+	/* Find listen_addrs entry for this rdomain */
+	for (i = 0; i < options->num_listen_addrs; i++) {
+		if (rdomain == NULL && options->listen_addrs[i].rdomain == NULL)
+			break;
+		if (rdomain == NULL || options->listen_addrs[i].rdomain == NULL)
+			continue;
+		if (strcmp(rdomain, options->listen_addrs[i].rdomain) == 0)
+			break;
+	}
+	if (i >= options->num_listen_addrs) {
+		/* No entry for this rdomain; allocate one */
+		if (i >= INT_MAX)
+			fatal("%s: too many listen addresses", __func__);
+		options->listen_addrs = xrecallocarray(options->listen_addrs,
+		    options->num_listen_addrs, options->num_listen_addrs + 1,
+		    sizeof(*options->listen_addrs));
+		i = options->num_listen_addrs++;
+		if (rdomain != NULL)
+			options->listen_addrs[i].rdomain = xstrdup(rdomain);
+	}
+	/* options->listen_addrs[i] points to the addresses for this rdomain */
 
 	memset(&hints, 0, sizeof(hints));
 	hints.ai_family = options->address_family;
@@ -643,8 +764,44 @@
 		    ssh_gai_strerror(gaierr));
 	for (ai = aitop; ai->ai_next; ai = ai->ai_next)
 		;
-	ai->ai_next = options->listen_addrs;
-	options->listen_addrs = aitop;
+	ai->ai_next = options->listen_addrs[i].addrs;
+	options->listen_addrs[i].addrs = aitop;
+}
+
+/* Returns nonzero if the routing domain name is valid */
+static int
+valid_rdomain(const char *name)
+{
+#if defined(HAVE_SYS_VALID_RDOMAIN)
+	return sys_valid_rdomain(name);
+#elif defined(__OpenBSD__)
+	const char *errstr;
+	long long num;
+	struct rt_tableinfo info;
+	int mib[6];
+	size_t miblen = sizeof(mib);
+
+	if (name == NULL)
+		return 1;
+
+	num = strtonum(name, 0, 255, &errstr);
+	if (errstr != NULL)
+		return 0;
+
+	/* Check whether the table actually exists */
+	memset(mib, 0, sizeof(mib));
+	mib[0] = CTL_NET;
+	mib[1] = PF_ROUTE;
+	mib[4] = NET_RT_TABLE;
+	mib[5] = (int)num;
+	if (sysctl(mib, 6, &info, &miblen, NULL, 0) == -1)
+		return 0;
+
+	return 1;
+#else /* defined(__OpenBSD__) */
+	error("Routing domains are not supported on this platform");
+	return 0;
+#endif
 }
 
 /*
@@ -652,18 +809,19 @@
  * and AddressFamily options.
  */
 static void
-queue_listen_addr(ServerOptions *options, char *addr, int port)
+queue_listen_addr(ServerOptions *options, const char *addr,
+    const char *rdomain, int port)
 {
-	options->queued_listen_addrs = xreallocarray(
-	    options->queued_listen_addrs, options->num_queued_listens + 1,
-	    sizeof(addr));
-	options->queued_listen_ports = xreallocarray(
-	    options->queued_listen_ports, options->num_queued_listens + 1,
-	    sizeof(port));
-	options->queued_listen_addrs[options->num_queued_listens] =
-	    xstrdup(addr);
-	options->queued_listen_ports[options->num_queued_listens] = port;
-	options->num_queued_listens++;
+	struct queued_listenaddr *qla;
+
+	options->queued_listen_addrs = xrecallocarray(
+	    options->queued_listen_addrs,
+	    options->num_queued_listens, options->num_queued_listens + 1,
+	    sizeof(*options->queued_listen_addrs));
+	qla = &options->queued_listen_addrs[options->num_queued_listens++];
+	qla->addr = xstrdup(addr);
+	qla->port = port;
+	qla->rdomain = rdomain == NULL ? NULL : xstrdup(rdomain);
 }
 
 /*
@@ -673,6 +831,7 @@
 process_queued_listen_addrs(ServerOptions *options)
 {
 	u_int i;
+	struct queued_listenaddr *qla;
 
 	if (options->num_ports == 0)
 		options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
@@ -680,18 +839,70 @@
 		options->address_family = AF_UNSPEC;
 
 	for (i = 0; i < options->num_queued_listens; i++) {
-		add_listen_addr(options, options->queued_listen_addrs[i],
-		    options->queued_listen_ports[i]);
-		free(options->queued_listen_addrs[i]);
-		options->queued_listen_addrs[i] = NULL;
+		qla = &options->queued_listen_addrs[i];
+		add_listen_addr(options, qla->addr, qla->rdomain, qla->port);
+		free(qla->addr);
+		free(qla->rdomain);
 	}
 	free(options->queued_listen_addrs);
 	options->queued_listen_addrs = NULL;
-	free(options->queued_listen_ports);
-	options->queued_listen_ports = NULL;
 	options->num_queued_listens = 0;
 }
 
+/*
+ * Inform channels layer of permitopen options for a single forwarding
+ * direction (local/remote).
+ */
+static void
+process_permitopen_list(struct ssh *ssh, ServerOpCodes opcode,
+    char **opens, u_int num_opens)
+{
+	u_int i;
+	int port;
+	char *host, *arg, *oarg;
+	int where = opcode == sPermitOpen ? FORWARD_LOCAL : FORWARD_REMOTE;
+	const char *what = lookup_opcode_name(opcode);
+
+	channel_clear_permission(ssh, FORWARD_ADM, where);
+	if (num_opens == 0)
+		return; /* permit any */
+
+	/* handle keywords: "any" / "none" */
+	if (num_opens == 1 && strcmp(opens[0], "any") == 0)
+		return;
+	if (num_opens == 1 && strcmp(opens[0], "none") == 0) {
+		channel_disable_admin(ssh, where);
+		return;
+	}
+	/* Otherwise treat it as a list of permitted host:port */
+	for (i = 0; i < num_opens; i++) {
+		oarg = arg = xstrdup(opens[i]);
+		host = hpdelim(&arg);
+		if (host == NULL)
+			fatal("%s: missing host in %s", __func__, what);
+		host = cleanhostname(host);
+		if (arg == NULL || ((port = permitopen_port(arg)) < 0))
+			fatal("%s: bad port number in %s", __func__, what);
+		/* Send it to channels layer */
+		channel_add_permission(ssh, FORWARD_ADM,
+		    where, host, port);
+		free(oarg);
+	}
+}
+
+/*
+ * Inform channels layer of permitopen options from configuration.
+ */
+void
+process_permitopen(struct ssh *ssh, ServerOptions *options)
+{
+	process_permitopen_list(ssh, sPermitOpen,
+	    options->permitted_opens, options->num_permitted_opens);
+	process_permitopen_list(ssh, sPermitListen,
+	    options->permitted_listens,
+	    options->num_permitted_listens);
+}
+
 struct connection_info *
 get_connection_info(int populate, int use_dns)
 {
@@ -704,6 +915,7 @@
 	ci.address = ssh_remote_ipaddr(ssh);
 	ci.laddress = ssh_local_ipaddr(ssh);
 	ci.lport = ssh_local_port(ssh);
+	ci.rdomain = ssh_packet_rdomain_in(ssh);
 	return &ci;
 }
 
@@ -768,6 +980,13 @@
 	return result;
 }
 
+static void
+match_test_missing_fatal(const char *criteria, const char *attrib)
+{
+	fatal("'Match %s' in configuration but '%s' not in connection "
+	    "test specification.", criteria, attrib);
+}
+
 /*
  * All of the attributes on a single Match line are ANDed together, so we need
  * to check every attribute and set the result to zero if any attribute does
@@ -805,20 +1024,24 @@
 			return -1;
 		}
 		if (strcasecmp(attrib, "user") == 0) {
-			if (ci == NULL || ci->user == NULL) {
+			if (ci == NULL) {
 				result = 0;
 				continue;
 			}
+			if (ci->user == NULL)
+				match_test_missing_fatal("User", "user");
 			if (match_pattern_list(ci->user, arg, 0) != 1)
 				result = 0;
 			else
 				debug("user %.100s matched 'User %.100s' at "
 				    "line %d", ci->user, arg, line);
 		} else if (strcasecmp(attrib, "group") == 0) {
-			if (ci == NULL || ci->user == NULL) {
+			if (ci == NULL) {
 				result = 0;
 				continue;
 			}
+			if (ci->user == NULL)
+				match_test_missing_fatal("Group", "user");
 			switch (match_cfg_line_group(arg, line, ci->user)) {
 			case -1:
 				return -1;
@@ -826,20 +1049,24 @@
 				result = 0;
 			}
 		} else if (strcasecmp(attrib, "host") == 0) {
-			if (ci == NULL || ci->host == NULL) {
+			if (ci == NULL) {
 				result = 0;
 				continue;
 			}
+			if (ci->host == NULL)
+				match_test_missing_fatal("Host", "host");
 			if (match_hostname(ci->host, arg) != 1)
 				result = 0;
 			else
 				debug("connection from %.100s matched 'Host "
 				    "%.100s' at line %d", ci->host, arg, line);
 		} else if (strcasecmp(attrib, "address") == 0) {
-			if (ci == NULL || ci->address == NULL) {
+			if (ci == NULL) {
 				result = 0;
 				continue;
 			}
+			if (ci->address == NULL)
+				match_test_missing_fatal("Address", "addr");
 			switch (addr_match_list(ci->address, arg)) {
 			case 1:
 				debug("connection from %.100s matched 'Address "
@@ -853,10 +1080,13 @@
 				return -1;
 			}
 		} else if (strcasecmp(attrib, "localaddress") == 0){
-			if (ci == NULL || ci->laddress == NULL) {
+			if (ci == NULL) {
 				result = 0;
 				continue;
 			}
+			if (ci->laddress == NULL)
+				match_test_missing_fatal("LocalAddress",
+				    "laddr");
 			switch (addr_match_list(ci->laddress, arg)) {
 			case 1:
 				debug("connection from %.100s matched "
@@ -876,10 +1106,12 @@
 				    arg);
 				return -1;
 			}
-			if (ci == NULL || ci->lport == 0) {
+			if (ci == NULL) {
 				result = 0;
 				continue;
 			}
+			if (ci->lport == 0)
+				match_test_missing_fatal("LocalPort", "lport");
 			/* TODO support port lists */
 			if (port == ci->lport)
 				debug("connection from %.100s matched "
@@ -887,6 +1119,16 @@
 				    ci->laddress, port, line);
 			else
 				result = 0;
+		} else if (strcasecmp(attrib, "rdomain") == 0) {
+			if (ci == NULL || ci->rdomain == NULL) {
+				result = 0;
+				continue;
+			}
+			if (match_pattern_list(ci->rdomain, arg, 0) != 1)
+				result = 0;
+			else
+				debug("user %.100s matched 'RDomain %.100s' at "
+				    "line %d", ci->rdomain, arg, line);
 		} else {
 			error("Unsupported Match attribute %s", attrib);
 			return -1;
@@ -909,6 +1151,11 @@
 	char *key;
 	int value;
 };
+static const struct multistate multistate_flag[] = {
+	{ "yes",			1 },
+	{ "no",				0 },
+	{ NULL, -1 }
+};
 static const struct multistate multistate_addressfamily[] = {
 	{ "inet",			AF_INET },
 	{ "inet6",			AF_INET6 },
@@ -935,13 +1182,6 @@
 	{ "no",				0 },
 	{ NULL, -1 }
 };
-static const struct multistate multistate_privsep[] = {
-	{ "yes",			PRIVSEP_NOSANDBOX },
-	{ "sandbox",			PRIVSEP_ON },
-	{ "nosandbox",			PRIVSEP_NOSANDBOX },
-	{ "no",				PRIVSEP_OFF },
-	{ NULL, -1 }
-};
 static const struct multistate multistate_tcpfwd[] = {
 	{ "yes",			FORWARD_ALLOW },
 	{ "all",			FORWARD_ALLOW },
@@ -956,15 +1196,16 @@
     const char *filename, int linenum, int *activep,
     struct connection_info *connectinfo)
 {
-	char *cp, **charptr, *arg, *p;
+	char *cp, ***chararrayptr, **charptr, *arg, *arg2, *p;
 	int cmdline = 0, *intptr, value, value2, n, port;
 	SyslogFacility *log_facility_ptr;
 	LogLevel *log_level_ptr;
 	ServerOpCodes opcode;
-	u_int i, flags = 0;
+	u_int i, *uintptr, uvalue, flags = 0;
 	size_t len;
 	long long val64;
 	const struct multistate *multistate_ptr;
+	const char *errstr;
 
 	/* Strip trailing whitespace. Allow \f (form feed) at EOL only */
 	if ((len = strlen(line)) == 0)
@@ -1052,20 +1293,33 @@
 		/* check for bare IPv6 address: no "[]" and 2 or more ":" */
 		if (strchr(arg, '[') == NULL && (p = strchr(arg, ':')) != NULL
 		    && strchr(p+1, ':') != NULL) {
-			queue_listen_addr(options, arg, 0);
-			break;
-		}
-		p = hpdelim(&arg);
-		if (p == NULL)
-			fatal("%s line %d: bad address:port usage",
-			    filename, linenum);
-		p = cleanhostname(p);
-		if (arg == NULL)
 			port = 0;
-		else if ((port = a2port(arg)) <= 0)
-			fatal("%s line %d: bad port number", filename, linenum);
+			p = arg;
+		} else {
+			p = hpdelim(&arg);
+			if (p == NULL)
+				fatal("%s line %d: bad address:port usage",
+				    filename, linenum);
+			p = cleanhostname(p);
+			if (arg == NULL)
+				port = 0;
+			else if ((port = a2port(arg)) <= 0)
+				fatal("%s line %d: bad port number",
+				    filename, linenum);
+		}
+		/* Optional routing table */
+		arg2 = NULL;
+		if ((arg = strdelim(&cp)) != NULL) {
+			if (strcmp(arg, "rdomain") != 0 ||
+			    (arg2 = strdelim(&cp)) == NULL)
+				fatal("%s line %d: bad ListenAddress syntax",
+				    filename, linenum);
+			if (!valid_rdomain(arg2))
+				fatal("%s line %d: bad routing domain",
+				    filename, linenum);
+		}
 
-		queue_listen_addr(options, p, port);
+		queue_listen_addr(options, p, arg2, port);
 
 		break;
 
@@ -1092,22 +1346,12 @@
 		break;
 
 	case sHostKeyFile:
-		intptr = &options->num_host_key_files;
-		if (*intptr >= MAX_HOSTKEYS)
-			fatal("%s line %d: too many host keys specified (max %d).",
-			    filename, linenum, MAX_HOSTKEYS);
-		charptr = &options->host_key_files[*intptr];
- parse_filename:
 		arg = strdelim(&cp);
 		if (!arg || *arg == '\0')
 			fatal("%s line %d: missing file name.",
 			    filename, linenum);
-		if (*activep && *charptr == NULL) {
-			*charptr = derelativise_path(arg);
-			/* increase optional counter */
-			if (intptr != NULL)
-				*intptr = *intptr + 1;
-		}
+		if (*activep)
+			servconf_add_hostkey(filename, linenum, options, arg);
 		break;
 
 	case sHostKeyAgent:
@@ -1122,17 +1366,28 @@
 		break;
 
 	case sHostCertificate:
-		intptr = &options->num_host_cert_files;
-		if (*intptr >= MAX_HOSTKEYS)
-			fatal("%s line %d: too many host certificates "
-			    "specified (max %d).", filename, linenum,
-			    MAX_HOSTCERTS);
-		charptr = &options->host_cert_files[*intptr];
-		goto parse_filename;
+		arg = strdelim(&cp);
+		if (!arg || *arg == '\0')
+			fatal("%s line %d: missing file name.",
+			    filename, linenum);
+		if (*activep)
+			servconf_add_hostcert(filename, linenum, options, arg);
+		break;
 
 	case sPidFile:
 		charptr = &options->pid_file;
-		goto parse_filename;
+ parse_filename:
+		arg = strdelim(&cp);
+		if (!arg || *arg == '\0')
+			fatal("%s line %d: missing file name.",
+			    filename, linenum);
+		if (*activep && *charptr == NULL) {
+			*charptr = derelativise_path(arg);
+			/* increase optional counter */
+			if (intptr != NULL)
+				*intptr = *intptr + 1;
+		}
+		break;
 
 	case sPermitRootLogin:
 		intptr = &options->permit_root_login;
@@ -1142,21 +1397,8 @@
 	case sIgnoreRhosts:
 		intptr = &options->ignore_rhosts;
  parse_flag:
-		arg = strdelim(&cp);
-		if (!arg || *arg == '\0')
-			fatal("%s line %d: missing yes/no argument.",
-			    filename, linenum);
-		value = 0;	/* silence compiler */
-		if (strcmp(arg, "yes") == 0)
-			value = 1;
-		else if (strcmp(arg, "no") == 0)
-			value = 0;
-		else
-			fatal("%s line %d: Bad yes/no argument: %s",
-				filename, linenum, arg);
-		if (*activep && *intptr == -1)
-			*intptr = value;
-		break;
+		multistate_ptr = multistate_flag;
+		goto parse_multistate;
 
 	case sIgnoreUserKnownHosts:
 		intptr = &options->ignore_user_known_hosts;
@@ -1253,10 +1495,9 @@
 		intptr = &options->x11_display_offset;
  parse_int:
 		arg = strdelim(&cp);
-		if (!arg || *arg == '\0')
-			fatal("%s line %d: missing integer value.",
-			    filename, linenum);
-		value = atoi(arg);
+		if ((errstr = atoi_err(arg, &value)) != NULL)
+			fatal("%s line %d: integer value %s.",
+			    filename, linenum, errstr);
 		if (*activep && *intptr == -1)
 			*intptr = value;
 		break;
@@ -1291,7 +1532,29 @@
 
 	case sPermitUserEnvironment:
 		intptr = &options->permit_user_env;
-		goto parse_flag;
+		charptr = &options->permit_user_env_whitelist;
+		arg = strdelim(&cp);
+		if (!arg || *arg == '\0')
+			fatal("%s line %d: missing argument.",
+			    filename, linenum);
+		value = 0;
+		p = NULL;
+		if (strcmp(arg, "yes") == 0)
+			value = 1;
+		else if (strcmp(arg, "no") == 0)
+			value = 0;
+		else {
+			/* Pattern-list specified */
+			value = 1;
+			p = xstrdup(arg);
+		}
+		if (*activep && *intptr == -1) {
+			*intptr = value;
+			*charptr = p;
+			p = NULL;
+		}
+		free(p);
+		break;
 
 	case sCompression:
 		intptr = &options->compression;
@@ -1352,7 +1615,7 @@
 		if (value == SYSLOG_LEVEL_NOT_SET)
 			fatal("%.200s line %d: unsupported log level '%s'",
 			    filename, linenum, arg ? arg : "<NONE>");
-		if (*log_level_ptr == -1)
+		if (*activep && *log_level_ptr == -1)
 			*log_level_ptr = (LogLevel) value;
 		break;
 
@@ -1374,62 +1637,49 @@
 		intptr = &options->disable_forwarding;
 		goto parse_flag;
 
-	case sUsePrivilegeSeparation:
-		intptr = &use_privsep;
-		multistate_ptr = multistate_privsep;
-		goto parse_multistate;
-
 	case sAllowUsers:
 		while ((arg = strdelim(&cp)) && *arg != '\0') {
-			if (options->num_allow_users >= MAX_ALLOW_USERS)
-				fatal("%s line %d: too many allow users.",
-				    filename, linenum);
 			if (match_user(NULL, NULL, NULL, arg) == -1)
 				fatal("%s line %d: invalid AllowUsers pattern: "
 				    "\"%.100s\"", filename, linenum, arg);
 			if (!*activep)
 				continue;
-			options->allow_users[options->num_allow_users++] =
-			    xstrdup(arg);
+			array_append(filename, linenum, "AllowUsers",
+			    &options->allow_users, &options->num_allow_users,
+			    arg);
 		}
 		break;
 
 	case sDenyUsers:
 		while ((arg = strdelim(&cp)) && *arg != '\0') {
-			if (options->num_deny_users >= MAX_DENY_USERS)
-				fatal("%s line %d: too many deny users.",
-				    filename, linenum);
 			if (match_user(NULL, NULL, NULL, arg) == -1)
 				fatal("%s line %d: invalid DenyUsers pattern: "
 				    "\"%.100s\"", filename, linenum, arg);
 			if (!*activep)
 				continue;
-			options->deny_users[options->num_deny_users++] =
-			    xstrdup(arg);
+			array_append(filename, linenum, "DenyUsers",
+			    &options->deny_users, &options->num_deny_users,
+			    arg);
 		}
 		break;
 
 	case sAllowGroups:
 		while ((arg = strdelim(&cp)) && *arg != '\0') {
-			if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
-				fatal("%s line %d: too many allow groups.",
-				    filename, linenum);
 			if (!*activep)
 				continue;
-			options->allow_groups[options->num_allow_groups++] =
-			    xstrdup(arg);
+			array_append(filename, linenum, "AllowGroups",
+			    &options->allow_groups, &options->num_allow_groups,
+			    arg);
 		}
 		break;
 
 	case sDenyGroups:
 		while ((arg = strdelim(&cp)) && *arg != '\0') {
-			if (options->num_deny_groups >= MAX_DENY_GROUPS)
-				fatal("%s line %d: too many deny groups.",
-				    filename, linenum);
 			if (!*activep)
 				continue;
-			options->deny_groups[options->num_deny_groups++] =
-			    xstrdup(arg);
+			array_append(filename, linenum, "DenyGroups",
+			    &options->deny_groups, &options->num_deny_groups,
+			    arg);
 		}
 		break;
 
@@ -1548,14 +1798,12 @@
 	case sAuthorizedKeysFile:
 		if (*activep && options->num_authkeys_files == 0) {
 			while ((arg = strdelim(&cp)) && *arg != '\0') {
-				if (options->num_authkeys_files >=
-				    MAX_AUTHKEYS_FILES)
-					fatal("%s line %d: "
-					    "too many authorized keys files.",
-					    filename, linenum);
-				options->authorized_keys_files[
-				    options->num_authkeys_files++] =
-				    tilde_expand_filename(arg, getuid());
+				arg = tilde_expand_filename(arg, getuid());
+				array_append(filename, linenum,
+				    "AuthorizedKeysFile",
+				    &options->authorized_keys_files,
+				    &options->num_authkeys_files, arg);
+				free(arg);
 			}
 		}
 		return 0;
@@ -1587,13 +1835,24 @@
 			if (strchr(arg, '=') != NULL)
 				fatal("%s line %d: Invalid environment name.",
 				    filename, linenum);
-			if (options->num_accept_env >= MAX_ACCEPT_ENV)
-				fatal("%s line %d: too many allow env.",
-				    filename, linenum);
 			if (!*activep)
 				continue;
-			options->accept_env[options->num_accept_env++] =
-			    xstrdup(arg);
+			array_append(filename, linenum, "AcceptEnv",
+			    &options->accept_env, &options->num_accept_env,
+			    arg);
+		}
+		break;
+
+	case sSetEnv:
+		uvalue = options->num_setenv;
+		while ((arg = strdelimw(&cp)) && *arg != '\0') {
+			if (strchr(arg, '=') == NULL)
+				fatal("%s line %d: Invalid environment.",
+				    filename, linenum);
+			if (!*activep || uvalue != 0)
+				continue;
+			array_append(filename, linenum, "SetEnv",
+			    &options->setenv, &options->num_setenv, arg);
 		}
 		break;
 
@@ -1627,40 +1886,59 @@
 		*activep = value;
 		break;
 
+	case sPermitListen:
 	case sPermitOpen:
+		if (opcode == sPermitListen) {
+			uintptr = &options->num_permitted_listens;
+			chararrayptr = &options->permitted_listens;
+		} else {
+			uintptr = &options->num_permitted_opens;
+			chararrayptr = &options->permitted_opens;
+		}
 		arg = strdelim(&cp);
 		if (!arg || *arg == '\0')
-			fatal("%s line %d: missing PermitOpen specification",
-			    filename, linenum);
-		n = options->num_permitted_opens;	/* modified later */
-		if (strcmp(arg, "any") == 0) {
-			if (*activep && n == -1) {
-				channel_clear_adm_permitted_opens();
-				options->num_permitted_opens = 0;
+			fatal("%s line %d: missing %s specification",
+			    filename, linenum, lookup_opcode_name(opcode));
+		uvalue = *uintptr;	/* modified later */
+		if (strcmp(arg, "any") == 0 || strcmp(arg, "none") == 0) {
+			if (*activep && uvalue == 0) {
+				*uintptr = 1;
+				*chararrayptr = xcalloc(1,
+				    sizeof(**chararrayptr));
+				(*chararrayptr)[0] = xstrdup(arg);
 			}
 			break;
 		}
-		if (strcmp(arg, "none") == 0) {
-			if (*activep && n == -1) {
-				options->num_permitted_opens = 1;
-				channel_disable_adm_local_opens();
-			}
-			break;
-		}
-		if (*activep && n == -1)
-			channel_clear_adm_permitted_opens();
 		for (; arg != NULL && *arg != '\0'; arg = strdelim(&cp)) {
-			p = hpdelim(&arg);
-			if (p == NULL)
-				fatal("%s line %d: missing host in PermitOpen",
-				    filename, linenum);
-			p = cleanhostname(p);
-			if (arg == NULL || ((port = permitopen_port(arg)) < 0))
-				fatal("%s line %d: bad port number in "
-				    "PermitOpen", filename, linenum);
-			if (*activep && n == -1)
-				options->num_permitted_opens =
-				    channel_add_adm_permitted_opens(p, port);
+			if (opcode == sPermitListen &&
+			    strchr(arg, ':') == NULL) {
+				/*
+				 * Allow bare port number for PermitListen
+				 * to indicate a wildcard listen host.
+				 */
+				xasprintf(&arg2, "*:%s", arg);
+			} else {
+				arg2 = xstrdup(arg);
+				p = hpdelim(&arg);
+				if (p == NULL) {
+					fatal("%s line %d: missing host in %s",
+					    filename, linenum,
+					    lookup_opcode_name(opcode));
+				}
+				p = cleanhostname(p);
+			}
+			if (arg == NULL ||
+			    ((port = permitopen_port(arg)) < 0)) {
+				fatal("%s line %d: bad port number in %s",
+				    filename, linenum,
+				    lookup_opcode_name(opcode));
+			}
+			if (*activep && uvalue == 0) {
+				array_append(filename, linenum,
+				    lookup_opcode_name(opcode),
+				    chararrayptr, uintptr, arg2);
+			}
+			free(arg2);
 		}
 		break;
 
@@ -1781,13 +2059,8 @@
 	case sAuthenticationMethods:
 		if (options->num_auth_methods == 0) {
 			value = 0; /* seen "any" pseudo-method */
-			value2 = 0; /* sucessfully parsed any method */
+			value2 = 0; /* successfully parsed any method */
 			while ((arg = strdelim(&cp)) && *arg != '\0') {
-				if (options->num_auth_methods >=
-				    MAX_AUTH_METHODS)
-					fatal("%s line %d: "
-					    "too many authentication methods.",
-					    filename, linenum);
 				if (strcmp(arg, "any") == 0) {
 					if (options->num_auth_methods > 0) {
 						fatal("%s line %d: \"any\" "
@@ -1808,8 +2081,10 @@
 				value2 = 1;
 				if (!*activep)
 					continue;
-				options->auth_methods[
-				    options->num_auth_methods++] = xstrdup(arg);
+				array_append(filename, linenum,
+				    "AuthenticationMethods",
+				    &options->auth_methods,
+				    &options->num_auth_methods, arg);
 			}
 			if (value2 == 0) {
 				fatal("%s line %d: no AuthenticationMethods "
@@ -1847,6 +2122,24 @@
 			options->fingerprint_hash = value;
 		break;
 
+	case sExposeAuthInfo:
+		intptr = &options->expose_userauth_info;
+		goto parse_flag;
+
+	case sRDomain:
+		charptr = &options->routing_domain;
+		arg = strdelim(&cp);
+		if (!arg || *arg == '\0')
+			fatal("%.200s line %d: Missing argument.",
+			    filename, linenum);
+		if (strcasecmp(arg, "none") != 0 && strcmp(arg, "%D") != 0 &&
+		    !valid_rdomain(arg))
+			fatal("%s line %d: bad routing domain",
+			    filename, linenum);
+		if (*activep && *charptr == NULL)
+			*charptr = xstrdup(arg);
+		break;
+
 	case sDeprecated:
 	case sIgnore:
 	case sUnsupported:
@@ -1871,22 +2164,21 @@
 /* Reads the server configuration file. */
 
 void
-load_server_config(const char *filename, Buffer *conf)
+load_server_config(const char *filename, struct sshbuf *conf)
 {
-	char line[4096], *cp;
+	char *line = NULL, *cp;
+	size_t linesize = 0;
 	FILE *f;
-	int lineno = 0;
+	int r, lineno = 0;
 
 	debug2("%s: filename %s", __func__, filename);
 	if ((f = fopen(filename, "r")) == NULL) {
 		perror(filename);
 		exit(1);
 	}
-	buffer_clear(conf);
-	while (fgets(line, sizeof(line), f)) {
+	sshbuf_reset(conf);
+	while (getline(&line, &linesize, f) != -1) {
 		lineno++;
-		if (strlen(line) == sizeof(line) - 1)
-			fatal("%s line %d too long", filename, lineno);
 		/*
 		 * Trim out comments and strip whitespace
 		 * NB - preserve newlines, they are needed to reproduce
@@ -1895,12 +2187,14 @@
 		if ((cp = strchr(line, '#')) != NULL)
 			memcpy(cp, "\n", 2);
 		cp = line + strspn(line, " \t\r");
-
-		buffer_append(conf, cp, strlen(cp));
+		if ((r = sshbuf_put(conf, cp, strlen(cp))) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
-	buffer_append(conf, "\0", 1);
+	free(line);
+	if ((r = sshbuf_put_u8(conf, 0)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	fclose(f);
-	debug2("%s: done config len = %d", __func__, buffer_len(conf));
+	debug2("%s: done config len = %zu", __func__, sshbuf_len(conf));
 }
 
 void
@@ -1910,7 +2204,7 @@
 	ServerOptions mo;
 
 	initialize_server_options(&mo);
-	parse_server_config(&mo, "reprocess config", &cfg, connectinfo);
+	parse_server_config(&mo, "reprocess config", cfg, connectinfo);
 	copy_set_server_options(options, &mo, 0);
 }
 
@@ -1927,6 +2221,8 @@
 			ci->user = xstrdup(p + 5);
 		} else if (strncmp(p, "laddr=", 6) == 0) {
 			ci->laddress = xstrdup(p + 6);
+		} else if (strncmp(p, "rdomain=", 8) == 0) {
+			ci->rdomain = xstrdup(p + 8);
 		} else if (strncmp(p, "lport=", 6) == 0) {
 			ci->lport = a2port(p + 6);
 			if (ci->lport == -1) {
@@ -1944,24 +2240,11 @@
 }
 
 /*
- * returns 1 for a complete spec, 0 for partial spec and -1 for an
- * empty spec.
- */
-int server_match_spec_complete(struct connection_info *ci)
-{
-	if (ci->user && ci->host && ci->address)
-		return 1;	/* complete */
-	if (!ci->user && !ci->host && !ci->address)
-		return -1;	/* empty */
-	return 0;	/* partial */
-}
-
-/*
  * Copy any supported values that are set.
  *
  * If the preauth flag is set, we do not bother copying the string or
  * array values that are not used pre-authentication, because any that we
- * do use must be explictly sent in mm_getpwnamallow().
+ * do use must be explicitly sent in mm_getpwnamallow().
  */
 void
 copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
@@ -1985,6 +2268,7 @@
 	M_CP_INTOPT(allow_streamlocal_forwarding);
 	M_CP_INTOPT(allow_agent_forwarding);
 	M_CP_INTOPT(disable_forwarding);
+	M_CP_INTOPT(expose_userauth_info);
 	M_CP_INTOPT(permit_tun);
 	M_CP_INTOPT(fwd_opts.gateway_ports);
 	M_CP_INTOPT(fwd_opts.streamlocal_bind_unlink);
@@ -2001,6 +2285,7 @@
 	M_CP_INTOPT(ip_qos_bulk);
 	M_CP_INTOPT(rekey_limit);
 	M_CP_INTOPT(rekey_interval);
+	M_CP_INTOPT(log_level);
 
 	/*
 	 * The bind_mask is a mode_t that may be unsigned, so we can't use
@@ -2019,10 +2304,16 @@
 		dst->n = src->n; \
 	} \
 } while(0)
-#define M_CP_STRARRAYOPT(n, num_n) do {\
-	if (src->num_n != 0) { \
-		for (dst->num_n = 0; dst->num_n < src->num_n; dst->num_n++) \
-			dst->n[dst->num_n] = xstrdup(src->n[dst->num_n]); \
+#define M_CP_STRARRAYOPT(s, num_s) do {\
+	u_int i; \
+	if (src->num_s != 0) { \
+		for (i = 0; i < dst->num_s; i++) \
+			free(dst->s[i]); \
+		free(dst->s); \
+		dst->s = xcalloc(src->num_s, sizeof(*dst->s)); \
+		for (i = 0; i < src->num_s; i++) \
+			dst->s[i] = xstrdup(src->s[i]); \
+		dst->num_s = src->num_s; \
 	} \
 } while(0)
 
@@ -2057,13 +2348,13 @@
 #undef M_CP_STRARRAYOPT
 
 void
-parse_server_config(ServerOptions *options, const char *filename, Buffer *conf,
-    struct connection_info *connectinfo)
+parse_server_config(ServerOptions *options, const char *filename,
+    struct sshbuf *conf, struct connection_info *connectinfo)
 {
 	int active, linenum, bad_options = 0;
 	char *cp, *obuf, *cbuf;
 
-	debug2("%s: config %s len %d", __func__, filename, buffer_len(conf));
+	debug2("%s: config %s len %zu", __func__, filename, sshbuf_len(conf));
 
 	if ((obuf = cbuf = sshbuf_dup_string(conf)) == NULL)
 		fatal("%s: sshbuf_dup_string failed", __func__);
@@ -2107,8 +2398,6 @@
 		return fmt_multistate_int(val, multistate_gatewayports);
 	case sCompression:
 		return fmt_multistate_int(val, multistate_compression);
-	case sUsePrivilegeSeparation:
-		return fmt_multistate_int(val, multistate_privsep);
 	case sAllowTcpForwarding:
 		return fmt_multistate_int(val, multistate_tcpfwd);
 	case sAllowStreamLocalForwarding:
@@ -2127,17 +2416,6 @@
 	}
 }
 
-static const char *
-lookup_opcode_name(ServerOpCodes code)
-{
-	u_int i;
-
-	for (i = 0; keywords[i].name != NULL; i++)
-		if (keywords[i].opcode == code)
-			return(keywords[i].name);
-	return "UNKNOWN";
-}
-
 static void
 dump_cfg_int(ServerOpCodes code, int val)
 {
@@ -2159,8 +2437,6 @@
 static void
 dump_cfg_string(ServerOpCodes code, const char *val)
 {
-	if (val == NULL)
-		return;
 	printf("%s %s\n", lookup_opcode_name(code),
 	    val == NULL ? "none" : val);
 }
@@ -2189,45 +2465,61 @@
 	printf("\n");
 }
 
-void
-dump_config(ServerOptions *o)
+static char *
+format_listen_addrs(struct listenaddr *la)
 {
-	u_int i;
-	int ret;
+	int r;
 	struct addrinfo *ai;
-	char addr[NI_MAXHOST], port[NI_MAXSERV], *s = NULL;
+	char addr[NI_MAXHOST], port[NI_MAXSERV];
 	char *laddr1 = xstrdup(""), *laddr2 = NULL;
 
-	/* these are usually at the top of the config */
-	for (i = 0; i < o->num_ports; i++)
-		printf("port %d\n", o->ports[i]);
-	dump_cfg_fmtint(sAddressFamily, o->address_family);
-
 	/*
 	 * ListenAddress must be after Port.  add_one_listen_addr pushes
 	 * addresses onto a stack, so to maintain ordering we need to
 	 * print these in reverse order.
 	 */
-	for (ai = o->listen_addrs; ai; ai = ai->ai_next) {
-		if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen, addr,
+	for (ai = la->addrs; ai; ai = ai->ai_next) {
+		if ((r = getnameinfo(ai->ai_addr, ai->ai_addrlen, addr,
 		    sizeof(addr), port, sizeof(port),
 		    NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
-			error("getnameinfo failed: %.100s",
-			    (ret != EAI_SYSTEM) ? gai_strerror(ret) :
-			    strerror(errno));
-		} else {
-			laddr2 = laddr1;
-			if (ai->ai_family == AF_INET6)
-				xasprintf(&laddr1, "listenaddress [%s]:%s\n%s",
-				    addr, port, laddr2);
-			else
-				xasprintf(&laddr1, "listenaddress %s:%s\n%s",
-				    addr, port, laddr2);
-			free(laddr2);
+			error("getnameinfo: %.100s", ssh_gai_strerror(r));
+			continue;
 		}
+		laddr2 = laddr1;
+		if (ai->ai_family == AF_INET6) {
+			xasprintf(&laddr1, "listenaddress [%s]:%s%s%s\n%s",
+			    addr, port,
+			    la->rdomain == NULL ? "" : " rdomain ",
+			    la->rdomain == NULL ? "" : la->rdomain,
+			    laddr2);
+		} else {
+			xasprintf(&laddr1, "listenaddress %s:%s%s%s\n%s",
+			    addr, port,
+			    la->rdomain == NULL ? "" : " rdomain ",
+			    la->rdomain == NULL ? "" : la->rdomain,
+			    laddr2);
+		}
+		free(laddr2);
 	}
-	printf("%s", laddr1);
-	free(laddr1);
+	return laddr1;
+}
+
+void
+dump_config(ServerOptions *o)
+{
+	char *s;
+	u_int i;
+
+	/* these are usually at the top of the config */
+	for (i = 0; i < o->num_ports; i++)
+		printf("port %d\n", o->ports[i]);
+	dump_cfg_fmtint(sAddressFamily, o->address_family);
+
+	for (i = 0; i < o->num_listen_addrs; i++) {
+		s = format_listen_addrs(&o->listen_addrs[i]);
+		printf("%s", s);
+		free(s);
+	}
 
 	/* integer arguments */
 #ifdef USE_PAM
@@ -2277,7 +2569,6 @@
 	dump_cfg_fmtint(sStrictModes, o->strict_modes);
 	dump_cfg_fmtint(sTCPKeepAlive, o->tcp_keep_alive);
 	dump_cfg_fmtint(sEmptyPasswd, o->permit_empty_passwd);
-	dump_cfg_fmtint(sPermitUserEnvironment, o->permit_user_env);
 	dump_cfg_fmtint(sCompression, o->compression);
 	dump_cfg_fmtint(sGatewayPorts, o->fwd_opts.gateway_ports);
 	dump_cfg_fmtint(sUseDNS, o->use_dns);
@@ -2286,8 +2577,8 @@
 	dump_cfg_fmtint(sDisableForwarding, o->disable_forwarding);
 	dump_cfg_fmtint(sAllowStreamLocalForwarding, o->allow_streamlocal_forwarding);
 	dump_cfg_fmtint(sStreamLocalBindUnlink, o->fwd_opts.streamlocal_bind_unlink);
-	dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep);
 	dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash);
+	dump_cfg_fmtint(sExposeAuthInfo, o->expose_userauth_info);
 
 	/* string arguments */
 	dump_cfg_string(sPidFile, o->pid_file);
@@ -2316,6 +2607,7 @@
 	    o->hostkeyalgorithms : KEX_DEFAULT_PK_ALG);
 	dump_cfg_string(sPubkeyAcceptedKeyTypes, o->pubkey_key_types ?
 	    o->pubkey_key_types : KEX_DEFAULT_PK_ALG);
+	dump_cfg_string(sRDomain, o->routing_domain);
 
 	/* string arguments requiring a lookup */
 	dump_cfg_string(sLogLevel, log_level_name(o->log_level));
@@ -2333,6 +2625,7 @@
 	dump_cfg_strarray(sAllowGroups, o->num_allow_groups, o->allow_groups);
 	dump_cfg_strarray(sDenyGroups, o->num_deny_groups, o->deny_groups);
 	dump_cfg_strarray(sAcceptEnv, o->num_accept_env, o->accept_env);
+	dump_cfg_strarray(sSetEnv, o->num_setenv, o->setenv);
 	dump_cfg_strarray_oneline(sAuthenticationMethods,
 	    o->num_auth_methods, o->auth_methods);
 
@@ -2344,11 +2637,13 @@
 	printf("maxstartups %d:%d:%d\n", o->max_startups_begin,
 	    o->max_startups_rate, o->max_startups);
 
-	for (i = 0; tunmode_desc[i].val != -1; i++)
+	s = NULL;
+	for (i = 0; tunmode_desc[i].val != -1; i++) {
 		if (tunmode_desc[i].val == o->permit_tun) {
 			s = tunmode_desc[i].text;
 			break;
 		}
+	}
 	dump_cfg_string(sPermitTunnel, s);
 
 	printf("ipqos %s ", iptos2str(o->ip_qos_interactive));
@@ -2357,5 +2652,28 @@
 	printf("rekeylimit %llu %d\n", (unsigned long long)o->rekey_limit,
 	    o->rekey_interval);
 
-	channel_print_adm_permitted_opens();
+	printf("permitopen");
+	if (o->num_permitted_opens == 0)
+		printf(" any");
+	else {
+		for (i = 0; i < o->num_permitted_opens; i++)
+			printf(" %s", o->permitted_opens[i]);
+	}
+	printf("\n");
+	printf("permitlisten");
+	if (o->num_permitted_listens == 0)
+		printf(" any");
+	else {
+		for (i = 0; i < o->num_permitted_listens; i++)
+			printf(" %s", o->permitted_listens[i]);
+	}
+	printf("\n");
+
+	if (o->permit_user_env_whitelist == NULL) {
+		dump_cfg_fmtint(sPermitUserEnvironment, o->permit_user_env);
+	} else {
+		printf("permituserenvironment %s\n",
+		    o->permit_user_env_whitelist);
+	}
+
 }
diff --git a/servconf.h b/servconf.h
index 5853a97..557521d 100644
--- a/servconf.h
+++ b/servconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: servconf.h,v 1.123 2016/11/30 03:00:05 djm Exp $ */
+/* $OpenBSD: servconf.h,v 1.136 2018/07/09 21:26:02 markus Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -18,17 +18,7 @@
 
 #define MAX_PORTS		256	/* Max # ports. */
 
-#define MAX_ALLOW_USERS		256	/* Max # users on allow list. */
-#define MAX_DENY_USERS		256	/* Max # users on deny list. */
-#define MAX_ALLOW_GROUPS	256	/* Max # groups on allow list. */
-#define MAX_DENY_GROUPS		256	/* Max # groups on deny list. */
 #define MAX_SUBSYSTEMS		256	/* Max # subsystems. */
-#define MAX_HOSTKEYS		256	/* Max # hostkeys. */
-#define MAX_HOSTCERTS		256	/* Max # host certificates. */
-#define MAX_ACCEPT_ENV		256	/* Max # of env vars. */
-#define MAX_MATCH_GROUPS	256	/* Max # of groups for Match. */
-#define MAX_AUTHKEYS_FILES	256	/* Max # of authorized_keys files. */
-#define MAX_AUTH_METHODS	256	/* Max # of AuthenticationMethods. */
 
 /* permit_root_login */
 #define	PERMIT_NOT_SET		-1
@@ -42,11 +32,9 @@
 #define PRIVSEP_ON		1
 #define PRIVSEP_NOSANDBOX	2
 
-/* AllowTCPForwarding */
-#define FORWARD_DENY		0
-#define FORWARD_REMOTE		(1)
-#define FORWARD_LOCAL		(1<<1)
-#define FORWARD_ALLOW		(FORWARD_REMOTE|FORWARD_LOCAL)
+/* PermitOpen */
+#define PERMITOPEN_ANY		0
+#define PERMITOPEN_NONE		-2
 
 #define DEFAULT_AUTH_FAIL_MAX	6	/* Default for MaxAuthTries */
 #define DEFAULT_SESSIONS_MAX	10	/* Default for MaxSessions */
@@ -54,21 +42,45 @@
 /* Magic name for internal sftp-server */
 #define INTERNAL_SFTP_NAME	"internal-sftp"
 
+struct ssh;
+struct fwd_perm_list;
+
+/*
+ * Used to store addresses from ListenAddr directives. These may be
+ * incomplete, as they may specify addresses that need to be merged
+ * with any ports requested by ListenPort.
+ */
+struct queued_listenaddr {
+	char *addr;
+	int port; /* <=0 if unspecified */
+	char *rdomain;
+};
+
+/* Resolved listen addresses, grouped by optional routing domain */
+struct listenaddr {
+	char *rdomain;
+	struct addrinfo *addrs;
+};
+
 typedef struct {
 	u_int	num_ports;
 	u_int	ports_from_cmdline;
 	int	ports[MAX_PORTS];	/* Port number to listen on. */
+	struct queued_listenaddr *queued_listen_addrs;
 	u_int	num_queued_listens;
-	char   **queued_listen_addrs;
-	int    *queued_listen_ports;
-	struct addrinfo *listen_addrs;	/* Addresses on which the server listens. */
-	int     address_family;		/* Address family used by the server. */
-	char   *host_key_files[MAX_HOSTKEYS];	/* Files containing host keys. */
-	int     num_host_key_files;     /* Number of files for host keys. */
-	char   *host_cert_files[MAX_HOSTCERTS];	/* Files containing host certs. */
-	int     num_host_cert_files;     /* Number of files for host certs. */
-	char   *host_key_agent;		 /* ssh-agent socket for host keys. */
-	char   *pid_file;	/* Where to put our pid */
+	struct listenaddr *listen_addrs;
+	u_int	num_listen_addrs;
+	int	address_family;		/* Address family used by the server. */
+
+	char	*routing_domain;	/* Bind session to routing domain */
+
+	char   **host_key_files;	/* Files containing host keys. */
+	u_int	num_host_key_files;     /* Number of files for host keys. */
+	char   **host_cert_files;	/* Files containing host certs. */
+	u_int	num_host_cert_files;	/* Number of files for host certs. */
+
+	char   *host_key_agent;		/* ssh-agent socket for host keys. */
+	char   *pid_file;		/* Where to put our pid */
 	int     login_grace_time;	/* Disconnect if no auth in this time
 					 * (sec). */
 	int     permit_root_login;	/* PERMIT_*, see above */
@@ -121,19 +133,20 @@
 	int     permit_empty_passwd;	/* If false, do not permit empty
 					 * passwords. */
 	int     permit_user_env;	/* If true, read ~/.ssh/environment */
+	char   *permit_user_env_whitelist; /* pattern-list whitelist */
 	int     compression;	/* If true, compression is allowed */
 	int	allow_tcp_forwarding; /* One of FORWARD_* */
 	int	allow_streamlocal_forwarding; /* One of FORWARD_* */
 	int	allow_agent_forwarding;
 	int	disable_forwarding;
 	u_int num_allow_users;
-	char   *allow_users[MAX_ALLOW_USERS];
+	char   **allow_users;
 	u_int num_deny_users;
-	char   *deny_users[MAX_DENY_USERS];
+	char   **deny_users;
 	u_int num_allow_groups;
-	char   *allow_groups[MAX_ALLOW_GROUPS];
+	char   **allow_groups;
 	u_int num_deny_groups;
-	char   *deny_groups[MAX_DENY_GROUPS];
+	char   **deny_groups;
 
 	u_int num_subsystems;
 	char   *subsystem_name[MAX_SUBSYSTEMS];
@@ -141,7 +154,9 @@
 	char   *subsystem_args[MAX_SUBSYSTEMS];
 
 	u_int num_accept_env;
-	char   *accept_env[MAX_ACCEPT_ENV];
+	char   **accept_env;
+	u_int num_setenv;
+	char   **setenv;
 
 	int	max_startups_begin;
 	int	max_startups_rate;
@@ -160,8 +175,8 @@
 					 * disconnect the session
 					 */
 
-	u_int num_authkeys_files;	/* Files containing public keys */
-	char   *authorized_keys_files[MAX_AUTHKEYS_FILES];
+	u_int	num_authkeys_files;	/* Files containing public keys */
+	char   **authorized_keys_files;
 
 	char   *adm_forced_command;
 
@@ -169,7 +184,10 @@
 
 	int	permit_tun;
 
-	int	num_permitted_opens;
+	char   **permitted_opens;	/* May also be one of PERMITOPEN_* */
+	u_int   num_permitted_opens;
+	char   **permitted_listens; /* May also be one of PERMITOPEN_* */
+	u_int   num_permitted_listens;
 
 	char   *chroot_directory;
 	char   *revoked_keys_file;
@@ -186,9 +204,11 @@
 	char   *version_addendum;	/* Appended to SSH banner */
 
 	u_int	num_auth_methods;
-	char   *auth_methods[MAX_AUTH_METHODS];
+	char   **auth_methods;
 
 	int	fingerprint_hash;
+	int	expose_userauth_info;
+	u_int64_t timing_secret;
 }       ServerOptions;
 
 /* Information about the incoming connection as used by Match */
@@ -198,6 +218,7 @@
 	const char *address; 	/* remote address */
 	const char *laddress;	/* local address */
 	int lport;		/* local port */
+	const char *rdomain;	/* routing domain if available */
 };
 
 
@@ -221,6 +242,8 @@
 		M_CP_STROPT(authorized_principals_command_user); \
 		M_CP_STROPT(hostbased_key_types); \
 		M_CP_STROPT(pubkey_key_types); \
+		M_CP_STROPT(routing_domain); \
+		M_CP_STROPT(permit_user_env_whitelist); \
 		M_CP_STRARRAYOPT(authorized_keys_files, num_authkeys_files); \
 		M_CP_STRARRAYOPT(allow_users, num_allow_users); \
 		M_CP_STRARRAYOPT(deny_users, num_deny_users); \
@@ -228,6 +251,8 @@
 		M_CP_STRARRAYOPT(deny_groups, num_deny_groups); \
 		M_CP_STRARRAYOPT(accept_env, num_accept_env); \
 		M_CP_STRARRAYOPT(auth_methods, num_auth_methods); \
+		M_CP_STRARRAYOPT(permitted_opens, num_permitted_opens); \
+		M_CP_STRARRAYOPT(permitted_listens, num_permitted_listens); \
 	} while (0)
 
 struct connection_info *get_connection_info(int, int);
@@ -235,8 +260,9 @@
 void	 fill_default_server_options(ServerOptions *);
 int	 process_server_config_line(ServerOptions *, char *, const char *, int,
 	     int *, struct connection_info *);
-void	 load_server_config(const char *, Buffer *);
-void	 parse_server_config(ServerOptions *, const char *, Buffer *,
+void	 process_permitopen(struct ssh *ssh, ServerOptions *options);
+void	 load_server_config(const char *, struct sshbuf *);
+void	 parse_server_config(ServerOptions *, const char *, struct sshbuf *,
 	     struct connection_info *);
 void	 parse_server_match_config(ServerOptions *, struct connection_info *);
 int	 parse_server_match_testspec(struct connection_info *, char *);
@@ -244,5 +270,9 @@
 void	 copy_set_server_options(ServerOptions *, ServerOptions *, int);
 void	 dump_config(ServerOptions *);
 char	*derelativise_path(const char *);
+void	 servconf_add_hostkey(const char *, const int,
+	    ServerOptions *, const char *path);
+void	 servconf_add_hostcert(const char *, const int,
+	    ServerOptions *, const char *path);
 
 #endif				/* SERVCONF_H */
diff --git a/serverloop.c b/serverloop.c
index 1e7d1f6..a557f02 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: serverloop.c,v 1.191 2017/02/01 02:59:09 dtucker Exp $ */
+/* $OpenBSD: serverloop.c,v 1.209 2018/07/27 05:13:02 dtucker Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -58,7 +58,7 @@
 #include "openbsd-compat/sys-queue.h"
 #include "xmalloc.h"
 #include "packet.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "log.h"
 #include "misc.h"
 #include "servconf.h"
@@ -67,7 +67,7 @@
 #include "channels.h"
 #include "compat.h"
 #include "ssh2.h"
-#include "key.h"
+#include "sshkey.h"
 #include "cipher.h"
 #include "kex.h"
 #include "hostfile.h"
@@ -82,6 +82,7 @@
 
 /* XXX */
 extern Authctxt *the_authctxt;
+extern struct sshauthopt *auth_opts;
 extern int use_privsep;
 
 static int no_more_sessions = 0; /* Disallow further sessions. */
@@ -99,6 +100,20 @@
 /* prototypes */
 static void server_init_dispatch(void);
 
+/* requested tunnel forwarding interface(s), shared with session.c */
+char *tun_fwd_ifnames = NULL;
+
+/* returns 1 if bind to specified port by specified user is permitted */
+static int
+bind_permitted(int port, uid_t uid)
+{
+	if (use_privsep)
+		return 1; /* allow system to decide */
+	if (port < IPPORT_RESERVED && uid != 0)
+		return 0;
+	return 1;
+}
+
 /*
  * we write to this pipe if a SIGCHLD is caught in order to avoid
  * the race between select() and child_terminated
@@ -141,7 +156,7 @@
 
 	if (notify_pipe[0] != -1 && FD_ISSET(notify_pipe[0], readset))
 		while (read(notify_pipe[0], &c, 1) != -1)
-			debug2("notify_done: reading");
+			debug2("%s: reading", __func__);
 }
 
 /*ARGSUSED*/
@@ -150,9 +165,6 @@
 {
 	int save_errno = errno;
 	child_terminated = 1;
-#ifndef _UNICOS
-	mysignal(SIGCHLD, sigchld_handler);
-#endif
 	notify_parent();
 	errno = save_errno;
 }
@@ -165,13 +177,15 @@
 }
 
 static void
-client_alive_check(void)
+client_alive_check(struct ssh *ssh)
 {
 	int channel_id;
+	char remote_id[512];
 
 	/* timeout, check to see how many we have had */
 	if (packet_inc_alive_timeouts() > options.client_alive_count_max) {
-		logit("Timeout, client not responding.");
+		sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
+		logit("Timeout, client not responding from %s", remote_id);
 		cleanup_exit(255);
 	}
 
@@ -179,12 +193,13 @@
 	 * send a bogus global/channel request with "wantreply",
 	 * we should get back a failure
 	 */
-	if ((channel_id = channel_find_open()) == -1) {
+	if ((channel_id = channel_find_open(ssh)) == -1) {
 		packet_start(SSH2_MSG_GLOBAL_REQUEST);
 		packet_put_cstring("keepalive@openssh.com");
 		packet_put_char(1);	/* boolean: want reply */
 	} else {
-		channel_request_start(channel_id, "keepalive@openssh.com", 1);
+		channel_request_start(ssh, channel_id,
+		    "keepalive@openssh.com", 1);
 	}
 	packet_send();
 }
@@ -196,7 +211,8 @@
  * for the duration of the wait (0 = infinite).
  */
 static void
-wait_until_can_do_something(int connection_in, int connection_out,
+wait_until_can_do_something(struct ssh *ssh,
+    int connection_in, int connection_out,
     fd_set **readsetp, fd_set **writesetp, int *maxfdp,
     u_int *nallocp, u_int64_t max_time_ms)
 {
@@ -204,10 +220,11 @@
 	int ret;
 	time_t minwait_secs = 0;
 	int client_alive_scheduled = 0;
+	static time_t last_client_time;
 
 	/* Allocate and update select() masks for channel descriptors. */
-	channel_prepare_select(readsetp, writesetp, maxfdp, nallocp,
-	    &minwait_secs, 0);
+	channel_prepare_select(ssh, readsetp, writesetp, maxfdp,
+	    nallocp, &minwait_secs);
 
 	/* XXX need proper deadline system for rekey/client alive */
 	if (minwait_secs != 0)
@@ -272,8 +289,19 @@
 		memset(*writesetp, 0, *nallocp);
 		if (errno != EINTR)
 			error("select: %.100s", strerror(errno));
-	} else if (ret == 0 && client_alive_scheduled)
-		client_alive_check();
+	} else if (client_alive_scheduled) {
+		time_t now = monotime();
+
+		if (ret == 0) { /* timeout */
+			client_alive_check(ssh);
+		} else if (FD_ISSET(connection_in, *readsetp)) {
+			last_client_time = now;
+		} else if (last_client_time != 0 && last_client_time +
+		    options.client_alive_interval <= now) {
+			client_alive_check(ssh);
+			last_client_time = now;
+		}
+	}
 
 	notify_done(*readsetp);
 }
@@ -283,9 +311,8 @@
  * in buffers and processed later.
  */
 static int
-process_input(fd_set *readset, int connection_in)
+process_input(struct ssh *ssh, fd_set *readset, int connection_in)
 {
-	struct ssh *ssh = active_state; /* XXX */
 	int len;
 	char buf[16384];
 
@@ -325,13 +352,13 @@
 }
 
 static void
-process_buffered_input_packets(void)
+process_buffered_input_packets(struct ssh *ssh)
 {
-	dispatch_run(DISPATCH_NONBLOCK, NULL, active_state);
+	ssh_dispatch_run_fatal(ssh, DISPATCH_NONBLOCK, NULL);
 }
 
 static void
-collect_children(void)
+collect_children(struct ssh *ssh)
 {
 	pid_t pid;
 	sigset_t oset, nset;
@@ -346,14 +373,14 @@
 		while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
 		    (pid < 0 && errno == EINTR))
 			if (pid > 0)
-				session_close_by_pid(pid, status);
+				session_close_by_pid(ssh, pid, status);
 		child_terminated = 0;
 	}
 	sigprocmask(SIG_SETMASK, &oset, NULL);
 }
 
 void
-server_loop2(Authctxt *authctxt)
+server_loop2(struct ssh *ssh, Authctxt *authctxt)
 {
 	fd_set *readset = NULL, *writeset = NULL;
 	int max_fd;
@@ -362,7 +389,7 @@
 
 	debug("Entering interactive session for SSH2.");
 
-	mysignal(SIGCHLD, sigchld_handler);
+	signal(SIGCHLD, sigchld_handler);
 	child_terminated = 0;
 	connection_in = packet_get_connection_in();
 	connection_out = packet_get_connection_out();
@@ -381,18 +408,17 @@
 	server_init_dispatch();
 
 	for (;;) {
-		process_buffered_input_packets();
+		process_buffered_input_packets(ssh);
 
-		if (!ssh_packet_is_rekeying(active_state) &&
+		if (!ssh_packet_is_rekeying(ssh) &&
 		    packet_not_very_much_data_to_write())
-			channel_output_poll();
-		if (options.rekey_interval > 0 &&
-		    !ssh_packet_is_rekeying(active_state))
+			channel_output_poll(ssh);
+		if (options.rekey_interval > 0 && !ssh_packet_is_rekeying(ssh))
 			rekey_timeout_ms = packet_get_rekey_timeout() * 1000;
 		else
 			rekey_timeout_ms = 0;
 
-		wait_until_can_do_something(connection_in, connection_out,
+		wait_until_can_do_something(ssh, connection_in, connection_out,
 		    &readset, &writeset, &max_fd, &nalloc, rekey_timeout_ms);
 
 		if (received_sigterm) {
@@ -401,27 +427,27 @@
 			cleanup_exit(255);
 		}
 
-		collect_children();
-		if (!ssh_packet_is_rekeying(active_state))
-			channel_after_select(readset, writeset);
-		if (process_input(readset, connection_in) < 0)
+		collect_children(ssh);
+		if (!ssh_packet_is_rekeying(ssh))
+			channel_after_select(ssh, readset, writeset);
+		if (process_input(ssh, readset, connection_in) < 0)
 			break;
 		process_output(writeset, connection_out);
 	}
-	collect_children();
+	collect_children(ssh);
 
 	free(readset);
 	free(writeset);
 
 	/* free all channels, no more reads and writes */
-	channel_free_all();
+	channel_free_all(ssh);
 
 	/* free remaining sessions, e.g. remove wtmp entries */
-	session_destroy_all(NULL);
+	session_destroy_all(ssh, NULL);
 }
 
 static int
-server_input_keep_alive(int type, u_int32_t seq, void *ctxt)
+server_input_keep_alive(int type, u_int32_t seq, struct ssh *ssh)
 {
 	debug("Got %d/%u for keepalive", type, seq);
 	/*
@@ -434,7 +460,7 @@
 }
 
 static Channel *
-server_request_direct_tcpip(int *reason, const char **errmsg)
+server_request_direct_tcpip(struct ssh *ssh, int *reason, const char **errmsg)
 {
 	Channel *c = NULL;
 	char *target, *originator;
@@ -446,13 +472,14 @@
 	originator_port = packet_get_int();
 	packet_check_eom();
 
-	debug("server_request_direct_tcpip: originator %s port %d, target %s "
-	    "port %d", originator, originator_port, target, target_port);
+	debug("%s: originator %s port %d, target %s port %d", __func__,
+	    originator, originator_port, target, target_port);
 
 	/* XXX fine grained permissions */
 	if ((options.allow_tcp_forwarding & FORWARD_LOCAL) != 0 &&
-	    !no_port_forwarding_flag && !options.disable_forwarding) {
-		c = channel_connect_to_port(target, target_port,
+	    auth_opts->permit_port_forwarding_flag &&
+	    !options.disable_forwarding) {
+		c = channel_connect_to_port(ssh, target, target_port,
 		    "direct-tcpip", "direct-tcpip", reason, errmsg);
 	} else {
 		logit("refused local port forward: "
@@ -469,7 +496,7 @@
 }
 
 static Channel *
-server_request_direct_streamlocal(void)
+server_request_direct_streamlocal(struct ssh *ssh)
 {
 	Channel *c = NULL;
 	char *target, *originator;
@@ -477,21 +504,21 @@
 	struct passwd *pw = the_authctxt->pw;
 
 	if (pw == NULL || !the_authctxt->valid)
-		fatal("server_input_global_request: no/invalid user");
+		fatal("%s: no/invalid user", __func__);
 
 	target = packet_get_string(NULL);
 	originator = packet_get_string(NULL);
 	originator_port = packet_get_int();
 	packet_check_eom();
 
-	debug("server_request_direct_streamlocal: originator %s port %d, target %s",
+	debug("%s: originator %s port %d, target %s", __func__,
 	    originator, originator_port, target);
 
 	/* XXX fine grained permissions */
 	if ((options.allow_streamlocal_forwarding & FORWARD_LOCAL) != 0 &&
-	    !no_port_forwarding_flag && !options.disable_forwarding &&
-	    (pw->pw_uid == 0 || use_privsep)) {
-		c = channel_connect_to_path(target,
+	    auth_opts->permit_port_forwarding_flag &&
+	    !options.disable_forwarding && (pw->pw_uid == 0 || use_privsep)) {
+		c = channel_connect_to_path(ssh, target,
 		    "direct-streamlocal@openssh.com", "direct-streamlocal");
 	} else {
 		logit("refused streamlocal port forward: "
@@ -506,11 +533,11 @@
 }
 
 static Channel *
-server_request_tun(void)
+server_request_tun(struct ssh *ssh)
 {
 	Channel *c = NULL;
-	int mode, tun;
-	int sock;
+	int mode, tun, sock;
+	char *tmp, *ifname = NULL;
 
 	mode = packet_get_int();
 	switch (mode) {
@@ -528,23 +555,38 @@
 	}
 
 	tun = packet_get_int();
-	if (forced_tun_device != -1) {
-		if (tun != SSH_TUNID_ANY && forced_tun_device != tun)
+	if (auth_opts->force_tun_device != -1) {
+		if (tun != SSH_TUNID_ANY && auth_opts->force_tun_device != tun)
 			goto done;
-		tun = forced_tun_device;
+		tun = auth_opts->force_tun_device;
 	}
-	sock = tun_open(tun, mode);
+	sock = tun_open(tun, mode, &ifname);
 	if (sock < 0)
 		goto done;
-	c = channel_new("tun", SSH_CHANNEL_OPEN, sock, sock, -1,
+	debug("Tunnel forwarding using interface %s", ifname);
+
+	c = channel_new(ssh, "tun", SSH_CHANNEL_OPEN, sock, sock, -1,
 	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, "tun", 1);
 	c->datagram = 1;
 #if defined(SSH_TUN_FILTER)
 	if (mode == SSH_TUNMODE_POINTOPOINT)
-		channel_register_filter(c->self, sys_tun_infilter,
+		channel_register_filter(ssh, c->self, sys_tun_infilter,
 		    sys_tun_outfilter, NULL, NULL);
 #endif
 
+	/*
+	 * Update the list of names exposed to the session
+	 * XXX remove these if the tunnels are closed (won't matter
+	 * much if they are already in the environment though)
+	 */
+	tmp = tun_fwd_ifnames;
+	xasprintf(&tun_fwd_ifnames, "%s%s%s",
+	    tun_fwd_ifnames == NULL ? "" : tun_fwd_ifnames,
+	    tun_fwd_ifnames == NULL ? "" : ",",
+	    ifname);
+	free(tmp);
+	free(ifname);
+
  done:
 	if (c == NULL)
 		packet_send_debug("Failed to open the tunnel device.");
@@ -552,7 +594,7 @@
 }
 
 static Channel *
-server_request_session(void)
+server_request_session(struct ssh *ssh)
 {
 	Channel *c;
 
@@ -570,20 +612,20 @@
 	 * SSH_CHANNEL_LARVAL.  Additionally, a callback for handling all
 	 * CHANNEL_REQUEST messages is registered.
 	 */
-	c = channel_new("session", SSH_CHANNEL_LARVAL,
+	c = channel_new(ssh, "session", SSH_CHANNEL_LARVAL,
 	    -1, -1, -1, /*window size*/0, CHAN_SES_PACKET_DEFAULT,
 	    0, "server-session", 1);
 	if (session_open(the_authctxt, c->self) != 1) {
 		debug("session open failed, free channel %d", c->self);
-		channel_free(c);
+		channel_free(ssh, c);
 		return NULL;
 	}
-	channel_register_cleanup(c->self, session_close_by_channel, 0);
+	channel_register_cleanup(ssh, c->self, session_close_by_channel, 0);
 	return c;
 }
 
 static int
-server_input_channel_open(int type, u_int32_t seq, void *ctxt)
+server_input_channel_open(int type, u_int32_t seq, struct ssh *ssh)
 {
 	Channel *c = NULL;
 	char *ctype;
@@ -596,21 +638,22 @@
 	rwindow = packet_get_int();
 	rmaxpack = packet_get_int();
 
-	debug("server_input_channel_open: ctype %s rchan %d win %d max %d",
+	debug("%s: ctype %s rchan %d win %d max %d", __func__,
 	    ctype, rchan, rwindow, rmaxpack);
 
 	if (strcmp(ctype, "session") == 0) {
-		c = server_request_session();
+		c = server_request_session(ssh);
 	} else if (strcmp(ctype, "direct-tcpip") == 0) {
-		c = server_request_direct_tcpip(&reason, &errmsg);
+		c = server_request_direct_tcpip(ssh, &reason, &errmsg);
 	} else if (strcmp(ctype, "direct-streamlocal@openssh.com") == 0) {
-		c = server_request_direct_streamlocal();
+		c = server_request_direct_streamlocal(ssh);
 	} else if (strcmp(ctype, "tun@openssh.com") == 0) {
-		c = server_request_tun();
+		c = server_request_tun(ssh);
 	}
 	if (c != NULL) {
-		debug("server_input_channel_open: confirm %s", ctype);
+		debug("%s: confirm %s", __func__, ctype);
 		c->remote_id = rchan;
+		c->have_remote_id = 1;
 		c->remote_window = rwindow;
 		c->remote_maxpacket = rmaxpack;
 		if (c->type != SSH_CHANNEL_CONNECTING) {
@@ -622,14 +665,12 @@
 			packet_send();
 		}
 	} else {
-		debug("server_input_channel_open: failure %s", ctype);
+		debug("%s: failure %s", __func__, ctype);
 		packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
 		packet_put_int(rchan);
 		packet_put_int(reason);
-		if (!(datafellows & SSH_BUG_OPENFAILURE)) {
-			packet_put_cstring(errmsg ? errmsg : "open failed");
-			packet_put_cstring("");
-		}
+		packet_put_cstring(errmsg ? errmsg : "open failed");
+		packet_put_cstring("");
 		packet_send();
 	}
 	free(ctype);
@@ -637,13 +678,12 @@
 }
 
 static int
-server_input_hostkeys_prove(struct sshbuf **respp)
+server_input_hostkeys_prove(struct ssh *ssh, struct sshbuf **respp)
 {
-	struct ssh *ssh = active_state; /* XXX */
 	struct sshbuf *resp = NULL;
 	struct sshbuf *sigbuf = NULL;
 	struct sshkey *key = NULL, *key_pub = NULL, *key_prv = NULL;
-	int r, ndx, success = 0;
+	int r, ndx, kexsigtype, use_kexsigtype, success = 0;
 	const u_char *blob;
 	u_char *sig = 0;
 	size_t blen, slen;
@@ -651,6 +691,8 @@
 	if ((resp = sshbuf_new()) == NULL || (sigbuf = sshbuf_new()) == NULL)
 		fatal("%s: sshbuf_new", __func__);
 
+	kexsigtype = sshkey_type_plain(
+	    sshkey_type_from_name(ssh->kex->hostkey_alg));
 	while (ssh_packet_remaining(ssh) > 0) {
 		sshkey_free(key);
 		key = NULL;
@@ -681,13 +723,20 @@
 		sshbuf_reset(sigbuf);
 		free(sig);
 		sig = NULL;
+		/*
+		 * For RSA keys, prefer to use the signature type negotiated
+		 * during KEX to the default (SHA1).
+		 */
+		use_kexsigtype = kexsigtype == KEY_RSA &&
+		    sshkey_type_plain(key->type) == KEY_RSA;
 		if ((r = sshbuf_put_cstring(sigbuf,
 		    "hostkeys-prove-00@openssh.com")) != 0 ||
 		    (r = sshbuf_put_string(sigbuf,
 		    ssh->kex->session_id, ssh->kex->session_id_len)) != 0 ||
 		    (r = sshkey_puts(key, sigbuf)) != 0 ||
 		    (r = ssh->kex->sign(key_prv, key_pub, &sig, &slen,
-		    sshbuf_ptr(sigbuf), sshbuf_len(sigbuf), NULL, 0)) != 0 ||
+		    sshbuf_ptr(sigbuf), sshbuf_len(sigbuf),
+		    use_kexsigtype ? ssh->kex->hostkey_alg : NULL, 0)) != 0 ||
 		    (r = sshbuf_put_string(resp, sig, slen)) != 0) {
 			error("%s: couldn't prepare signature: %s",
 			    __func__, ssh_err(r));
@@ -707,7 +756,7 @@
 }
 
 static int
-server_input_global_request(int type, u_int32_t seq, void *ctxt)
+server_input_global_request(int type, u_int32_t seq, struct ssh *ssh)
 {
 	char *rtype;
 	int want_reply;
@@ -716,11 +765,11 @@
 	struct passwd *pw = the_authctxt->pw;
 
 	if (pw == NULL || !the_authctxt->valid)
-		fatal("server_input_global_request: no/invalid user");
+		fatal("%s: no/invalid user", __func__);
 
 	rtype = packet_get_string(NULL);
 	want_reply = packet_get_char();
-	debug("server_input_global_request: rtype %s want_reply %d", rtype, want_reply);
+	debug("%s: rtype %s want_reply %d", __func__, rtype, want_reply);
 
 	/* -R style forwarding */
 	if (strcmp(rtype, "tcpip-forward") == 0) {
@@ -729,12 +778,13 @@
 		memset(&fwd, 0, sizeof(fwd));
 		fwd.listen_host = packet_get_string(NULL);
 		fwd.listen_port = (u_short)packet_get_int();
-		debug("server_input_global_request: tcpip-forward listen %s port %d",
+		debug("%s: tcpip-forward listen %s port %d", __func__,
 		    fwd.listen_host, fwd.listen_port);
 
 		/* check permissions */
 		if ((options.allow_tcp_forwarding & FORWARD_REMOTE) == 0 ||
-		    no_port_forwarding_flag || options.disable_forwarding ||
+		    !auth_opts->permit_port_forwarding_flag ||
+		    options.disable_forwarding ||
 		    (!want_reply && fwd.listen_port == 0) ||
 		    (fwd.listen_port != 0 &&
 		     !bind_permitted(fwd.listen_port, pw->pw_uid))) {
@@ -742,7 +792,7 @@
 			packet_send_debug("Server has disabled port forwarding.");
 		} else {
 			/* Start listening on the port */
-			success = channel_setup_remote_fwd_listener(&fwd,
+			success = channel_setup_remote_fwd_listener(ssh, &fwd,
 			    &allocated_listen_port, &options.fwd_opts);
 		}
 		free(fwd.listen_host);
@@ -760,26 +810,27 @@
 		debug("%s: cancel-tcpip-forward addr %s port %d", __func__,
 		    fwd.listen_host, fwd.listen_port);
 
-		success = channel_cancel_rport_listener(&fwd);
+		success = channel_cancel_rport_listener(ssh, &fwd);
 		free(fwd.listen_host);
 	} else if (strcmp(rtype, "streamlocal-forward@openssh.com") == 0) {
 		struct Forward fwd;
 
 		memset(&fwd, 0, sizeof(fwd));
 		fwd.listen_path = packet_get_string(NULL);
-		debug("server_input_global_request: streamlocal-forward listen path %s",
+		debug("%s: streamlocal-forward listen path %s", __func__,
 		    fwd.listen_path);
 
 		/* check permissions */
 		if ((options.allow_streamlocal_forwarding & FORWARD_REMOTE) == 0
-		    || no_port_forwarding_flag || options.disable_forwarding ||
+		    || !auth_opts->permit_port_forwarding_flag ||
+		    options.disable_forwarding ||
 		    (pw->pw_uid != 0 && !use_privsep)) {
 			success = 0;
 			packet_send_debug("Server has disabled "
 			    "streamlocal forwarding.");
 		} else {
 			/* Start listening on the socket */
-			success = channel_setup_remote_fwd_listener(
+			success = channel_setup_remote_fwd_listener(ssh,
 			    &fwd, NULL, &options.fwd_opts);
 		}
 		free(fwd.listen_path);
@@ -791,19 +842,19 @@
 		debug("%s: cancel-streamlocal-forward path %s", __func__,
 		    fwd.listen_path);
 
-		success = channel_cancel_rport_listener(&fwd);
+		success = channel_cancel_rport_listener(ssh, &fwd);
 		free(fwd.listen_path);
 	} else if (strcmp(rtype, "no-more-sessions@openssh.com") == 0) {
 		no_more_sessions = 1;
 		success = 1;
 	} else if (strcmp(rtype, "hostkeys-prove-00@openssh.com") == 0) {
-		success = server_input_hostkeys_prove(&resp);
+		success = server_input_hostkeys_prove(ssh, &resp);
 	}
 	if (want_reply) {
 		packet_start(success ?
 		    SSH2_MSG_REQUEST_SUCCESS : SSH2_MSG_REQUEST_FAILURE);
 		if (success && resp != NULL)
-			ssh_packet_put_raw(active_state, sshbuf_ptr(resp),
+			ssh_packet_put_raw(ssh, sshbuf_ptr(resp),
 			    sshbuf_len(resp));
 		packet_send();
 		packet_write_wait();
@@ -814,7 +865,7 @@
 }
 
 static int
-server_input_channel_req(int type, u_int32_t seq, void *ctxt)
+server_input_channel_req(int type, u_int32_t seq, struct ssh *ssh)
 {
 	Channel *c;
 	int id, reply, success = 0;
@@ -827,16 +878,19 @@
 	debug("server_input_channel_req: channel %d request %s reply %d",
 	    id, rtype, reply);
 
-	if ((c = channel_lookup(id)) == NULL)
+	if ((c = channel_lookup(ssh, id)) == NULL)
 		packet_disconnect("server_input_channel_req: "
 		    "unknown channel %d", id);
 	if (!strcmp(rtype, "eow@openssh.com")) {
 		packet_check_eom();
-		chan_rcvd_eow(c);
+		chan_rcvd_eow(ssh, c);
 	} else if ((c->type == SSH_CHANNEL_LARVAL ||
 	    c->type == SSH_CHANNEL_OPEN) && strcmp(c->ctype, "session") == 0)
-		success = session_input_channel_req(c, rtype);
+		success = session_input_channel_req(ssh, c, rtype);
 	if (reply && !(c->flags & CHAN_CLOSE_SENT)) {
+		if (!c->have_remote_id)
+			fatal("%s: channel %d: no remote_id",
+			    __func__, c->self);
 		packet_start(success ?
 		    SSH2_MSG_CHANNEL_SUCCESS : SSH2_MSG_CHANNEL_FAILURE);
 		packet_put_int(c->remote_id);
diff --git a/serverloop.h b/serverloop.h
index d5fbda1..fd2cf63 100644
--- a/serverloop.h
+++ b/serverloop.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: serverloop.h,v 1.7 2016/08/13 17:47:41 markus Exp $ */
+/* $OpenBSD: serverloop.h,v 1.8 2017/09/12 06:32:07 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -21,6 +21,8 @@
 #ifndef SERVERLOOP_H
 #define SERVERLOOP_H
 
-void    server_loop2(Authctxt *);
+struct ssh;
+
+void    server_loop2(struct ssh *, Authctxt *);
 
 #endif
diff --git a/session.c b/session.c
index a376372..14ea1cc 100644
--- a/session.c
+++ b/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.286 2016/11/30 03:00:05 djm Exp $ */
+/* $OpenBSD: session.c,v 1.305 2018/07/25 13:56:23 deraadt Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
@@ -69,12 +69,13 @@
 #include "ssh2.h"
 #include "sshpty.h"
 #include "packet.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 #include "match.h"
 #include "uidswap.h"
 #include "compat.h"
 #include "channels.h"
-#include "key.h"
+#include "sshkey.h"
 #include "cipher.h"
 #ifdef GSSAPI
 #include "ssh-gss.h"
@@ -94,6 +95,7 @@
 #include "kex.h"
 #include "monitor_wrap.h"
 #include "sftp.h"
+#include "atomicio.h"
 
 #if defined(KRB5) && defined(USE_AFS)
 #include <kafs.h>
@@ -112,34 +114,35 @@
 /* func */
 
 Session *session_new(void);
-void	session_set_fds(Session *, int, int, int, int, int);
+void	session_set_fds(struct ssh *, Session *, int, int, int, int, int);
 void	session_pty_cleanup(Session *);
 void	session_proctitle(Session *);
-int	session_setup_x11fwd(Session *);
-int	do_exec_pty(Session *, const char *);
-int	do_exec_no_pty(Session *, const char *);
-int	do_exec(Session *, const char *);
-void	do_login(Session *, const char *);
+int	session_setup_x11fwd(struct ssh *, Session *);
+int	do_exec_pty(struct ssh *, Session *, const char *);
+int	do_exec_no_pty(struct ssh *, Session *, const char *);
+int	do_exec(struct ssh *, Session *, const char *);
+void	do_login(struct ssh *, Session *, const char *);
+void	do_child(struct ssh *, Session *, const char *);
 #ifdef LOGIN_NEEDS_UTMPX
 static void	do_pre_login(Session *s);
 #endif
-void	do_child(Session *, const char *);
 void	do_motd(void);
 int	check_quietlogin(Session *, const char *);
 
-static void do_authenticated2(Authctxt *);
+static void do_authenticated2(struct ssh *, Authctxt *);
 
-static int session_pty_req(Session *);
+static int session_pty_req(struct ssh *, Session *);
 
 /* import */
 extern ServerOptions options;
 extern char *__progname;
-extern int log_stderr;
 extern int debug_flag;
 extern u_int utmp_len;
 extern int startup_pipe;
 extern void destroy_sensitive_data(void);
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
+extern struct sshauthopt *auth_opts;
+extern char *tun_fwd_ifnames; /* serverloop.c */
 
 /* original command from peer. */
 const char *original_command = NULL;
@@ -161,6 +164,9 @@
 static int is_child = 0;
 static int in_chroot = 0;
 
+/* File containing userauth info, if ExposeAuthInfo set */
+static char *auth_info_file = NULL;
+
 /* Name and directory of socket for authentication agent forwarding. */
 static char *auth_sock_name = NULL;
 static char *auth_sock_dir = NULL;
@@ -180,7 +186,7 @@
 }
 
 static int
-auth_input_request_forwarding(struct passwd * pw)
+auth_input_request_forwarding(struct ssh *ssh, struct passwd * pw)
 {
 	Channel *nc;
 	int sock = -1;
@@ -220,7 +226,7 @@
 		goto authsock_err;
 
 	/* Allocate a channel for the authentication agent socket. */
-	nc = channel_new("auth socket",
+	nc = channel_new(ssh, "auth socket",
 	    SSH_CHANNEL_AUTH_SOCKET, sock, sock, -1,
 	    CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
 	    0, "auth socket", 1);
@@ -243,30 +249,123 @@
 static void
 display_loginmsg(void)
 {
-	if (buffer_len(&loginmsg) > 0) {
-		buffer_append(&loginmsg, "\0", 1);
-		printf("%s", (char *)buffer_ptr(&loginmsg));
-		buffer_clear(&loginmsg);
+	int r;
+
+	if (sshbuf_len(loginmsg) == 0)
+		return;
+	if ((r = sshbuf_put_u8(loginmsg, 0)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	printf("%s", (char *)sshbuf_ptr(loginmsg));
+	sshbuf_reset(loginmsg);
+}
+
+static void
+prepare_auth_info_file(struct passwd *pw, struct sshbuf *info)
+{
+	int fd = -1, success = 0;
+
+	if (!options.expose_userauth_info || info == NULL)
+		return;
+
+	temporarily_use_uid(pw);
+	auth_info_file = xstrdup("/tmp/sshauth.XXXXXXXXXXXXXXX");
+	if ((fd = mkstemp(auth_info_file)) == -1) {
+		error("%s: mkstemp: %s", __func__, strerror(errno));
+		goto out;
+	}
+	if (atomicio(vwrite, fd, sshbuf_mutable_ptr(info),
+	    sshbuf_len(info)) != sshbuf_len(info)) {
+		error("%s: write: %s", __func__, strerror(errno));
+		goto out;
+	}
+	if (close(fd) != 0) {
+		error("%s: close: %s", __func__, strerror(errno));
+		goto out;
+	}
+	success = 1;
+ out:
+	if (!success) {
+		if (fd != -1)
+			close(fd);
+		free(auth_info_file);
+		auth_info_file = NULL;
+	}
+	restore_uid();
+}
+
+static void
+set_fwdpermit_from_authopts(struct ssh *ssh, const struct sshauthopt *opts)
+{
+	char *tmp, *cp, *host;
+	int port;
+	size_t i;
+
+	if ((options.allow_tcp_forwarding & FORWARD_LOCAL) != 0) {
+		channel_clear_permission(ssh, FORWARD_USER, FORWARD_LOCAL);
+		for (i = 0; i < auth_opts->npermitopen; i++) {
+			tmp = cp = xstrdup(auth_opts->permitopen[i]);
+			/* This shouldn't fail as it has already been checked */
+			if ((host = hpdelim(&cp)) == NULL)
+				fatal("%s: internal error: hpdelim", __func__);
+			host = cleanhostname(host);
+			if (cp == NULL || (port = permitopen_port(cp)) < 0)
+				fatal("%s: internal error: permitopen port",
+				    __func__);
+			channel_add_permission(ssh,
+			    FORWARD_USER, FORWARD_LOCAL, host, port);
+			free(tmp);
+		}
+	}
+	if ((options.allow_tcp_forwarding & FORWARD_REMOTE) != 0) {
+		channel_clear_permission(ssh, FORWARD_USER, FORWARD_REMOTE);
+		for (i = 0; i < auth_opts->npermitlisten; i++) {
+			tmp = cp = xstrdup(auth_opts->permitlisten[i]);
+			/* This shouldn't fail as it has already been checked */
+			if ((host = hpdelim(&cp)) == NULL)
+				fatal("%s: internal error: hpdelim", __func__);
+			host = cleanhostname(host);
+			if (cp == NULL || (port = permitopen_port(cp)) < 0)
+				fatal("%s: internal error: permitlisten port",
+				    __func__);
+			channel_add_permission(ssh,
+			    FORWARD_USER, FORWARD_REMOTE, host, port);
+			free(tmp);
+		}
 	}
 }
 
 void
-do_authenticated(Authctxt *authctxt)
+do_authenticated(struct ssh *ssh, Authctxt *authctxt)
 {
 	setproctitle("%s", authctxt->pw->pw_name);
 
+	auth_log_authopts("active", auth_opts, 0);
+
 	/* setup the channel layer */
 	/* XXX - streamlocal? */
-	if (no_port_forwarding_flag || options.disable_forwarding ||
-	    (options.allow_tcp_forwarding & FORWARD_LOCAL) == 0)
-		channel_disable_adm_local_opens();
-	else
-		channel_permit_all_opens();
+	set_fwdpermit_from_authopts(ssh, auth_opts);
 
+	if (!auth_opts->permit_port_forwarding_flag ||
+	    options.disable_forwarding) {
+		channel_disable_admin(ssh, FORWARD_LOCAL);
+		channel_disable_admin(ssh, FORWARD_REMOTE);
+	} else {
+		if ((options.allow_tcp_forwarding & FORWARD_LOCAL) == 0)
+			channel_disable_admin(ssh, FORWARD_LOCAL);
+		else
+			channel_permit_all(ssh, FORWARD_LOCAL);
+		if ((options.allow_tcp_forwarding & FORWARD_REMOTE) == 0)
+			channel_disable_admin(ssh, FORWARD_REMOTE);
+		else
+			channel_permit_all(ssh, FORWARD_REMOTE);
+	}
 	auth_debug_send();
 
-	do_authenticated2(authctxt);
-	do_cleanup(authctxt);
+	prepare_auth_info_file(authctxt->pw, authctxt->session_info);
+
+	do_authenticated2(ssh, authctxt);
+
+	do_cleanup(ssh, authctxt);
 }
 
 /* Check untrusted xauth strings for metacharacters */
@@ -279,7 +378,7 @@
 		if (!isalnum((u_char)s[i]) &&
 		    s[i] != '.' && s[i] != ':' && s[i] != '/' &&
 		    s[i] != '-' && s[i] != '_')
-		return 0;
+			return 0;
 	}
 	return 1;
 }
@@ -291,10 +390,9 @@
  * setting up file descriptors and such.
  */
 int
-do_exec_no_pty(Session *s, const char *command)
+do_exec_no_pty(struct ssh *ssh, Session *s, const char *command)
 {
 	pid_t pid;
-
 #ifdef USE_PIPES
 	int pin[2], pout[2], perr[2];
 
@@ -383,10 +481,6 @@
 	case 0:
 		is_child = 1;
 
-		/* Child.  Reinitialize the log since the pid has changed. */
-		log_init(__progname, options.log_level,
-		    options.log_facility, log_stderr);
-
 		/*
 		 * Create a new session and process group since the 4.4BSD
 		 * setlogin() affects the entire process group.
@@ -433,21 +527,13 @@
 		close(err[0]);
 #endif
 
-
-#ifdef _UNICOS
-		cray_init_job(s->pw); /* set up cray jid and tmpdir */
-#endif
-
 		/* Do processing for the child (exec command etc). */
-		do_child(s, command);
+		do_child(ssh, s, command);
 		/* NOTREACHED */
 	default:
 		break;
 	}
 
-#ifdef _UNICOS
-	signal(WJSIGNAL, cray_job_termination_handler);
-#endif /* _UNICOS */
 #ifdef HAVE_CYGWIN
 	cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
 #endif
@@ -465,7 +551,7 @@
 	 * it to the user, otherwise multiple sessions may accumulate
 	 * multiple copies of the login messages.
 	 */
-	buffer_clear(&loginmsg);
+	sshbuf_reset(loginmsg);
 
 #ifdef USE_PIPES
 	/* We are the parent.  Close the child sides of the pipes. */
@@ -473,7 +559,7 @@
 	close(pout[1]);
 	close(perr[1]);
 
-	session_set_fds(s, pin[1], pout[0], perr[0],
+	session_set_fds(ssh, s, pin[1], pout[0], perr[0],
 	    s->is_subsystem, 0);
 #else
 	/* We are the parent.  Close the child sides of the socket pairs. */
@@ -497,7 +583,7 @@
  * lastlog, and other such operations.
  */
 int
-do_exec_pty(Session *s, const char *command)
+do_exec_pty(struct ssh *ssh, Session *s, const char *command)
 {
 	int fdout, ptyfd, ttyfd, ptymaster;
 	pid_t pid;
@@ -548,9 +634,6 @@
 		close(fdout);
 		close(ptymaster);
 
-		/* Child.  Reinitialize the log because the pid has changed. */
-		log_init(__progname, options.log_level,
-		    options.log_facility, log_stderr);
 		/* Close the master side of the pseudo tty. */
 		close(ptyfd);
 
@@ -569,25 +652,19 @@
 		close(ttyfd);
 
 		/* record login, etc. similar to login(1) */
-#ifdef _UNICOS
-		cray_init_job(s->pw); /* set up cray jid and tmpdir */
-#endif /* _UNICOS */
 #ifndef HAVE_OSF_SIA
-		do_login(s, command);
+		do_login(ssh, s, command);
 #endif
 		/*
 		 * Do common processing for the child, such as execing
 		 * the command.
 		 */
-		do_child(s, command);
+		do_child(ssh, s, command);
 		/* NOTREACHED */
 	default:
 		break;
 	}
 
-#ifdef _UNICOS
-	signal(WJSIGNAL, cray_job_termination_handler);
-#endif /* _UNICOS */
 #ifdef HAVE_CYGWIN
 	cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
 #endif
@@ -605,7 +682,7 @@
 	s->ptymaster = ptymaster;
 	packet_set_interactive(1, 
 	    options.ip_qos_interactive, options.ip_qos_bulk);
-	session_set_fds(s, ptyfd, fdout, -1, 1, 1);
+	session_set_fds(ssh, s, ptyfd, fdout, -1, 1, 1);
 	return 0;
 }
 
@@ -643,9 +720,8 @@
  * to be forced, execute that instead.
  */
 int
-do_exec(Session *s, const char *command)
+do_exec(struct ssh *ssh, Session *s, const char *command)
 {
-	struct ssh *ssh = active_state; /* XXX */
 	int ret;
 	const char *forced = NULL, *tty = NULL;
 	char session_type[1024];
@@ -654,9 +730,9 @@
 		original_command = command;
 		command = options.adm_forced_command;
 		forced = "(config)";
-	} else if (forced_command) {
+	} else if (auth_opts->force_command != NULL) {
 		original_command = command;
-		command = forced_command;
+		command = auth_opts->force_command;
 		forced = "(key-option)";
 	}
 	if (forced != NULL) {
@@ -704,9 +780,9 @@
 	}
 #endif
 	if (s->ttyfd != -1)
-		ret = do_exec_pty(s, command);
+		ret = do_exec_pty(ssh, s, command);
 	else
-		ret = do_exec_no_pty(s, command);
+		ret = do_exec_no_pty(ssh, s, command);
 
 	original_command = NULL;
 
@@ -715,16 +791,15 @@
 	 * it to the user, otherwise multiple sessions may accumulate
 	 * multiple copies of the login messages.
 	 */
-	buffer_clear(&loginmsg);
+	sshbuf_reset(loginmsg);
 
 	return ret;
 }
 
 /* administrative, login(1)-like work */
 void
-do_login(Session *s, const char *command)
+do_login(struct ssh *ssh, Session *s, const char *command)
 {
-	struct ssh *ssh = active_state;	/* XXX */
 	socklen_t fromlen;
 	struct sockaddr_storage from;
 	struct passwd * pw = s->pw;
@@ -822,87 +897,30 @@
 }
 
 /*
- * Sets the value of the given variable in the environment.  If the variable
- * already exists, its value is overridden.
- */
-void
-child_set_env(char ***envp, u_int *envsizep, const char *name,
-	const char *value)
-{
-	char **env;
-	u_int envsize;
-	u_int i, namelen;
-
-	if (strchr(name, '=') != NULL) {
-		error("Invalid environment variable \"%.100s\"", name);
-		return;
-	}
-
-	/*
-	 * If we're passed an uninitialized list, allocate a single null
-	 * entry before continuing.
-	 */
-	if (*envp == NULL && *envsizep == 0) {
-		*envp = xmalloc(sizeof(char *));
-		*envp[0] = NULL;
-		*envsizep = 1;
-	}
-
-	/*
-	 * Find the slot where the value should be stored.  If the variable
-	 * already exists, we reuse the slot; otherwise we append a new slot
-	 * at the end of the array, expanding if necessary.
-	 */
-	env = *envp;
-	namelen = strlen(name);
-	for (i = 0; env[i]; i++)
-		if (strncmp(env[i], name, namelen) == 0 && env[i][namelen] == '=')
-			break;
-	if (env[i]) {
-		/* Reuse the slot. */
-		free(env[i]);
-	} else {
-		/* New variable.  Expand if necessary. */
-		envsize = *envsizep;
-		if (i >= envsize - 1) {
-			if (envsize >= 1000)
-				fatal("child_set_env: too many env vars");
-			envsize += 50;
-			env = (*envp) = xreallocarray(env, envsize, sizeof(char *));
-			*envsizep = envsize;
-		}
-		/* Need to set the NULL pointer at end of array beyond the new slot. */
-		env[i + 1] = NULL;
-	}
-
-	/* Allocate space and format the variable in the appropriate slot. */
-	env[i] = xmalloc(strlen(name) + 1 + strlen(value) + 1);
-	snprintf(env[i], strlen(name) + 1 + strlen(value) + 1, "%s=%s", name, value);
-}
-
-/*
  * Reads environment variables from the given file and adds/overrides them
  * into the environment.  If the file does not exist, this does nothing.
  * Otherwise, it must consist of empty lines, comments (line starts with '#')
  * and assignments of the form name=value.  No other forms are allowed.
+ * If whitelist is not NULL, then it is interpreted as a pattern list and
+ * only variable names that match it will be accepted.
  */
 static void
 read_environment_file(char ***env, u_int *envsize,
-	const char *filename)
+	const char *filename, const char *whitelist)
 {
 	FILE *f;
-	char buf[4096];
-	char *cp, *value;
+	char *line = NULL, *cp, *value;
+	size_t linesize = 0;
 	u_int lineno = 0;
 
 	f = fopen(filename, "r");
 	if (!f)
 		return;
 
-	while (fgets(buf, sizeof(buf), f)) {
+	while (getline(&line, &linesize, f) != -1) {
 		if (++lineno > 1000)
 			fatal("Too many lines in environment file %s", filename);
-		for (cp = buf; *cp == ' ' || *cp == '\t'; cp++)
+		for (cp = line; *cp == ' ' || *cp == '\t'; cp++)
 			;
 		if (!*cp || *cp == '#' || *cp == '\n')
 			continue;
@@ -921,8 +939,12 @@
 		 */
 		*value = '\0';
 		value++;
+		if (whitelist != NULL &&
+		    match_pattern_list(cp, whitelist, 0) != 1)
+			continue;
 		child_set_env(env, envsize, cp, value);
 	}
+	free(line);
 	fclose(f);
 }
 
@@ -959,7 +981,8 @@
 	 * so we use a temporary environment and copy the variables we're
 	 * interested in.
 	 */
-	read_environment_file(&tmpenv, &tmpenvsize, "/etc/default/login");
+	read_environment_file(&tmpenv, &tmpenvsize, "/etc/default/login",
+	    options.permit_user_env_whitelist);
 
 	if (tmpenv == NULL)
 		return;
@@ -981,8 +1004,9 @@
 }
 #endif /* HAVE_ETC_DEFAULT_LOGIN */
 
-void
-copy_environment(char **source, char ***env, u_int *envsize)
+static void
+copy_environment_blacklist(char **source, char ***env, u_int *envsize,
+    const char *blacklist)
 {
 	char *var_name, *var_val;
 	int i;
@@ -998,20 +1022,29 @@
 		}
 		*var_val++ = '\0';
 
-		debug3("Copy environment: %s=%s", var_name, var_val);
-		child_set_env(env, envsize, var_name, var_val);
+		if (blacklist == NULL ||
+		    match_pattern_list(var_name, blacklist, 0) != 1) {
+			debug3("Copy environment: %s=%s", var_name, var_val);
+			child_set_env(env, envsize, var_name, var_val);
+		}
 
 		free(var_name);
 	}
 }
 
-static char **
-do_setup_env(Session *s, const char *shell)
+void
+copy_environment(char **source, char ***env, u_int *envsize)
 {
-	struct ssh *ssh = active_state; /* XXX */
+	copy_environment_blacklist(source, env, envsize, NULL);
+}
+
+static char **
+do_setup_env(struct ssh *ssh, Session *s, const char *shell)
+{
 	char buf[256];
+	size_t n;
 	u_int i, envsize;
-	char **env, *laddr;
+	char *ocp, *cp, *value, **env, *laddr;
 	struct passwd *pw = s->pw;
 #if !defined (HAVE_LOGIN_CAP) && !defined (HAVE_CYGWIN)
 	char *path = NULL;
@@ -1085,50 +1118,10 @@
 
 	if (getenv("TZ"))
 		child_set_env(&env, &envsize, "TZ", getenv("TZ"));
-
-	/* Set custom environment options from RSA authentication. */
-	while (custom_environment) {
-		struct envstring *ce = custom_environment;
-		char *str = ce->s;
-
-		for (i = 0; str[i] != '=' && str[i]; i++)
-			;
-		if (str[i] == '=') {
-			str[i] = 0;
-			child_set_env(&env, &envsize, str, str + i + 1);
-		}
-		custom_environment = ce->next;
-		free(ce->s);
-		free(ce);
-	}
-
-	/* SSH_CLIENT deprecated */
-	snprintf(buf, sizeof buf, "%.50s %d %d",
-	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
-	    ssh_local_port(ssh));
-	child_set_env(&env, &envsize, "SSH_CLIENT", buf);
-
-	laddr = get_local_ipaddr(packet_get_connection_in());
-	snprintf(buf, sizeof buf, "%.50s %d %.50s %d",
-	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
-	    laddr, ssh_local_port(ssh));
-	free(laddr);
-	child_set_env(&env, &envsize, "SSH_CONNECTION", buf);
-
-	if (s->ttyfd != -1)
-		child_set_env(&env, &envsize, "SSH_TTY", s->tty);
 	if (s->term)
 		child_set_env(&env, &envsize, "TERM", s->term);
 	if (s->display)
 		child_set_env(&env, &envsize, "DISPLAY", s->display);
-	if (original_command)
-		child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND",
-		    original_command);
-
-#ifdef _UNICOS
-	if (cray_tmpdir[0] != '\0')
-		child_set_env(&env, &envsize, "TMPDIR", cray_tmpdir);
-#endif /* _UNICOS */
 
 	/*
 	 * Since we clear KRB5CCNAME at startup, if it's set now then it
@@ -1148,7 +1141,8 @@
 
 		if ((cp = getenv("AUTHSTATE")) != NULL)
 			child_set_env(&env, &envsize, "AUTHSTATE", cp);
-		read_environment_file(&env, &envsize, "/etc/environment");
+		read_environment_file(&env, &envsize, "/etc/environment",
+		    options.permit_user_env_whitelist);
 	}
 #endif
 #ifdef KRB5
@@ -1156,6 +1150,37 @@
 		child_set_env(&env, &envsize, "KRB5CCNAME",
 		    s->authctxt->krb5_ccname);
 #endif
+	if (auth_sock_name != NULL)
+		child_set_env(&env, &envsize, SSH_AUTHSOCKET_ENV_NAME,
+		    auth_sock_name);
+
+
+	/* Set custom environment options from pubkey authentication. */
+	if (options.permit_user_env) {
+		for (n = 0 ; n < auth_opts->nenv; n++) {
+			ocp = xstrdup(auth_opts->env[n]);
+			cp = strchr(ocp, '=');
+			if (*cp == '=') {
+				*cp = '\0';
+				/* Apply PermitUserEnvironment whitelist */
+				if (options.permit_user_env_whitelist == NULL ||
+				    match_pattern_list(ocp,
+				    options.permit_user_env_whitelist, 0) == 1)
+					child_set_env(&env, &envsize,
+					    ocp, cp + 1);
+			}
+			free(ocp);
+		}
+	}
+
+	/* read $HOME/.ssh/environment. */
+	if (options.permit_user_env) {
+		snprintf(buf, sizeof buf, "%.200s/.ssh/environment",
+		    pw->pw_dir);
+		read_environment_file(&env, &envsize, buf,
+		    options.permit_user_env_whitelist);
+	}
+
 #ifdef USE_PAM
 	/*
 	 * Pull in any environment variables that may have
@@ -1164,26 +1189,54 @@
 	if (options.use_pam) {
 		char **p;
 
+		/*
+		 * Don't allow SSH_AUTH_INFO variables posted to PAM to leak
+		 * back into the environment.
+		 */
 		p = fetch_pam_child_environment();
-		copy_environment(p, &env, &envsize);
+		copy_environment_blacklist(p, &env, &envsize, "SSH_AUTH_INFO*");
 		free_pam_environment(p);
 
 		p = fetch_pam_environment();
-		copy_environment(p, &env, &envsize);
+		copy_environment_blacklist(p, &env, &envsize, "SSH_AUTH_INFO*");
 		free_pam_environment(p);
 	}
 #endif /* USE_PAM */
 
-	if (auth_sock_name != NULL)
-		child_set_env(&env, &envsize, SSH_AUTHSOCKET_ENV_NAME,
-		    auth_sock_name);
-
-	/* read $HOME/.ssh/environment. */
-	if (options.permit_user_env) {
-		snprintf(buf, sizeof buf, "%.200s/.ssh/environment",
-		    strcmp(pw->pw_dir, "/") ? pw->pw_dir : "");
-		read_environment_file(&env, &envsize, buf);
+	/* Environment specified by admin */
+	for (i = 0; i < options.num_setenv; i++) {
+		cp = xstrdup(options.setenv[i]);
+		if ((value = strchr(cp, '=')) == NULL) {
+			/* shouldn't happen; vars are checked in servconf.c */
+			fatal("Invalid config SetEnv: %s", options.setenv[i]);
+		}
+		*value++ = '\0';
+		child_set_env(&env, &envsize, cp, value);
 	}
+
+	/* SSH_CLIENT deprecated */
+	snprintf(buf, sizeof buf, "%.50s %d %d",
+	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
+	    ssh_local_port(ssh));
+	child_set_env(&env, &envsize, "SSH_CLIENT", buf);
+
+	laddr = get_local_ipaddr(packet_get_connection_in());
+	snprintf(buf, sizeof buf, "%.50s %d %.50s %d",
+	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
+	    laddr, ssh_local_port(ssh));
+	free(laddr);
+	child_set_env(&env, &envsize, "SSH_CONNECTION", buf);
+
+	if (tun_fwd_ifnames != NULL)
+		child_set_env(&env, &envsize, "SSH_TUNNEL", tun_fwd_ifnames);
+	if (auth_info_file != NULL)
+		child_set_env(&env, &envsize, "SSH_USER_AUTH", auth_info_file);
+	if (s->ttyfd != -1)
+		child_set_env(&env, &envsize, "SSH_TTY", s->tty);
+	if (original_command)
+		child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND",
+		    original_command);
+
 	if (debug_flag) {
 		/* dump the environment */
 		fprintf(stderr, "Environment:\n");
@@ -1198,7 +1251,7 @@
  * first in this order).
  */
 static void
-do_rc_files(Session *s, const char *shell)
+do_rc_files(struct ssh *ssh, Session *s, const char *shell)
 {
 	FILE *f = NULL;
 	char cmd[1024];
@@ -1210,7 +1263,7 @@
 
 	/* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */
 	if (!s->is_subsystem && options.adm_forced_command == NULL &&
-	    !no_user_rc && options.permit_user_rc &&
+	    auth_opts->permit_user_rc && options.permit_user_rc &&
 	    stat(_PATH_SSH_USER_RC, &st) >= 0) {
 		snprintf(cmd, sizeof cmd, "%s -c '%s %s'",
 		    shell, _PATH_BSHELL, _PATH_SSH_USER_RC);
@@ -1291,10 +1344,10 @@
 	/* /etc/nologin exists.  Print its contents if we can and exit. */
 	logit("User %.100s not allowed because %s exists", pw->pw_name, nl);
 	if ((f = fopen(nl, "r")) != NULL) {
- 		while (fgets(buf, sizeof(buf), f))
- 			fputs(buf, stderr);
- 		fclose(f);
- 	}
+		while (fgets(buf, sizeof(buf), f))
+			fputs(buf, stderr);
+		fclose(f);
+	}
 	exit(254);
 }
 
@@ -1357,7 +1410,7 @@
 void
 do_setusercontext(struct passwd *pw)
 {
-	char *chroot_path, *tmp;
+	char uidstr[32], *chroot_path, *tmp;
 
 	platform_setusercontext(pw);
 
@@ -1389,8 +1442,10 @@
 		    strcasecmp(options.chroot_directory, "none") != 0) {
                         tmp = tilde_expand_filename(options.chroot_directory,
 			    pw->pw_uid);
+			snprintf(uidstr, sizeof(uidstr), "%llu",
+			    (unsigned long long)pw->pw_uid);
 			chroot_path = percent_expand(tmp, "h", pw->pw_dir,
-			    "u", pw->pw_name, (char *)NULL);
+			    "u", pw->pw_name, "U", uidstr, (char *)NULL);
 			safely_chroot(chroot_path, pw->pw_uid);
 			free(tmp);
 			free(chroot_path);
@@ -1461,7 +1516,7 @@
 }
 
 static void
-child_close_fds(void)
+child_close_fds(struct ssh *ssh)
 {
 	extern int auth_sock;
 
@@ -1481,7 +1536,7 @@
 	 * open in the parent.
 	 */
 	/* XXX better use close-on-exec? -markus */
-	channel_close_all();
+	channel_close_all(ssh);
 
 	/*
 	 * Close any extra file descriptors.  Note that there may still be
@@ -1505,7 +1560,7 @@
  */
 #define ARGV_MAX 10
 void
-do_child(Session *s, const char *command)
+do_child(struct ssh *ssh, Session *s, const char *command)
 {
 	extern char **environ;
 	char **env;
@@ -1516,19 +1571,16 @@
 
 	/* remove hostkey from the child's memory */
 	destroy_sensitive_data();
+	packet_clear_keys();
 
 	/* Force a password change */
 	if (s->authctxt->force_pwchange) {
 		do_setusercontext(pw);
-		child_close_fds();
+		child_close_fds(ssh);
 		do_pwchange(s);
 		exit(1);
 	}
 
-#ifdef _UNICOS
-	cray_setup(pw->pw_uid, pw->pw_name, command);
-#endif /* _UNICOS */
-
 	/*
 	 * Login(1) does this as well, and it needs uid 0 for the "-h"
 	 * switch, so we let login(1) to this for us.
@@ -1569,7 +1621,7 @@
 	 * Make sure $SHELL points to the shell from the password file,
 	 * even if shell is overridden from login.conf
 	 */
-	env = do_setup_env(s, shell);
+	env = do_setup_env(ssh, s, shell);
 
 #ifdef HAVE_LOGIN_CAP
 	shell = login_getcapstr(lc, "shell", (char *)shell, (char *)shell);
@@ -1582,7 +1634,7 @@
 	 * closed before building the environment, as we call
 	 * ssh_remote_ipaddr there.
 	 */
-	child_close_fds();
+	child_close_fds(ssh);
 
 	/*
 	 * Must take new environment into use so that .ssh/rc,
@@ -1633,7 +1685,7 @@
 
 	closefrom(STDERR_FILENO + 1);
 
-	do_rc_files(s, shell);
+	do_rc_files(ssh, s, shell);
 
 	/* restore SIGPIPE for child */
 	signal(SIGPIPE, SIG_DFL);
@@ -1740,8 +1792,8 @@
 			return NULL;
 		debug2("%s: allocate (allocated %d max %d)",
 		    __func__, sessions_nalloc, options.max_sessions);
-		tmp = xreallocarray(sessions, sessions_nalloc + 1,
-		    sizeof(*sessions));
+		tmp = xrecallocarray(sessions, sessions_nalloc,
+		    sessions_nalloc + 1, sizeof(*sessions));
 		if (tmp == NULL) {
 			error("%s: cannot allocate %d sessions",
 			    __func__, sessions_nalloc + 1);
@@ -1879,7 +1931,7 @@
 }
 
 static int
-session_window_change_req(Session *s)
+session_window_change_req(struct ssh *ssh, Session *s)
 {
 	s->col = packet_get_int();
 	s->row = packet_get_int();
@@ -1891,13 +1943,12 @@
 }
 
 static int
-session_pty_req(Session *s)
+session_pty_req(struct ssh *ssh, Session *s)
 {
 	u_int len;
-	int n_bytes;
 
-	if (no_pty_flag || !options.permit_tty) {
-		debug("Allocating a pty not permitted for this authentication.");
+	if (!auth_opts->permit_pty_flag || !options.permit_tty) {
+		debug("Allocating a pty not permitted for this connection.");
 		return 0;
 	}
 	if (s->ttyfd != -1) {
@@ -1929,8 +1980,7 @@
 	}
 	debug("session_pty_req: session %d alloc %s", s->self, s->tty);
 
-	n_bytes = packet_remaining();
-	tty_parse_modes(s->ttyfd, &n_bytes);
+	ssh_tty_parse_modes(ssh, s->ttyfd);
 
 	if (!use_privsep)
 		pty_setowner(s->pw, s->tty);
@@ -1944,7 +1994,7 @@
 }
 
 static int
-session_subsystem_req(Session *s)
+session_subsystem_req(struct ssh *ssh, Session *s)
 {
 	struct stat st;
 	u_int len;
@@ -1971,7 +2021,7 @@
 				s->is_subsystem = SUBSYSTEM_EXT;
 				debug("subsystem: exec() %s", cmd);
 			}
-			success = do_exec(s, cmd) == 0;
+			success = do_exec(ssh, s, cmd) == 0;
 			break;
 		}
 	}
@@ -1984,7 +2034,7 @@
 }
 
 static int
-session_x11_req(Session *s)
+session_x11_req(struct ssh *ssh, Session *s)
 {
 	int success;
 
@@ -2001,7 +2051,7 @@
 
 	if (xauth_valid_string(s->auth_proto) &&
 	    xauth_valid_string(s->auth_data))
-		success = session_setup_x11fwd(s);
+		success = session_setup_x11fwd(ssh, s);
 	else {
 		success = 0;
 		error("Invalid X11 forwarding data");
@@ -2016,26 +2066,26 @@
 }
 
 static int
-session_shell_req(Session *s)
+session_shell_req(struct ssh *ssh, Session *s)
 {
 	packet_check_eom();
-	return do_exec(s, NULL) == 0;
+	return do_exec(ssh, s, NULL) == 0;
 }
 
 static int
-session_exec_req(Session *s)
+session_exec_req(struct ssh *ssh, Session *s)
 {
 	u_int len, success;
 
 	char *command = packet_get_string(&len);
 	packet_check_eom();
-	success = do_exec(s, command) == 0;
+	success = do_exec(ssh, s, command) == 0;
 	free(command);
 	return success;
 }
 
 static int
-session_break_req(Session *s)
+session_break_req(struct ssh *ssh, Session *s)
 {
 
 	packet_get_int();	/* ignored */
@@ -2047,7 +2097,7 @@
 }
 
 static int
-session_env_req(Session *s)
+session_env_req(struct ssh *ssh, Session *s)
 {
 	char *name, *val;
 	u_int name_len, val_len, i;
@@ -2065,8 +2115,8 @@
 	for (i = 0; i < options.num_accept_env; i++) {
 		if (match_pattern(name, options.accept_env[i])) {
 			debug2("Setting env %d: %s=%s", s->num_env, name, val);
-			s->env = xreallocarray(s->env, s->num_env + 1,
-			    sizeof(*s->env));
+			s->env = xrecallocarray(s->env, s->num_env,
+			    s->num_env + 1, sizeof(*s->env));
 			s->env[s->num_env].name = name;
 			s->env[s->num_env].val = val;
 			s->num_env++;
@@ -2082,34 +2132,35 @@
 }
 
 static int
-session_auth_agent_req(Session *s)
+session_auth_agent_req(struct ssh *ssh, Session *s)
 {
 	static int called = 0;
+
 	packet_check_eom();
-	if (no_agent_forwarding_flag || !options.allow_agent_forwarding) {
-		debug("session_auth_agent_req: no_agent_forwarding_flag");
+	if (!auth_opts->permit_agent_forwarding_flag ||
+	    !options.allow_agent_forwarding) {
+		debug("%s: agent forwarding disabled", __func__);
 		return 0;
 	}
 	if (called) {
 		return 0;
 	} else {
 		called = 1;
-		return auth_input_request_forwarding(s->pw);
+		return auth_input_request_forwarding(ssh, s->pw);
 	}
 }
 
 int
-session_input_channel_req(Channel *c, const char *rtype)
+session_input_channel_req(struct ssh *ssh, Channel *c, const char *rtype)
 {
 	int success = 0;
 	Session *s;
 
 	if ((s = session_by_channel(c->self)) == NULL) {
-		logit("session_input_channel_req: no session %d req %.100s",
-		    c->self, rtype);
+		logit("%s: no session %d req %.100s", __func__, c->self, rtype);
 		return 0;
 	}
-	debug("session_input_channel_req: session %d req %s", s->self, rtype);
+	debug("%s: session %d req %s", __func__, s->self, rtype);
 
 	/*
 	 * a session is in LARVAL state until a shell, a command
@@ -2117,33 +2168,33 @@
 	 */
 	if (c->type == SSH_CHANNEL_LARVAL) {
 		if (strcmp(rtype, "shell") == 0) {
-			success = session_shell_req(s);
+			success = session_shell_req(ssh, s);
 		} else if (strcmp(rtype, "exec") == 0) {
-			success = session_exec_req(s);
+			success = session_exec_req(ssh, s);
 		} else if (strcmp(rtype, "pty-req") == 0) {
-			success = session_pty_req(s);
+			success = session_pty_req(ssh, s);
 		} else if (strcmp(rtype, "x11-req") == 0) {
-			success = session_x11_req(s);
+			success = session_x11_req(ssh, s);
 		} else if (strcmp(rtype, "auth-agent-req@openssh.com") == 0) {
-			success = session_auth_agent_req(s);
+			success = session_auth_agent_req(ssh, s);
 		} else if (strcmp(rtype, "subsystem") == 0) {
-			success = session_subsystem_req(s);
+			success = session_subsystem_req(ssh, s);
 		} else if (strcmp(rtype, "env") == 0) {
-			success = session_env_req(s);
+			success = session_env_req(ssh, s);
 		}
 	}
 	if (strcmp(rtype, "window-change") == 0) {
-		success = session_window_change_req(s);
+		success = session_window_change_req(ssh, s);
 	} else if (strcmp(rtype, "break") == 0) {
-		success = session_break_req(s);
+		success = session_break_req(ssh, s);
 	}
 
 	return success;
 }
 
 void
-session_set_fds(Session *s, int fdin, int fdout, int fderr, int ignore_fderr,
-    int is_tty)
+session_set_fds(struct ssh *ssh, Session *s,
+    int fdin, int fdout, int fderr, int ignore_fderr, int is_tty)
 {
 	/*
 	 * now that have a child and a pipe to the child,
@@ -2151,7 +2202,7 @@
 	 */
 	if (s->chanid == -1)
 		fatal("no channel for session %d", s->self);
-	channel_set_fds(s->chanid,
+	channel_set_fds(ssh, s->chanid,
 	    fdout, fdin, fderr,
 	    ignore_fderr ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ,
 	    1, is_tty, CHAN_SES_WINDOW_DEFAULT);
@@ -2222,40 +2273,40 @@
 }
 
 static void
-session_close_x11(int id)
+session_close_x11(struct ssh *ssh, int id)
 {
 	Channel *c;
 
-	if ((c = channel_by_id(id)) == NULL) {
-		debug("session_close_x11: x11 channel %d missing", id);
+	if ((c = channel_by_id(ssh, id)) == NULL) {
+		debug("%s: x11 channel %d missing", __func__, id);
 	} else {
 		/* Detach X11 listener */
-		debug("session_close_x11: detach x11 channel %d", id);
-		channel_cancel_cleanup(id);
+		debug("%s: detach x11 channel %d", __func__, id);
+		channel_cancel_cleanup(ssh, id);
 		if (c->ostate != CHAN_OUTPUT_CLOSED)
-			chan_mark_dead(c);
+			chan_mark_dead(ssh, c);
 	}
 }
 
 static void
-session_close_single_x11(int id, void *arg)
+session_close_single_x11(struct ssh *ssh, int id, void *arg)
 {
 	Session *s;
 	u_int i;
 
-	debug3("session_close_single_x11: channel %d", id);
-	channel_cancel_cleanup(id);
+	debug3("%s: channel %d", __func__, id);
+	channel_cancel_cleanup(ssh, id);
 	if ((s = session_by_x11_channel(id)) == NULL)
-		fatal("session_close_single_x11: no x11 channel %d", id);
+		fatal("%s: no x11 channel %d", __func__, id);
 	for (i = 0; s->x11_chanids[i] != -1; i++) {
-		debug("session_close_single_x11: session %d: "
-		    "closing channel %d", s->self, s->x11_chanids[i]);
+		debug("%s: session %d: closing channel %d",
+		    __func__, s->self, s->x11_chanids[i]);
 		/*
 		 * The channel "id" is already closing, but make sure we
 		 * close all of its siblings.
 		 */
 		if (s->x11_chanids[i] != id)
-			session_close_x11(s->x11_chanids[i]);
+			session_close_x11(ssh, s->x11_chanids[i]);
 	}
 	free(s->x11_chanids);
 	s->x11_chanids = NULL;
@@ -2270,22 +2321,22 @@
 }
 
 static void
-session_exit_message(Session *s, int status)
+session_exit_message(struct ssh *ssh, Session *s, int status)
 {
 	Channel *c;
 
-	if ((c = channel_lookup(s->chanid)) == NULL)
-		fatal("session_exit_message: session %d: no channel %d",
-		    s->self, s->chanid);
-	debug("session_exit_message: session %d channel %d pid %ld",
-	    s->self, s->chanid, (long)s->pid);
+	if ((c = channel_lookup(ssh, s->chanid)) == NULL)
+		fatal("%s: session %d: no channel %d",
+		    __func__, s->self, s->chanid);
+	debug("%s: session %d channel %d pid %ld",
+	    __func__, s->self, s->chanid, (long)s->pid);
 
 	if (WIFEXITED(status)) {
-		channel_request_start(s->chanid, "exit-status", 0);
+		channel_request_start(ssh, s->chanid, "exit-status", 0);
 		packet_put_int(WEXITSTATUS(status));
 		packet_send();
 	} else if (WIFSIGNALED(status)) {
-		channel_request_start(s->chanid, "exit-signal", 0);
+		channel_request_start(ssh, s->chanid, "exit-signal", 0);
 		packet_put_cstring(sig2name(WTERMSIG(status)));
 #ifdef WCOREDUMP
 		packet_put_char(WCOREDUMP(status)? 1 : 0);
@@ -2301,14 +2352,14 @@
 	}
 
 	/* disconnect channel */
-	debug("session_exit_message: release channel %d", s->chanid);
+	debug("%s: release channel %d", __func__, s->chanid);
 
 	/*
 	 * Adjust cleanup callback attachment to send close messages when
 	 * the channel gets EOF. The session will be then be closed
 	 * by session_close_by_channel when the childs close their fds.
 	 */
-	channel_register_cleanup(c->self, session_close_by_channel, 1);
+	channel_register_cleanup(ssh, c->self, session_close_by_channel, 1);
 
 	/*
 	 * emulate a write failure with 'chan_write_failed', nobody will be
@@ -2317,13 +2368,12 @@
 	 * be some more data waiting in the pipe.
 	 */
 	if (c->ostate != CHAN_OUTPUT_CLOSED)
-		chan_write_failed(c);
+		chan_write_failed(ssh, c);
 }
 
 void
-session_close(Session *s)
+session_close(struct ssh *ssh, Session *s)
 {
-	struct ssh *ssh = active_state; /* XXX */
 	u_int i;
 
 	verbose("Close session: user %s from %.200s port %d id %d",
@@ -2353,16 +2403,15 @@
 }
 
 void
-session_close_by_pid(pid_t pid, int status)
+session_close_by_pid(struct ssh *ssh, pid_t pid, int status)
 {
 	Session *s = session_by_pid(pid);
 	if (s == NULL) {
-		debug("session_close_by_pid: no session for pid %ld",
-		    (long)pid);
+		debug("%s: no session for pid %ld", __func__, (long)pid);
 		return;
 	}
 	if (s->chanid != -1)
-		session_exit_message(s, status);
+		session_exit_message(ssh, s, status);
 	if (s->ttyfd != -1)
 		session_pty_cleanup(s);
 	s->pid = 0;
@@ -2373,19 +2422,18 @@
  * the session 'child' itself dies
  */
 void
-session_close_by_channel(int id, void *arg)
+session_close_by_channel(struct ssh *ssh, int id, void *arg)
 {
 	Session *s = session_by_channel(id);
 	u_int i;
 
 	if (s == NULL) {
-		debug("session_close_by_channel: no session for id %d", id);
+		debug("%s: no session for id %d", __func__, id);
 		return;
 	}
-	debug("session_close_by_channel: channel %d child %ld",
-	    id, (long)s->pid);
+	debug("%s: channel %d child %ld", __func__, id, (long)s->pid);
 	if (s->pid != 0) {
-		debug("session_close_by_channel: channel %d: has child", id);
+		debug("%s: channel %d: has child", __func__, id);
 		/*
 		 * delay detach of session, but release pty, since
 		 * the fd's to the child are already closed
@@ -2395,22 +2443,22 @@
 		return;
 	}
 	/* detach by removing callback */
-	channel_cancel_cleanup(s->chanid);
+	channel_cancel_cleanup(ssh, s->chanid);
 
 	/* Close any X11 listeners associated with this session */
 	if (s->x11_chanids != NULL) {
 		for (i = 0; s->x11_chanids[i] != -1; i++) {
-			session_close_x11(s->x11_chanids[i]);
+			session_close_x11(ssh, s->x11_chanids[i]);
 			s->x11_chanids[i] = -1;
 		}
 	}
 
 	s->chanid = -1;
-	session_close(s);
+	session_close(ssh, s);
 }
 
 void
-session_destroy_all(void (*closefunc)(Session *))
+session_destroy_all(struct ssh *ssh, void (*closefunc)(Session *))
 {
 	int i;
 	for (i = 0; i < sessions_nalloc; i++) {
@@ -2419,7 +2467,7 @@
 			if (closefunc != NULL)
 				closefunc(s);
 			else
-				session_close(s);
+				session_close(ssh, s);
 		}
 	}
 }
@@ -2462,15 +2510,15 @@
 }
 
 int
-session_setup_x11fwd(Session *s)
+session_setup_x11fwd(struct ssh *ssh, Session *s)
 {
 	struct stat st;
 	char display[512], auth_display[512];
 	char hostname[NI_MAXHOST];
 	u_int i;
 
-	if (no_x11_forwarding_flag) {
-		packet_send_debug("X11 forwarding disabled in user configuration file.");
+	if (!auth_opts->permit_x11_forwarding_flag) {
+		packet_send_debug("X11 forwarding disabled by key options.");
 		return 0;
 	}
 	if (!options.x11_forwarding) {
@@ -2479,21 +2527,21 @@
 	}
 	if (options.xauth_location == NULL ||
 	    (stat(options.xauth_location, &st) == -1)) {
-		packet_send_debug("No xauth program; cannot forward with spoofing.");
+		packet_send_debug("No xauth program; cannot forward X11.");
 		return 0;
 	}
 	if (s->display != NULL) {
 		debug("X11 display already set.");
 		return 0;
 	}
-	if (x11_create_display_inet(options.x11_display_offset,
+	if (x11_create_display_inet(ssh, options.x11_display_offset,
 	    options.x11_use_localhost, s->single_connection,
 	    &s->display_number, &s->x11_chanids) == -1) {
 		debug("x11_create_display_inet failed.");
 		return 0;
 	}
 	for (i = 0; s->x11_chanids[i] != -1; i++) {
-		channel_register_cleanup(s->x11_chanids[i],
+		channel_register_cleanup(ssh, s->x11_chanids[i],
 		    session_close_single_x11, 0);
 	}
 
@@ -2538,13 +2586,13 @@
 }
 
 static void
-do_authenticated2(Authctxt *authctxt)
+do_authenticated2(struct ssh *ssh, Authctxt *authctxt)
 {
-	server_loop2(authctxt);
+	server_loop2(ssh, authctxt);
 }
 
 void
-do_cleanup(Authctxt *authctxt)
+do_cleanup(struct ssh *ssh, Authctxt *authctxt)
 {
 	static int called = 0;
 
@@ -2586,12 +2634,21 @@
 	/* remove agent socket */
 	auth_sock_cleanup_proc(authctxt->pw);
 
+	/* remove userauth info */
+	if (auth_info_file != NULL) {
+		temporarily_use_uid(authctxt->pw);
+		unlink(auth_info_file);
+		restore_uid();
+		free(auth_info_file);
+		auth_info_file = NULL;
+	}
+
 	/*
 	 * Cleanup ptys/utmp only if privsep is disabled,
 	 * or if running in monitor.
 	 */
 	if (!use_privsep || mm_is_monitor())
-		session_destroy_all(session_pty_cleanup2);
+		session_destroy_all(ssh, session_pty_cleanup2);
 }
 
 /* Return a name for the remote host that fits inside utmp_size */
diff --git a/session.h b/session.h
index 98e1daf..54dd1f0 100644
--- a/session.h
+++ b/session.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.h,v 1.33 2016/08/13 17:47:41 markus Exp $ */
+/* $OpenBSD: session.h,v 1.35 2017/09/12 06:32:07 djm Exp $ */
 
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
@@ -62,23 +62,21 @@
 	} *env;
 };
 
-void	 do_authenticated(Authctxt *);
-void	 do_cleanup(Authctxt *);
+void	 do_authenticated(struct ssh *, Authctxt *);
+void	 do_cleanup(struct ssh *, Authctxt *);
 
 int	 session_open(Authctxt *, int);
 void	 session_unused(int);
-int	 session_input_channel_req(Channel *, const char *);
-void	 session_close_by_pid(pid_t, int);
-void	 session_close_by_channel(int, void *);
-void	 session_destroy_all(void (*)(Session *));
+int	 session_input_channel_req(struct ssh *, Channel *, const char *);
+void	 session_close_by_pid(struct ssh *ssh, pid_t, int);
+void	 session_close_by_channel(struct ssh *, int, void *);
+void	 session_destroy_all(struct ssh *, void (*)(Session *));
 void	 session_pty_cleanup2(Session *);
 
 Session	*session_new(void);
 Session	*session_by_tty(char *);
-void	 session_close(Session *);
+void	 session_close(struct ssh *, Session *);
 void	 do_setusercontext(struct passwd *);
-void	 child_set_env(char ***envp, u_int *envsizep, const char *name,
-		       const char *value);
 
 const char	*session_get_remote_name_or_ip(struct ssh *, u_int, int);
 
diff --git a/sftp-client.c b/sftp-client.c
index d47be0e..4986d6d 100644
--- a/sftp-client.c
+++ b/sftp-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-client.c,v 1.126 2017/01/03 05:46:51 djm Exp $ */
+/* $OpenBSD: sftp-client.c,v 1.130 2018/07/31 03:07:24 djm Exp $ */
 /*
  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
  *
@@ -67,6 +67,13 @@
 /* Maximum depth to descend in directory trees */
 #define MAX_DIR_DEPTH 64
 
+/* Directory separator characters */
+#ifdef HAVE_CYGWIN
+# define SFTP_DIRECTORY_CHARS      "/\\"
+#else /* HAVE_CYGWIN */
+# define SFTP_DIRECTORY_CHARS      "/"
+#endif /* HAVE_CYGWIN */
+
 struct sftp_conn {
 	int fd_in;
 	int fd_out;
@@ -123,7 +130,7 @@
 }
 
 static void
-get_msg(struct sftp_conn *conn, struct sshbuf *m)
+get_msg_extended(struct sftp_conn *conn, struct sshbuf *m, int initial)
 {
 	u_int msg_len;
 	u_char *p;
@@ -133,7 +140,7 @@
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (atomicio6(read, conn->fd_in, p, 4,
 	    conn->limit_kbps > 0 ? sftpio : NULL, &conn->bwlimit_in) != 4) {
-		if (errno == EPIPE)
+		if (errno == EPIPE || errno == ECONNRESET)
 			fatal("Connection closed");
 		else
 			fatal("Couldn't read packet: %s", strerror(errno));
@@ -141,8 +148,12 @@
 
 	if ((r = sshbuf_get_u32(m, &msg_len)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	if (msg_len > SFTP_MAX_MSG_LENGTH)
-		fatal("Received message too long %u", msg_len);
+	if (msg_len > SFTP_MAX_MSG_LENGTH) {
+		do_log2(initial ? SYSLOG_LEVEL_ERROR : SYSLOG_LEVEL_FATAL,
+		    "Received message too long %u", msg_len);
+		fatal("Ensure the remote shell produces no output "
+		    "for non-interactive sessions.");
+	}
 
 	if ((r = sshbuf_reserve(m, msg_len, &p)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
@@ -157,6 +168,12 @@
 }
 
 static void
+get_msg(struct sftp_conn *conn, struct sshbuf *m)
+{
+	get_msg_extended(conn, m, 0);
+}
+
+static void
 send_string_request(struct sftp_conn *conn, u_int id, u_int code, const char *s,
     u_int len)
 {
@@ -399,7 +416,7 @@
 
 	sshbuf_reset(msg);
 
-	get_msg(ret, msg);
+	get_msg_extended(ret, msg, 1);
 
 	/* Expecting a VERSION reply */
 	if ((r = sshbuf_get_u8(msg, &type)) != 0)
@@ -619,7 +636,7 @@
 			 * These can be used to attack recursive ops
 			 * (e.g. send '../../../../etc/passwd')
 			 */
-			if (strchr(filename, '/') != NULL) {
+			if (strpbrk(filename, SFTP_DIRECTORY_CHARS) != NULL) {
 				error("Server sent suspect path \"%s\" "
 				    "during readdir of \"%s\"", filename, path);
 			} else if (dir) {
@@ -652,7 +669,7 @@
 		**dir = NULL;
 	}
 
-	return status;
+	return status == SSH2_FX_OK ? 0 : -1;
 }
 
 int
@@ -1002,7 +1019,7 @@
 	if (status != SSH2_FX_OK)
 		error("Couldn't sync file: %s", fx2txt(status));
 
-	return status;
+	return status == SSH2_FX_OK ? 0 : -1;
 }
 
 #ifdef notyet
@@ -1434,7 +1451,7 @@
 	sshbuf_free(msg);
 	free(handle);
 
-	return(status);
+	return status == SSH2_FX_OK ? 0 : -1;
 }
 
 static int
@@ -1444,7 +1461,7 @@
 {
 	int i, ret = 0;
 	SFTP_DIRENT **dir_entries;
-	char *filename, *new_src, *new_dst;
+	char *filename, *new_src = NULL, *new_dst = NULL;
 	mode_t mode = 0777;
 
 	if (depth >= MAX_DIR_DEPTH) {
@@ -1482,8 +1499,10 @@
 	}
 
 	for (i = 0; dir_entries[i] != NULL && !interrupted; i++) {
-		filename = dir_entries[i]->filename;
+		free(new_dst);
+		free(new_src);
 
+		filename = dir_entries[i]->filename;
 		new_dst = path_append(dst, filename);
 		new_src = path_append(src, filename);
 
@@ -1506,9 +1525,9 @@
 		} else
 			logit("%s: not a regular file\n", new_src);
 
-		free(new_dst);
-		free(new_src);
 	}
+	free(new_dst);
+	free(new_src);
 
 	if (preserve_flag) {
 		if (dirattrib->flags & SSH2_FILEXFER_ATTR_ACMODTIME) {
@@ -1776,7 +1795,7 @@
 	int ret = 0;
 	DIR *dirp;
 	struct dirent *dp;
-	char *filename, *new_src, *new_dst;
+	char *filename, *new_src = NULL, *new_dst = NULL;
 	struct stat sb;
 	Attrib a, *dirattrib;
 
@@ -1827,6 +1846,8 @@
 	while (((dp = readdir(dirp)) != NULL) && !interrupted) {
 		if (dp->d_ino == 0)
 			continue;
+		free(new_dst);
+		free(new_src);
 		filename = dp->d_name;
 		new_dst = path_append(dst, filename);
 		new_src = path_append(src, filename);
@@ -1853,9 +1874,9 @@
 			}
 		} else
 			logit("%s: not a regular file\n", filename);
-		free(new_dst);
-		free(new_src);
 	}
+	free(new_dst);
+	free(new_src);
 
 	do_setstat(conn, dst, &a);
 
diff --git a/sftp-common.c b/sftp-common.c
index 3a70c52..13a7f5b 100644
--- a/sftp-common.c
+++ b/sftp-common.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-common.c,v 1.29 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: sftp-common.c,v 1.30 2017/06/10 06:36:46 djm Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2001 Damien Miller.  All rights reserved.
@@ -216,22 +216,21 @@
 	int ulen, glen, sz = 0;
 	struct tm *ltime = localtime(&st->st_mtime);
 	char *user, *group;
-	char buf[1024], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1];
+	char buf[1024], lc[8], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1];
 	char sbuf[FMT_SCALED_STRSIZE];
 	time_t now;
 
 	strmode(st->st_mode, mode);
-	if (!remote) {
-		user = user_from_uid(st->st_uid, 0);
-	} else {
+	if (remote) {
 		snprintf(ubuf, sizeof ubuf, "%u", (u_int)st->st_uid);
 		user = ubuf;
-	}
-	if (!remote) {
-		group = group_from_gid(st->st_gid, 0);
-	} else {
 		snprintf(gbuf, sizeof gbuf, "%u", (u_int)st->st_gid);
 		group = gbuf;
+		strlcpy(lc, "?", sizeof(lc));
+	} else {
+		user = user_from_uid(st->st_uid, 0);
+		group = group_from_gid(st->st_gid, 0);
+		snprintf(lc, sizeof(lc), "%u", (u_int)st->st_nlink);
 	}
 	if (ltime != NULL) {
 		now = time(NULL);
@@ -247,12 +246,12 @@
 	glen = MAXIMUM(strlen(group), 8);
 	if (si_units) {
 		fmt_scaled((long long)st->st_size, sbuf);
-		snprintf(buf, sizeof buf, "%s %3u %-*s %-*s %8s %s %s", mode,
-		    (u_int)st->st_nlink, ulen, user, glen, group,
+		snprintf(buf, sizeof buf, "%s %3s %-*s %-*s %8s %s %s",
+		    mode, lc, ulen, user, glen, group,
 		    sbuf, tbuf, name);
 	} else {
-		snprintf(buf, sizeof buf, "%s %3u %-*s %-*s %8llu %s %s", mode,
-		    (u_int)st->st_nlink, ulen, user, glen, group,
+		snprintf(buf, sizeof buf, "%s %3s %-*s %-*s %8llu %s %s",
+		    mode, lc, ulen, user, glen, group,
 		    (unsigned long long)st->st_size, tbuf, name);
 	}
 	return xstrdup(buf);
diff --git a/sftp-server.c b/sftp-server.c
index a3be932..b0e9b4d 100644
--- a/sftp-server.c
+++ b/sftp-server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-server.c,v 1.110 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: sftp-server.c,v 1.112 2018/06/01 03:33:53 djm Exp $ */
 /*
  * Copyright (c) 2000-2004 Markus Friedl.  All rights reserved.
  *
@@ -691,8 +691,8 @@
 	logit("open \"%s\" flags %s mode 0%o",
 	    name, string_from_portable(pflags), mode);
 	if (readonly &&
-	    ((flags & O_ACCMODE) == O_WRONLY ||
-	    (flags & O_ACCMODE) == O_RDWR)) {
+	    ((flags & O_ACCMODE) != O_RDONLY ||
+	    (flags & (O_CREAT|O_TRUNC)) != 0)) {
 		verbose("Refusing open request in read-only mode");
 		status = SSH2_FX_PERMISSION_DENIED;
 	} else {
@@ -1503,7 +1503,7 @@
 	int i, r, in, out, max, ch, skipargs = 0, log_stderr = 0;
 	ssize_t len, olen, set_size;
 	SyslogFacility log_facility = SYSLOG_FACILITY_AUTH;
-	char *cp, *homedir = NULL, buf[4*4096];
+	char *cp, *homedir = NULL, uidstr[32], buf[4*4096];
 	long mask;
 
 	extern char *optarg;
@@ -1554,8 +1554,10 @@
 			break;
 		case 'd':
 			cp = tilde_expand_filename(optarg, user_pw->pw_uid);
+			snprintf(uidstr, sizeof(uidstr), "%llu",
+			    (unsigned long long)pw->pw_uid);
 			homedir = percent_expand(cp, "d", user_pw->pw_dir,
-			    "u", user_pw->pw_name, (char *)NULL);
+			    "u", user_pw->pw_name, "U", uidstr, (char *)NULL);
 			free(cp);
 			break;
 		case 'p':
diff --git a/sftp.1 b/sftp.1
index fbdd00a..a25d389 100644
--- a/sftp.1
+++ b/sftp.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: sftp.1,v 1.105 2016/07/16 06:57:55 jmc Exp $
+.\" $OpenBSD: sftp.1,v 1.119 2018/07/23 19:53:55 jmc Exp $
 .\"
 .\" Copyright (c) 2001 Damien Miller.  All rights reserved.
 .\"
@@ -22,7 +22,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd $Mdocdate: July 16 2016 $
+.Dd $Mdocdate: July 23 2018 $
 .Dt SFTP 1
 .Os
 .Sh NAME
@@ -30,8 +30,7 @@
 .Nd secure file transfer program
 .Sh SYNOPSIS
 .Nm sftp
-.Bk -words
-.Op Fl 1246aCfpqrv
+.Op Fl 46aCfpqrv
 .Op Fl B Ar buffer_size
 .Op Fl b Ar batchfile
 .Op Fl c Ar cipher
@@ -44,61 +43,58 @@
 .Op Fl R Ar num_requests
 .Op Fl S Ar program
 .Op Fl s Ar subsystem | sftp_server
-.Ar host
-.Ek
-.Nm sftp
-.Oo Ar user Ns @ Oc Ns
-.Ar host Ns Op : Ns Ar
-.Nm sftp
-.Oo
-.Ar user Ns @ Oc Ns
-.Ar host Ns Oo : Ns Ar dir Ns
-.Op Ar /
-.Oc
-.Nm sftp
-.Fl b Ar batchfile
-.Oo Ar user Ns @ Oc Ns Ar host
+.Ar destination
 .Sh DESCRIPTION
 .Nm
-is an interactive file transfer program, similar to
+is a file transfer program, similar to
 .Xr ftp 1 ,
 which performs all operations over an encrypted
 .Xr ssh 1
 transport.
 It may also use many features of ssh, such as public key authentication and
 compression.
-.Nm
-connects and logs into the specified
-.Ar host ,
-then enters an interactive command mode.
 .Pp
-The second usage format will retrieve files automatically if a non-interactive
+The
+.Ar destination
+may be specified either as
+.Sm off
+.Oo user @ Oc host Op : path
+.Sm on
+or as a URI in the form
+.Sm off
+.No sftp:// Oo user @ Oc host Oo : port Oc Op / path .
+.Sm on
+.Pp
+If the
+.Ar destination
+includes a
+.Ar path
+and it is not a directory,
+.Nm
+will retrieve files automatically if a non-interactive
 authentication method is used; otherwise it will do so after
 successful interactive authentication.
 .Pp
-The third usage format allows
+If no
+.Ar path
+is specified, or if the
+.Ar path
+is a directory,
 .Nm
-to start in a remote directory.
+will log in to the specified
+.Ar host
+and enter interactive command mode, changing to the remote directory
+if one was specified.
+An optional trailing slash can be used to force the
+.Ar path
+to be interpreted as a directory.
 .Pp
-The final usage format allows for automated sessions using the
-.Fl b
-option.
-In such cases, it is necessary to configure non-interactive authentication
-to obviate the need to enter a password at connection time (see
-.Xr sshd 8
-and
-.Xr ssh-keygen 1
-for details).
-.Pp
-Since some usage formats use colon characters to delimit host names from path
-names, IPv6 addresses must be enclosed in square brackets to avoid ambiguity.
+Since the destination formats use colon characters to delimit host
+names from path names or port numbers, IPv6 addresses must be
+enclosed in square brackets to avoid ambiguity.
 .Pp
 The options are as follows:
 .Bl -tag -width Ds
-.It Fl 1
-Specify the use of protocol version 1.
-.It Fl 2
-Specify the use of protocol version 2.
 .It Fl 4
 Forces
 .Nm
@@ -125,7 +121,12 @@
 instead of
 .Em stdin .
 Since it lacks user interaction it should be used in conjunction with
-non-interactive authentication.
+non-interactive authentication to obviate the need to enter a password
+at connection time (see
+.Xr sshd 8
+and
+.Xr ssh-keygen 1
+for details).
 A
 .Ar batchfile
 of
@@ -193,6 +194,7 @@
 .It AddressFamily
 .It BatchMode
 .It BindAddress
+.It BindInterface
 .It CanonicalDomains
 .It CanonicalizeFallbackLocal
 .It CanonicalizeHostname
@@ -201,10 +203,8 @@
 .It CertificateFile
 .It ChallengeResponseAuthentication
 .It CheckHostIP
-.It Cipher
 .It Ciphers
 .It Compression
-.It CompressionLevel
 .It ConnectionAttempts
 .It ConnectTimeout
 .It ControlMaster
@@ -235,20 +235,18 @@
 .It PKCS11Provider
 .It Port
 .It PreferredAuthentications
-.It Protocol
 .It ProxyCommand
 .It ProxyJump
+.It PubkeyAcceptedKeyTypes
 .It PubkeyAuthentication
 .It RekeyLimit
-.It RhostsRSAAuthentication
-.It RSAAuthentication
 .It SendEnv
 .It ServerAliveInterval
 .It ServerAliveCountMax
+.It SetEnv
 .It StrictHostKeyChecking
 .It TCPKeepAlive
 .It UpdateHostKeys
-.It UsePrivilegedPort
 .It User
 .It UserKnownHostsFile
 .It VerifyHostKeyDNS
@@ -282,9 +280,7 @@
 .It Fl s Ar subsystem | sftp_server
 Specifies the SSH2 subsystem or the path for an sftp server
 on the remote host.
-A path is useful for using
-.Nm
-over protocol version 1, or when the remote
+A path is useful when the remote
 .Xr sshd 8
 does not have an sftp subsystem configured.
 .It Fl v
@@ -306,9 +302,12 @@
 .It Ic bye
 Quit
 .Nm sftp .
-.It Ic cd Ar path
+.It Ic cd Op Ar path
 Change remote directory to
 .Ar path .
+If
+.Ar path
+is not specified, then change directory to the one the session started in.
 .It Ic chgrp Ar grp Ar path
 Change group of file
 .Ar path
@@ -316,7 +315,7 @@
 .Ar grp .
 .Ar path
 may contain
-.Xr glob 3
+.Xr glob 7
 characters and may match multiple files.
 .Ar grp
 must be a numeric GID.
@@ -327,7 +326,7 @@
 .Ar mode .
 .Ar path
 may contain
-.Xr glob 3
+.Xr glob 7
 characters and may match multiple files.
 .It Ic chown Ar own Ar path
 Change owner of file
@@ -336,7 +335,7 @@
 .Ar own .
 .Ar path
 may contain
-.Xr glob 3
+.Xr glob 7
 characters and may match multiple files.
 .Ar own
 must be a numeric UID.
@@ -374,7 +373,7 @@
 remote machine.
 .Ar remote-path
 may contain
-.Xr glob 3
+.Xr glob 7
 characters and may match multiple files.
 If it does and
 .Ar local-path
@@ -412,9 +411,12 @@
 does not follow symbolic links when performing recursive transfers.
 .It Ic help
 Display help text.
-.It Ic lcd Ar path
+.It Ic lcd Op Ar path
 Change local directory to
 .Ar path .
+If
+.Ar path
+is not specified, then change directory to the local user's home directory.
 .It Ic lls Op Ar ls-options Op Ar path
 Display local directory listing of either
 .Ar path
@@ -427,7 +429,7 @@
 command.
 .Ar path
 may contain
-.Xr glob 3
+.Xr glob 7
 characters and may match multiple files.
 .It Ic lmkdir Ar path
 Create local directory specified by
@@ -458,7 +460,7 @@
 is not specified.
 .Ar path
 may contain
-.Xr glob 3
+.Xr glob 7
 characters and may match multiple files.
 .Pp
 The following flags are recognized and alter the behaviour of
@@ -511,7 +513,7 @@
 on the local machine.
 .Ar local-path
 may contain
-.Xr glob 3
+.Xr glob 7
 characters and may match multiple files.
 If it does and
 .Ar remote-path
@@ -614,8 +616,8 @@
 .Xr ssh 1 ,
 .Xr ssh-add 1 ,
 .Xr ssh-keygen 1 ,
-.Xr glob 3 ,
 .Xr ssh_config 5 ,
+.Xr glob 7 ,
 .Xr sftp-server 8 ,
 .Xr sshd 8
 .Rs
diff --git a/sftp.c b/sftp.c
index 76add39..d068f7e 100644
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp.c,v 1.178 2017/02/15 01:46:47 djm Exp $ */
+/* $OpenBSD: sftp.c,v 1.185 2018/04/26 14:47:03 bluhm Exp $ */
 /*
  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
  *
@@ -81,7 +81,7 @@
 int batchmode = 0;
 
 /* PID of ssh transport process */
-static pid_t sshpid = -1;
+static volatile pid_t sshpid = -1;
 
 /* Suppress diagnositic messages */
 int quiet = 0;
@@ -106,6 +106,7 @@
 
 /* I wish qsort() took a separate ctx for the comparison function...*/
 int sort_flag;
+glob_t *sort_glob;
 
 /* Context used for commandline completion */
 struct complete_ctx {
@@ -216,8 +217,6 @@
 	{ NULL,		-1,		-1	}
 };
 
-int interactive_loop(struct sftp_conn *, char *file1, char *file2);
-
 /* ARGSUSED */
 static void
 killchild(int signo)
@@ -254,6 +253,25 @@
 	errno = olderrno;
 }
 
+/*ARGSUSED*/
+static void
+sigchld_handler(int sig)
+{
+	int save_errno = errno;
+	pid_t pid;
+	const char msg[] = "\rConnection closed.  \n";
+
+	/* Report if ssh transport process dies. */
+	while ((pid = waitpid(sshpid, NULL, WNOHANG)) == -1 && errno == EINTR)
+		continue;
+	if (pid == sshpid) {
+		(void)write(STDERR_FILENO, msg, sizeof(msg) - 1);
+		sshpid = -1;
+	}
+
+	errno = save_errno;
+}
+
 static void
 help(void)
 {
@@ -879,6 +897,34 @@
 	return (0);
 }
 
+static int
+sglob_comp(const void *aa, const void *bb)
+{
+	u_int a = *(const u_int *)aa;
+	u_int b = *(const u_int *)bb;
+	const char *ap = sort_glob->gl_pathv[a];
+	const char *bp = sort_glob->gl_pathv[b];
+	const struct stat *as = sort_glob->gl_statv[a];
+	const struct stat *bs = sort_glob->gl_statv[b];
+	int rmul = sort_flag & LS_REVERSE_SORT ? -1 : 1;
+
+#define NCMP(a,b) (a == b ? 0 : (a < b ? 1 : -1))
+	if (sort_flag & LS_NAME_SORT)
+		return (rmul * strcmp(ap, bp));
+	else if (sort_flag & LS_TIME_SORT) {
+#if defined(HAVE_STRUCT_STAT_ST_MTIM)
+		return (rmul * timespeccmp(&as->st_mtim, &bs->st_mtim, <));
+#elif defined(HAVE_STRUCT_STAT_ST_MTIME)
+		return (rmul * NCMP(as->st_mtime, bs->st_mtime));
+#else
+	return rmul * 1;
+#endif
+	} else if (sort_flag & LS_SIZE_SORT)
+		return (rmul * NCMP(as->st_size, bs->st_size));
+
+	fatal("Unknown ls sort type");
+}
+
 /* sftp ls.1 replacement which handles path globs */
 static int
 do_globbed_ls(struct sftp_conn *conn, const char *path,
@@ -888,7 +934,8 @@
 	glob_t g;
 	int err, r;
 	struct winsize ws;
-	u_int i, c = 1, colspace = 0, columns = 1, m = 0, width = 80;
+	u_int i, j, nentries, *indices = NULL, c = 1;
+	u_int colspace = 0, columns = 1, m = 0, width = 80;
 
 	memset(&g, 0, sizeof(g));
 
@@ -933,7 +980,26 @@
 		colspace = width / columns;
 	}
 
-	for (i = 0; g.gl_pathv[i] && !interrupted; i++) {
+	/*
+	 * Sorting: rather than mess with the contents of glob_t, prepare
+	 * an array of indices into it and sort that. For the usual
+	 * unsorted case, the indices are just the identity 1=1, 2=2, etc.
+	 */
+	for (nentries = 0; g.gl_pathv[nentries] != NULL; nentries++)
+		;	/* count entries */
+	indices = calloc(nentries, sizeof(*indices));
+	for (i = 0; i < nentries; i++)
+		indices[i] = i;
+
+	if (lflag & SORT_FLAGS) {
+		sort_glob = &g;
+		sort_flag = lflag & (SORT_FLAGS|LS_REVERSE_SORT);
+		qsort(indices, nentries, sizeof(*indices), sglob_comp);
+		sort_glob = NULL;
+	}
+
+	for (j = 0; j < nentries && !interrupted; j++) {
+		i = indices[j];
 		fname = path_strip(g.gl_pathv[i], strip_path);
 		if (lflag & LS_LONG_VIEW) {
 			if (g.gl_statv[i] == NULL) {
@@ -961,6 +1027,7 @@
  out:
 	if (g.gl_pathc)
 		globfree(&g);
+	free(indices);
 
 	return 0;
 }
@@ -1238,7 +1305,7 @@
 	char *cp2, **argv;
 	int base = 0;
 	long l;
-	int i, cmdnum, optidx, argc;
+	int path1_mandatory = 0, i, cmdnum, optidx, argc;
 
 	/* Skip leading whitespace */
 	cp = cp + strspn(cp, WHITESPACE);
@@ -1328,13 +1395,17 @@
 	case I_RM:
 	case I_MKDIR:
 	case I_RMDIR:
+	case I_LMKDIR:
+		path1_mandatory = 1;
+		/* FALLTHROUGH */
 	case I_CHDIR:
 	case I_LCHDIR:
-	case I_LMKDIR:
 		if ((optidx = parse_no_flags(cmd, argv, argc)) == -1)
 			return -1;
 		/* Get pathname (mandatory) */
 		if (argc - optidx < 1) {
+			if (!path1_mandatory)
+				break; /* return a NULL path1 */
 			error("You must specify a path after a %s command.",
 			    cmd);
 			return -1;
@@ -1419,7 +1490,7 @@
 
 static int
 parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
-    int err_abort)
+    const char *startdir, int err_abort)
 {
 	char *path1, *path2, *tmp;
 	int ignore_errors = 0, aflag = 0, fflag = 0, hflag = 0,
@@ -1499,6 +1570,8 @@
 		err = do_rmdir(conn, path1);
 		break;
 	case I_CHDIR:
+		if (path1 == NULL || *path1 == '\0')
+			path1 = xstrdup(startdir);
 		path1 = make_absolute(path1, *pwd);
 		if ((tmp = do_realpath(conn, path1)) == NULL) {
 			err = 1;
@@ -1547,6 +1620,8 @@
 		err = do_df(conn, path1, hflag, iflag);
 		break;
 	case I_LCHDIR:
+		if (path1 == NULL || *path1 == '\0')
+			path1 = xstrdup("~");
 		tmp = tilde_expand_filename(path1, getuid());
 		free(path1);
 		path1 = tmp;
@@ -1788,7 +1863,7 @@
 		return 0;
 	}
 
-	/* Complete ambigious command */
+	/* Complete ambiguous command */
 	tmp = complete_ambiguous(cmd, list, count);
 	if (count > 1)
 		complete_display(list, 0);
@@ -2033,11 +2108,11 @@
 }
 #endif /* USE_LIBEDIT */
 
-int
+static int
 interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
 {
 	char *remote_path;
-	char *dir = NULL;
+	char *dir = NULL, *startdir = NULL;
 	char cmd[2048];
 	int err, interactive;
 	EditLine *el = NULL;
@@ -2081,6 +2156,7 @@
 	remote_path = do_realpath(conn, ".");
 	if (remote_path == NULL)
 		fatal("Need cwd");
+	startdir = xstrdup(remote_path);
 
 	if (file1 != NULL) {
 		dir = xstrdup(file1);
@@ -2091,8 +2167,9 @@
 				mprintf("Changing to: %s\n", dir);
 			snprintf(cmd, sizeof cmd, "cd \"%s\"", dir);
 			if (parse_dispatch_command(conn, cmd,
-			    &remote_path, 1) != 0) {
+			    &remote_path, startdir, 1) != 0) {
 				free(dir);
+				free(startdir);
 				free(remote_path);
 				free(conn);
 				return (-1);
@@ -2104,8 +2181,9 @@
 			    file2 == NULL ? "" : " ",
 			    file2 == NULL ? "" : file2);
 			err = parse_dispatch_command(conn, cmd,
-			    &remote_path, 1);
+			    &remote_path, startdir, 1);
 			free(dir);
+			free(startdir);
 			free(remote_path);
 			free(conn);
 			return (err);
@@ -2164,11 +2242,13 @@
 		signal(SIGINT, cmd_interrupt);
 
 		err = parse_dispatch_command(conn, cmd, &remote_path,
-		    batchmode);
+		    startdir, batchmode);
 		if (err != 0)
 			break;
 	}
+	signal(SIGCHLD, SIG_DFL);
 	free(remote_path);
+	free(startdir);
 	free(conn);
 
 #ifdef USE_LIBEDIT
@@ -2236,6 +2316,7 @@
 	signal(SIGTSTP, suspchild);
 	signal(SIGTTIN, suspchild);
 	signal(SIGTTOU, suspchild);
+	signal(SIGCHLD, sigchld_handler);
 	close(c_in);
 	close(c_out);
 }
@@ -2246,24 +2327,21 @@
 	extern char *__progname;
 
 	fprintf(stderr,
-	    "usage: %s [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher]\n"
+	    "usage: %s [-46aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher]\n"
 	    "          [-D sftp_server_path] [-F ssh_config] "
 	    "[-i identity_file] [-l limit]\n"
 	    "          [-o ssh_option] [-P port] [-R num_requests] "
 	    "[-S program]\n"
-	    "          [-s subsystem | sftp_server] host\n"
-	    "       %s [user@]host[:file ...]\n"
-	    "       %s [user@]host[:dir[/]]\n"
-	    "       %s -b batchfile [user@]host\n",
-	    __progname, __progname, __progname, __progname);
+	    "          [-s subsystem | sftp_server] destination\n",
+	    __progname);
 	exit(1);
 }
 
 int
 main(int argc, char **argv)
 {
-	int in, out, ch, err;
-	char *host = NULL, *userhost, *cp, *file2 = NULL;
+	int in, out, ch, err, tmp, port = -1;
+	char *host = NULL, *user, *cp, *file2 = NULL;
 	int debug_level = 0, sshver = 2;
 	char *file1 = NULL, *sftp_server = NULL;
 	char *ssh_program = _PATH_SSH_PROGRAM, *sftp_direct = NULL;
@@ -2318,7 +2396,9 @@
 			addargs(&args, "-%c", ch);
 			break;
 		case 'P':
-			addargs(&args, "-oPort %s", optarg);
+			port = a2port(optarg);
+			if (port <= 0)
+				fatal("Bad port \"%s\"\n", optarg);
 			break;
 		case 'v':
 			if (debug_level < 3) {
@@ -2401,33 +2481,38 @@
 	if (sftp_direct == NULL) {
 		if (optind == argc || argc > (optind + 2))
 			usage();
+		argv += optind;
 
-		userhost = xstrdup(argv[optind]);
-		file2 = argv[optind+1];
-
-		if ((host = strrchr(userhost, '@')) == NULL)
-			host = userhost;
-		else {
-			*host++ = '\0';
-			if (!userhost[0]) {
-				fprintf(stderr, "Missing username\n");
-				usage();
+		switch (parse_uri("sftp", *argv, &user, &host, &tmp, &file1)) {
+		case -1:
+			usage();
+			break;
+		case 0:
+			if (tmp != -1)
+				port = tmp;
+			break;
+		default:
+			if (parse_user_host_path(*argv, &user, &host,
+			    &file1) == -1) {
+				/* Treat as a plain hostname. */
+				host = xstrdup(*argv);
+				host = cleanhostname(host);
 			}
-			addargs(&args, "-l");
-			addargs(&args, "%s", userhost);
+			break;
 		}
+		file2 = *(argv + 1);
 
-		if ((cp = colon(host)) != NULL) {
-			*cp++ = '\0';
-			file1 = cp;
-		}
-
-		host = cleanhostname(host);
 		if (!*host) {
 			fprintf(stderr, "Missing hostname\n");
 			usage();
 		}
 
+		if (port != -1)
+			addargs(&args, "-oPort %d", port);
+		if (user != NULL) {
+			addargs(&args, "-l");
+			addargs(&args, "%s", user);
+		}
 		addargs(&args, "-oProtocol %d", sshver);
 
 		/* no subsystem if the server-spec contains a '/' */
@@ -2471,7 +2556,7 @@
 	if (batchmode)
 		fclose(infile);
 
-	while (waitpid(sshpid, NULL, 0) == -1)
+	while (waitpid(sshpid, NULL, 0) == -1 && sshpid > 1)
 		if (errno != EINTR)
 			fatal("Couldn't wait for ssh process: %s",
 			    strerror(errno));
diff --git a/ssh-add.1 b/ssh-add.1
index f02b595..d5da927 100644
--- a/ssh-add.1
+++ b/ssh-add.1
@@ -1,4 +1,4 @@
-.\"	$OpenBSD: ssh-add.1,v 1.62 2015/03/30 18:28:37 jmc Exp $
+.\"	$OpenBSD: ssh-add.1,v 1.66 2017/08/29 13:05:58 jmc Exp $
 .\"
 .\" Author: Tatu Ylonen <ylo@cs.hut.fi>
 .\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -35,7 +35,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd $Mdocdate: March 30 2015 $
+.Dd $Mdocdate: August 29 2017 $
 .Dt SSH-ADD 1
 .Os
 .Sh NAME
@@ -43,7 +43,7 @@
 .Nd adds private key identities to the authentication agent
 .Sh SYNOPSIS
 .Nm ssh-add
-.Op Fl cDdkLlXx
+.Op Fl cDdkLlqXx
 .Op Fl E Ar fingerprint_hash
 .Op Fl t Ar life
 .Op Ar
@@ -59,9 +59,8 @@
 .Pa ~/.ssh/id_rsa ,
 .Pa ~/.ssh/id_dsa ,
 .Pa ~/.ssh/id_ecdsa ,
-.Pa ~/.ssh/id_ed25519
 and
-.Pa ~/.ssh/identity .
+.Pa ~/.ssh/id_ed25519 .
 After loading a private key,
 .Nm
 will try to load corresponding certificate information from the
@@ -127,6 +126,8 @@
 by the agent.
 .It Fl l
 Lists fingerprints of all identities currently represented by the agent.
+.It Fl q
+Be quiet after a successful operation.
 .It Fl s Ar pkcs11
 Add keys provided by the PKCS#11 shared library
 .Ar pkcs11 .
@@ -174,16 +175,14 @@
 .El
 .Sh FILES
 .Bl -tag -width Ds
-.It Pa ~/.ssh/identity
-Contains the protocol version 1 RSA authentication identity of the user.
 .It Pa ~/.ssh/id_dsa
-Contains the protocol version 2 DSA authentication identity of the user.
+Contains the DSA authentication identity of the user.
 .It Pa ~/.ssh/id_ecdsa
-Contains the protocol version 2 ECDSA authentication identity of the user.
+Contains the ECDSA authentication identity of the user.
 .It Pa ~/.ssh/id_ed25519
-Contains the protocol version 2 Ed25519 authentication identity of the user.
+Contains the Ed25519 authentication identity of the user.
 .It Pa ~/.ssh/id_rsa
-Contains the protocol version 2 RSA authentication identity of the user.
+Contains the RSA authentication identity of the user.
 .El
 .Pp
 Identity files should not be readable by anyone but the user.
diff --git a/ssh-add.c b/ssh-add.c
index fb9a53e..adcc459 100644
--- a/ssh-add.c
+++ b/ssh-add.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-add.c,v 1.128 2016/02/15 09:47:49 dtucker Exp $ */
+/* $OpenBSD: ssh-add.c,v 1.135 2018/02/23 15:58:37 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -55,7 +55,6 @@
 
 #include "xmalloc.h"
 #include "ssh.h"
-#include "rsa.h"
 #include "log.h"
 #include "sshkey.h"
 #include "sshbuf.h"
@@ -79,9 +78,7 @@
 #endif
 #endif /* WITH_OPENSSL */
 	_PATH_SSH_CLIENT_ID_ED25519,
-#ifdef WITH_SSH1
-	_PATH_SSH_CLIENT_IDENTITY,
-#endif
+	_PATH_SSH_CLIENT_ID_XMSS,
 	NULL
 };
 
@@ -93,6 +90,10 @@
 /* User has to confirm key use */
 static int confirm = 0;
 
+/* Maximum number of signatures (XMSS) */
+static u_int maxsign = 0;
+static u_int minleft = 0;
+
 /* we keep a cache of one passphrase */
 static char *pass = NULL;
 static void
@@ -106,7 +107,7 @@
 }
 
 static int
-delete_file(int agent_fd, const char *filename, int key_only)
+delete_file(int agent_fd, const char *filename, int key_only, int qflag)
 {
 	struct sshkey *public, *cert = NULL;
 	char *certpath = NULL, *comment = NULL;
@@ -117,7 +118,10 @@
 		return -1;
 	}
 	if ((r = ssh_remove_identity(agent_fd, public)) == 0) {
-		fprintf(stderr, "Identity removed: %s (%s)\n", filename, comment);
+		if (!qflag) {
+			fprintf(stderr, "Identity removed: %s (%s)\n",
+			    filename, comment);
+		}
 		ret = 0;
 	} else
 		fprintf(stderr, "Could not remove identity \"%s\": %s\n",
@@ -142,8 +146,10 @@
 		    certpath, filename);
 
 	if ((r = ssh_remove_identity(agent_fd, cert)) == 0) {
-		fprintf(stderr, "Identity removed: %s (%s)\n", certpath,
-		    comment);
+		if (!qflag) {
+			fprintf(stderr, "Identity removed: %s (%s)\n",
+			    certpath, comment);
+		}
 		ret = 0;
 	} else
 		fprintf(stderr, "Could not remove identity \"%s\": %s\n",
@@ -164,6 +170,11 @@
 {
 	int ret = -1;
 
+	/*
+	 * Since the agent might be forwarded, old or non-OpenSSH, when asked
+	 * to remove all keys, attempt to remove both protocol v.1 and v.2
+	 * keys.
+	 */
 	if (ssh_remove_all_identities(agent_fd, 2) == 0)
 		ret = 0;
 	/* ignore error-code for ssh1 */
@@ -178,13 +189,16 @@
 }
 
 static int
-add_file(int agent_fd, const char *filename, int key_only)
+add_file(int agent_fd, const char *filename, int key_only, int qflag)
 {
 	struct sshkey *private, *cert;
 	char *comment = NULL;
 	char msg[1024], *certpath = NULL;
 	int r, fd, ret = -1;
+	size_t i;
+	u_int32_t left;
 	struct sshbuf *keyblob;
+	struct ssh_identitylist *idlist;
 
 	if (strcmp(filename, "-") == 0) {
 		fd = STDIN_FILENO;
@@ -262,8 +276,40 @@
 		comment = xstrdup(filename);
 	sshbuf_free(keyblob);
 
+	/* For XMSS */
+	if ((r = sshkey_set_filename(private, filename)) != 0) {
+		fprintf(stderr, "Could not add filename to private key: %s (%s)\n",
+		    filename, comment);
+		goto out;
+	}
+	if (maxsign && minleft &&
+	    (r = ssh_fetch_identitylist(agent_fd, &idlist)) == 0) {
+		for (i = 0; i < idlist->nkeys; i++) {
+			if (!sshkey_equal_public(idlist->keys[i], private))
+				continue;
+			left = sshkey_signatures_left(idlist->keys[i]);
+			if (left < minleft) {
+				fprintf(stderr,
+				    "Only %d signatures left.\n", left);
+				break;
+			}
+			fprintf(stderr, "Skipping update: ");
+			if (left == minleft) {
+				fprintf(stderr,
+				   "required signatures left (%d).\n", left);
+			} else {
+				fprintf(stderr,
+				   "more signatures left (%d) than"
+				    " required (%d).\n", left, minleft);
+			}
+			ssh_free_identitylist(idlist);
+			goto out;
+		}
+		ssh_free_identitylist(idlist);
+	}
+
 	if ((r = ssh_add_identity_constrained(agent_fd, private, comment,
-	    lifetime, confirm)) == 0) {
+	    lifetime, confirm, maxsign)) == 0) {
 		fprintf(stderr, "Identity added: %s (%s)\n", filename, comment);
 		ret = 0;
 		if (lifetime != 0)
@@ -304,14 +350,14 @@
 		goto out;
 	}
 	if ((r = sshkey_cert_copy(cert, private)) != 0) {
-		error("%s: key_cert_copy: %s", __func__, ssh_err(r));
+		error("%s: sshkey_cert_copy: %s", __func__, ssh_err(r));
 		sshkey_free(cert);
 		goto out;
 	}
 	sshkey_free(cert);
 
 	if ((r = ssh_add_identity_constrained(agent_fd, private, comment,
-	    lifetime, confirm)) != 0) {
+	    lifetime, confirm, maxsign)) != 0) {
 		error("Certificate %s (%s) add failed: %s", certpath,
 		    private->cert->key_id, ssh_err(r));
 		goto out;
@@ -360,50 +406,42 @@
 list_identities(int agent_fd, int do_fp)
 {
 	char *fp;
-	int r, had_identities = 0;
+	int r;
 	struct ssh_identitylist *idlist;
+	u_int32_t left;
 	size_t i;
-#ifdef WITH_SSH1
-	int version = 1;
-#else
-	int version = 2;
-#endif
 
-	for (; version <= 2; version++) {
-		if ((r = ssh_fetch_identitylist(agent_fd, version,
-		    &idlist)) != 0) {
-			if (r != SSH_ERR_AGENT_NO_IDENTITIES)
-				fprintf(stderr, "error fetching identities for "
-				    "protocol %d: %s\n", version, ssh_err(r));
-			continue;
-		}
-		for (i = 0; i < idlist->nkeys; i++) {
-			had_identities = 1;
-			if (do_fp) {
-				fp = sshkey_fingerprint(idlist->keys[i],
-				    fingerprint_hash, SSH_FP_DEFAULT);
-				printf("%u %s %s (%s)\n",
-				    sshkey_size(idlist->keys[i]),
-				    fp == NULL ? "(null)" : fp,
-				    idlist->comments[i],
-				    sshkey_type(idlist->keys[i]));
-				free(fp);
-			} else {
-				if ((r = sshkey_write(idlist->keys[i],
-				    stdout)) != 0) {
-					fprintf(stderr, "sshkey_write: %s\n",
-					    ssh_err(r));
-					continue;
-				}
-				fprintf(stdout, " %s\n", idlist->comments[i]);
-			}
-		}
-		ssh_free_identitylist(idlist);
-	}
-	if (!had_identities) {
-		printf("The agent has no identities.\n");
+	if ((r = ssh_fetch_identitylist(agent_fd, &idlist)) != 0) {
+		if (r != SSH_ERR_AGENT_NO_IDENTITIES)
+			fprintf(stderr, "error fetching identities: %s\n",
+			    ssh_err(r));
+		else
+			printf("The agent has no identities.\n");
 		return -1;
 	}
+	for (i = 0; i < idlist->nkeys; i++) {
+		if (do_fp) {
+			fp = sshkey_fingerprint(idlist->keys[i],
+			    fingerprint_hash, SSH_FP_DEFAULT);
+			printf("%u %s %s (%s)\n", sshkey_size(idlist->keys[i]),
+			    fp == NULL ? "(null)" : fp, idlist->comments[i],
+			    sshkey_type(idlist->keys[i]));
+			free(fp);
+		} else {
+			if ((r = sshkey_write(idlist->keys[i], stdout)) != 0) {
+				fprintf(stderr, "sshkey_write: %s\n",
+				    ssh_err(r));
+				continue;
+			}
+			fprintf(stdout, " %s", idlist->comments[i]);
+			left = sshkey_signatures_left(idlist->keys[i]);
+			if (left > 0)
+				fprintf(stdout,
+				    " [signatures left %d]", left);
+			fprintf(stdout, "\n");
+		}
+	}
+	ssh_free_identitylist(idlist);
 	return 0;
 }
 
@@ -440,13 +478,13 @@
 }
 
 static int
-do_file(int agent_fd, int deleting, int key_only, char *file)
+do_file(int agent_fd, int deleting, int key_only, char *file, int qflag)
 {
 	if (deleting) {
-		if (delete_file(agent_fd, file, key_only) == -1)
+		if (delete_file(agent_fd, file, key_only, qflag) == -1)
 			return -1;
 	} else {
-		if (add_file(agent_fd, file, key_only) == -1)
+		if (add_file(agent_fd, file, key_only, qflag) == -1)
 			return -1;
 	}
 	return 0;
@@ -462,6 +500,8 @@
 	fprintf(stderr, "  -L          List public key parameters of all identities.\n");
 	fprintf(stderr, "  -k          Load only keys and not certificates.\n");
 	fprintf(stderr, "  -c          Require confirmation to sign using identities\n");
+	fprintf(stderr, "  -m minleft  Maxsign is only changed if less than minleft are left (for XMSS)\n");
+	fprintf(stderr, "  -M maxsign  Maximum number of signatures allowed (for XMSS)\n");
 	fprintf(stderr, "  -t life     Set lifetime (in seconds) when adding identities.\n");
 	fprintf(stderr, "  -d          Delete identity.\n");
 	fprintf(stderr, "  -D          Delete all identities.\n");
@@ -469,6 +509,7 @@
 	fprintf(stderr, "  -X          Unlock agent.\n");
 	fprintf(stderr, "  -s pkcs11   Add keys from PKCS#11 provider.\n");
 	fprintf(stderr, "  -e pkcs11   Remove keys provided by PKCS#11 provider.\n");
+	fprintf(stderr, "  -q          Be quiet after a successful operation.\n");
 }
 
 int
@@ -479,7 +520,7 @@
 	int agent_fd;
 	char *pkcs11provider = NULL;
 	int r, i, ch, deleting = 0, ret = 0, key_only = 0;
-	int xflag = 0, lflag = 0, Dflag = 0;
+	int xflag = 0, lflag = 0, Dflag = 0, qflag = 0;
 
 	ssh_malloc_init();	/* must be called before any mallocs */
 	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
@@ -507,7 +548,7 @@
 		exit(2);
 	}
 
-	while ((ch = getopt(argc, argv, "klLcdDxXE:e:s:t:")) != -1) {
+	while ((ch = getopt(argc, argv, "klLcdDxXE:e:M:m:qs:t:")) != -1) {
 		switch (ch) {
 		case 'E':
 			fingerprint_hash = ssh_digest_alg_by_name(optarg);
@@ -532,6 +573,22 @@
 		case 'c':
 			confirm = 1;
 			break;
+		case 'm':
+			minleft = (int)strtonum(optarg, 1, UINT_MAX, NULL);
+			if (minleft == 0) {
+				usage();
+				ret = 1;
+				goto done;
+			}
+			break;
+		case 'M':
+			maxsign = (int)strtonum(optarg, 1, UINT_MAX, NULL);
+			if (maxsign == 0) {
+				usage();
+				ret = 1;
+				goto done;
+			}
+			break;
 		case 'd':
 			deleting = 1;
 			break;
@@ -552,6 +609,9 @@
 				goto done;
 			}
 			break;
+		case 'q':
+			qflag = 1;
+			break;
 		default:
 			usage();
 			ret = 1;
@@ -600,7 +660,8 @@
 			    default_files[i]);
 			if (stat(buf, &st) < 0)
 				continue;
-			if (do_file(agent_fd, deleting, key_only, buf) == -1)
+			if (do_file(agent_fd, deleting, key_only, buf,
+			    qflag) == -1)
 				ret = 1;
 			else
 				count++;
@@ -610,7 +671,7 @@
 	} else {
 		for (i = 0; i < argc; i++) {
 			if (do_file(agent_fd, deleting, key_only,
-			    argv[i]) == -1)
+			    argv[i], qflag) == -1)
 				ret = 1;
 		}
 	}
diff --git a/ssh-agent.c b/ssh-agent.c
index fc7bf62..d8a8260 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-agent.c,v 1.216 2017/01/04 02:21:43 djm Exp $ */
+/* $OpenBSD: ssh-agent.c,v 1.231 2018/05/11 03:38:51 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -60,6 +60,9 @@
 #ifdef HAVE_PATHS_H
 # include <paths.h>
 #endif
+#ifdef HAVE_POLL_H
+# include <poll.h>
+#endif
 #include <signal.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -73,7 +76,6 @@
 
 #include "xmalloc.h"
 #include "ssh.h"
-#include "rsa.h"
 #include "sshbuf.h"
 #include "sshkey.h"
 #include "authfd.h"
@@ -92,6 +94,9 @@
 # define DEFAULT_PKCS11_WHITELIST "/usr/lib*/*,/usr/local/lib*/*"
 #endif
 
+/* Maximum accepted message length */
+#define AGENT_MAX_LEN	(256*1024)
+
 typedef enum {
 	AUTH_UNUSED,
 	AUTH_SOCKET,
@@ -118,13 +123,13 @@
 	u_int confirm;
 } Identity;
 
-typedef struct {
+struct idtable {
 	int nentries;
 	TAILQ_HEAD(idqueue, identity) idlist;
-} Idtab;
+};
 
-/* private key table, one per protocol version */
-Idtab idtable[3];
+/* private key table */
+struct idtable *idtab;
 
 int max_fd = 0;
 
@@ -171,21 +176,9 @@
 static void
 idtab_init(void)
 {
-	int i;
-
-	for (i = 0; i <=2; i++) {
-		TAILQ_INIT(&idtable[i].idlist);
-		idtable[i].nentries = 0;
-	}
-}
-
-/* return private key table for requested protocol version */
-static Idtab *
-idtab_lookup(int version)
-{
-	if (version < 1 || version > 2)
-		fatal("internal error, bad protocol version %d", version);
-	return &idtable[version];
+	idtab = xcalloc(1, sizeof(*idtab));
+	TAILQ_INIT(&idtab->idlist);
+	idtab->nentries = 0;
 }
 
 static void
@@ -199,12 +192,11 @@
 
 /* return matching private key for given public key */
 static Identity *
-lookup_identity(struct sshkey *key, int version)
+lookup_identity(struct sshkey *key)
 {
 	Identity *id;
 
-	Idtab *tab = idtab_lookup(version);
-	TAILQ_FOREACH(id, &tab->idlist, next) {
+	TAILQ_FOREACH(id, &idtab->idlist, next) {
 		if (sshkey_equal(key, id->key))
 			return (id);
 	}
@@ -241,135 +233,31 @@
 
 /* send list of supported public keys to 'client' */
 static void
-process_request_identities(SocketEntry *e, int version)
+process_request_identities(SocketEntry *e)
 {
-	Idtab *tab = idtab_lookup(version);
 	Identity *id;
 	struct sshbuf *msg;
 	int r;
 
 	if ((msg = sshbuf_new()) == NULL)
 		fatal("%s: sshbuf_new failed", __func__);
-	if ((r = sshbuf_put_u8(msg, (version == 1) ?
-	    SSH_AGENT_RSA_IDENTITIES_ANSWER :
-	    SSH2_AGENT_IDENTITIES_ANSWER)) != 0 ||
-	    (r = sshbuf_put_u32(msg, tab->nentries)) != 0)
+	if ((r = sshbuf_put_u8(msg, SSH2_AGENT_IDENTITIES_ANSWER)) != 0 ||
+	    (r = sshbuf_put_u32(msg, idtab->nentries)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	TAILQ_FOREACH(id, &tab->idlist, next) {
-		if (id->key->type == KEY_RSA1) {
-#ifdef WITH_SSH1
-			if ((r = sshbuf_put_u32(msg,
-			    BN_num_bits(id->key->rsa->n))) != 0 ||
-			    (r = sshbuf_put_bignum1(msg,
-			    id->key->rsa->e)) != 0 ||
-			    (r = sshbuf_put_bignum1(msg,
-			    id->key->rsa->n)) != 0)
-				fatal("%s: buffer error: %s",
-				    __func__, ssh_err(r));
-#endif
-		} else {
-			u_char *blob;
-			size_t blen;
-
-			if ((r = sshkey_to_blob(id->key, &blob, &blen)) != 0) {
-				error("%s: sshkey_to_blob: %s", __func__,
-				    ssh_err(r));
-				continue;
-			}
-			if ((r = sshbuf_put_string(msg, blob, blen)) != 0)
-				fatal("%s: buffer error: %s",
-				    __func__, ssh_err(r));
-			free(blob);
-		}
-		if ((r = sshbuf_put_cstring(msg, id->comment)) != 0)
-			fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	}
-	if ((r = sshbuf_put_stringb(e->output, msg)) != 0)
-		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	sshbuf_free(msg);
-}
-
-#ifdef WITH_SSH1
-/* ssh1 only */
-static void
-process_authentication_challenge1(SocketEntry *e)
-{
-	u_char buf[32], mdbuf[16], session_id[16];
-	u_int response_type;
-	BIGNUM *challenge;
-	Identity *id;
-	int r, len;
-	struct sshbuf *msg;
-	struct ssh_digest_ctx *md;
-	struct sshkey *key;
-
-	if ((msg = sshbuf_new()) == NULL)
-		fatal("%s: sshbuf_new failed", __func__);
-	if ((key = sshkey_new(KEY_RSA1)) == NULL)
-		fatal("%s: sshkey_new failed", __func__);
-	if ((challenge = BN_new()) == NULL)
-		fatal("%s: BN_new failed", __func__);
-
-	if ((r = sshbuf_get_u32(e->request, NULL)) != 0 || /* ignored */
-	    (r = sshbuf_get_bignum1(e->request, key->rsa->e)) != 0 ||
-	    (r = sshbuf_get_bignum1(e->request, key->rsa->n)) != 0 ||
-	    (r = sshbuf_get_bignum1(e->request, challenge)))
-		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-
-	/* Only protocol 1.1 is supported */
-	if (sshbuf_len(e->request) == 0)
-		goto failure;
-	if ((r = sshbuf_get(e->request, session_id, sizeof(session_id))) != 0 ||
-	    (r = sshbuf_get_u32(e->request, &response_type)) != 0)
-		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	if (response_type != 1)
-		goto failure;
-
-	id = lookup_identity(key, 1);
-	if (id != NULL && (!id->confirm || confirm_key(id) == 0)) {
-		struct sshkey *private = id->key;
-		/* Decrypt the challenge using the private key. */
-		if ((r = rsa_private_decrypt(challenge, challenge,
-		    private->rsa) != 0)) {
-			fatal("%s: rsa_public_encrypt: %s", __func__,
+	TAILQ_FOREACH(id, &idtab->idlist, next) {
+		if ((r = sshkey_puts_opts(id->key, msg, SSHKEY_SERIALIZE_INFO))
+		     != 0 ||
+		    (r = sshbuf_put_cstring(msg, id->comment)) != 0) {
+			error("%s: put key/comment: %s", __func__,
 			    ssh_err(r));
-			goto failure;	/* XXX ? */
+			continue;
 		}
-
-		/* The response is MD5 of decrypted challenge plus session id */
-		len = BN_num_bytes(challenge);
-		if (len <= 0 || len > 32) {
-			logit("%s: bad challenge length %d", __func__, len);
-			goto failure;
-		}
-		memset(buf, 0, 32);
-		BN_bn2bin(challenge, buf + 32 - len);
-		if ((md = ssh_digest_start(SSH_DIGEST_MD5)) == NULL ||
-		    ssh_digest_update(md, buf, 32) < 0 ||
-		    ssh_digest_update(md, session_id, 16) < 0 ||
-		    ssh_digest_final(md, mdbuf, sizeof(mdbuf)) < 0)
-			fatal("%s: md5 failed", __func__);
-		ssh_digest_free(md);
-
-		/* Send the response. */
-		if ((r = sshbuf_put_u8(msg, SSH_AGENT_RSA_RESPONSE)) != 0 ||
-		    (r = sshbuf_put(msg, mdbuf, sizeof(mdbuf))) != 0)
-			fatal("%s: buffer error: %s", __func__, ssh_err(r));
-		goto send;
 	}
-
- failure:
-	/* Unknown identity or protocol error.  Send failure. */
-	if ((r = sshbuf_put_u8(msg, SSH_AGENT_FAILURE)) != 0)
-		fatal("%s: buffer error: %s", __func__, ssh_err(r));
- send:
 	if ((r = sshbuf_put_stringb(e->output, msg)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	sshkey_free(key);
-	BN_clear_free(challenge);
 	sshbuf_free(msg);
 }
-#endif
+
 
 static char *
 agent_decode_alg(struct sshkey *key, u_int flags)
@@ -387,27 +275,25 @@
 static void
 process_sign_request2(SocketEntry *e)
 {
-	u_char *blob, *data, *signature = NULL;
-	size_t blen, dlen, slen = 0;
+	const u_char *data;
+	u_char *signature = NULL;
+	size_t dlen, slen = 0;
 	u_int compat = 0, flags;
 	int r, ok = -1;
 	struct sshbuf *msg;
-	struct sshkey *key;
+	struct sshkey *key = NULL;
 	struct identity *id;
 
 	if ((msg = sshbuf_new()) == NULL)
 		fatal("%s: sshbuf_new failed", __func__);
-	if ((r = sshbuf_get_string(e->request, &blob, &blen)) != 0 ||
-	    (r = sshbuf_get_string(e->request, &data, &dlen)) != 0 ||
-	    (r = sshbuf_get_u32(e->request, &flags)) != 0)
-		fatal("%s: buffer error: %s", __func__, ssh_err(r));
-	if (flags & SSH_AGENT_OLD_SIGNATURE)
-		compat = SSH_BUG_SIGBLOB;
-	if ((r = sshkey_from_blob(blob, blen, &key)) != 0) {
-		error("%s: cannot parse key blob: %s", __func__, ssh_err(r));
+	if ((r = sshkey_froms(e->request, &key)) != 0 ||
+	    (r = sshbuf_get_string_direct(e->request, &data, &dlen)) != 0 ||
+	    (r = sshbuf_get_u32(e->request, &flags)) != 0) {
+		error("%s: couldn't parse request: %s", __func__, ssh_err(r));
 		goto send;
 	}
-	if ((id = lookup_identity(key, 2)) == NULL) {
+
+	if ((id = lookup_identity(key)) == NULL) {
 		verbose("%s: %s key not found", __func__, sshkey_type(key));
 		goto send;
 	}
@@ -435,90 +321,52 @@
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	sshbuf_free(msg);
-	free(data);
-	free(blob);
 	free(signature);
 }
 
 /* shared */
 static void
-process_remove_identity(SocketEntry *e, int version)
+process_remove_identity(SocketEntry *e)
 {
-	size_t blen;
 	int r, success = 0;
 	struct sshkey *key = NULL;
-	u_char *blob;
-#ifdef WITH_SSH1
-	u_int bits;
-#endif /* WITH_SSH1 */
+	Identity *id;
 
-	switch (version) {
-#ifdef WITH_SSH1
-	case 1:
-		if ((key = sshkey_new(KEY_RSA1)) == NULL) {
-			error("%s: sshkey_new failed", __func__);
-			return;
-		}
-		if ((r = sshbuf_get_u32(e->request, &bits)) != 0 ||
-		    (r = sshbuf_get_bignum1(e->request, key->rsa->e)) != 0 ||
-		    (r = sshbuf_get_bignum1(e->request, key->rsa->n)) != 0)
-			fatal("%s: buffer error: %s", __func__, ssh_err(r));
-
-		if (bits != sshkey_size(key))
-			logit("Warning: identity keysize mismatch: "
-			    "actual %u, announced %u",
-			    sshkey_size(key), bits);
-		break;
-#endif /* WITH_SSH1 */
-	case 2:
-		if ((r = sshbuf_get_string(e->request, &blob, &blen)) != 0)
-			fatal("%s: buffer error: %s", __func__, ssh_err(r));
-		if ((r = sshkey_from_blob(blob, blen, &key)) != 0)
-			error("%s: sshkey_from_blob failed: %s",
-			    __func__, ssh_err(r));
-		free(blob);
-		break;
+	if ((r = sshkey_froms(e->request, &key)) != 0) {
+		error("%s: get key: %s", __func__, ssh_err(r));
+		goto done;
 	}
-	if (key != NULL) {
-		Identity *id = lookup_identity(key, version);
-		if (id != NULL) {
-			/*
-			 * We have this key.  Free the old key.  Since we
-			 * don't want to leave empty slots in the middle of
-			 * the array, we actually free the key there and move
-			 * all the entries between the empty slot and the end
-			 * of the array.
-			 */
-			Idtab *tab = idtab_lookup(version);
-			if (tab->nentries < 1)
-				fatal("process_remove_identity: "
-				    "internal error: tab->nentries %d",
-				    tab->nentries);
-			TAILQ_REMOVE(&tab->idlist, id, next);
-			free_identity(id);
-			tab->nentries--;
-			success = 1;
-		}
-		sshkey_free(key);
+	if ((id = lookup_identity(key)) == NULL) {
+		debug("%s: key not found", __func__);
+		goto done;
 	}
+	/* We have this key, free it. */
+	if (idtab->nentries < 1)
+		fatal("%s: internal error: nentries %d",
+		    __func__, idtab->nentries);
+	TAILQ_REMOVE(&idtab->idlist, id, next);
+	free_identity(id);
+	idtab->nentries--;
+	sshkey_free(key);
+	success = 1;
+ done:
 	send_status(e, success);
 }
 
 static void
-process_remove_all_identities(SocketEntry *e, int version)
+process_remove_all_identities(SocketEntry *e)
 {
-	Idtab *tab = idtab_lookup(version);
 	Identity *id;
 
 	/* Loop over all identities and clear the keys. */
-	for (id = TAILQ_FIRST(&tab->idlist); id;
-	    id = TAILQ_FIRST(&tab->idlist)) {
-		TAILQ_REMOVE(&tab->idlist, id, next);
+	for (id = TAILQ_FIRST(&idtab->idlist); id;
+	    id = TAILQ_FIRST(&idtab->idlist)) {
+		TAILQ_REMOVE(&idtab->idlist, id, next);
 		free_identity(id);
 	}
 
 	/* Mark that there are no identities. */
-	tab->nentries = 0;
+	idtab->nentries = 0;
 
 	/* Send success. */
 	send_status(e, 1);
@@ -530,24 +378,19 @@
 {
 	time_t deadline = 0, now = monotime();
 	Identity *id, *nxt;
-	int version;
-	Idtab *tab;
 
-	for (version = 1; version < 3; version++) {
-		tab = idtab_lookup(version);
-		for (id = TAILQ_FIRST(&tab->idlist); id; id = nxt) {
-			nxt = TAILQ_NEXT(id, next);
-			if (id->death == 0)
-				continue;
-			if (now >= id->death) {
-				debug("expiring key '%s'", id->comment);
-				TAILQ_REMOVE(&tab->idlist, id, next);
-				free_identity(id);
-				tab->nentries--;
-			} else
-				deadline = (deadline == 0) ? id->death :
-				    MINIMUM(deadline, id->death);
-		}
+	for (id = TAILQ_FIRST(&idtab->idlist); id; id = nxt) {
+		nxt = TAILQ_NEXT(id, next);
+		if (id->death == 0)
+			continue;
+		if (now >= id->death) {
+			debug("expiring key '%s'", id->comment);
+			TAILQ_REMOVE(&idtab->idlist, id, next);
+			free_identity(id);
+			idtab->nentries--;
+		} else
+			deadline = (deadline == 0) ? id->death :
+			    MINIMUM(deadline, id->death);
 	}
 	if (deadline == 0 || deadline <= now)
 		return 0;
@@ -555,74 +398,20 @@
 		return (deadline - now);
 }
 
-/*
- * XXX this and the corresponding serialisation function probably belongs
- * in key.c
- */
-#ifdef WITH_SSH1
-static int
-agent_decode_rsa1(struct sshbuf *m, struct sshkey **kp)
-{
-	struct sshkey *k = NULL;
-	int r = SSH_ERR_INTERNAL_ERROR;
-
-	*kp = NULL;
-	if ((k = sshkey_new_private(KEY_RSA1)) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-
-	if ((r = sshbuf_get_u32(m, NULL)) != 0 ||		/* ignored */
-	    (r = sshbuf_get_bignum1(m, k->rsa->n)) != 0 ||
-	    (r = sshbuf_get_bignum1(m, k->rsa->e)) != 0 ||
-	    (r = sshbuf_get_bignum1(m, k->rsa->d)) != 0 ||
-	    (r = sshbuf_get_bignum1(m, k->rsa->iqmp)) != 0 ||
-	    /* SSH1 and SSL have p and q swapped */
-	    (r = sshbuf_get_bignum1(m, k->rsa->q)) != 0 ||	/* p */
-	    (r = sshbuf_get_bignum1(m, k->rsa->p)) != 0) 	/* q */
-		goto out;
-
-	/* Generate additional parameters */
-	if ((r = rsa_generate_additional_parameters(k->rsa)) != 0)
-		goto out;
-	/* enable blinding */
-	if (RSA_blinding_on(k->rsa, NULL) != 1) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-
-	r = 0; /* success */
- out:
-	if (r == 0)
-		*kp = k;
-	else
-		sshkey_free(k);
-	return r;
-}
-#endif /* WITH_SSH1 */
-
 static void
-process_add_identity(SocketEntry *e, int version)
+process_add_identity(SocketEntry *e)
 {
-	Idtab *tab = idtab_lookup(version);
 	Identity *id;
 	int success = 0, confirm = 0;
-	u_int seconds;
+	u_int seconds, maxsign;
 	char *comment = NULL;
 	time_t death = 0;
 	struct sshkey *k = NULL;
 	u_char ctype;
 	int r = SSH_ERR_INTERNAL_ERROR;
 
-	switch (version) {
-#ifdef WITH_SSH1
-	case 1:
-		r = agent_decode_rsa1(e->request, &k);
-		break;
-#endif /* WITH_SSH1 */
-	case 2:
-		r = sshkey_private_deserialize(e->request, &k);
-		break;
-	}
-	if (r != 0 || k == NULL ||
+	if ((r = sshkey_private_deserialize(e->request, &k)) != 0 ||
+	    k == NULL ||
 	    (r = sshbuf_get_cstring(e->request, &comment, NULL)) != 0) {
 		error("%s: decode private key: %s", __func__, ssh_err(r));
 		goto err;
@@ -645,6 +434,18 @@
 		case SSH_AGENT_CONSTRAIN_CONFIRM:
 			confirm = 1;
 			break;
+		case SSH_AGENT_CONSTRAIN_MAXSIGN:
+			if ((r = sshbuf_get_u32(e->request, &maxsign)) != 0) {
+				error("%s: bad maxsign constraint: %s",
+				    __func__, ssh_err(r));
+				goto err;
+			}
+			if ((r = sshkey_enable_maxsign(k, maxsign)) != 0) {
+				error("%s: cannot enable maxsign: %s",
+				    __func__, ssh_err(r));
+				goto err;
+			}
+			break;
 		default:
 			error("%s: Unknown constraint %d", __func__, ctype);
  err:
@@ -658,16 +459,17 @@
 	success = 1;
 	if (lifetime && !death)
 		death = monotime() + lifetime;
-	if ((id = lookup_identity(k, version)) == NULL) {
+	if ((id = lookup_identity(k)) == NULL) {
 		id = xcalloc(1, sizeof(Identity));
-		id->key = k;
-		TAILQ_INSERT_TAIL(&tab->idlist, id, next);
+		TAILQ_INSERT_TAIL(&idtab->idlist, id, next);
 		/* Increment the number of identities. */
-		tab->nentries++;
+		idtab->nentries++;
 	} else {
-		sshkey_free(k);
+		/* key state might have been updated */
+		sshkey_free(id->key);
 		free(id->comment);
 	}
+	id->key = k;
 	id->comment = comment;
 	id->death = death;
 	id->confirm = confirm;
@@ -685,6 +487,11 @@
 	static u_int fail_count = 0;
 	size_t pwlen;
 
+	/*
+	 * This is deliberately fatal: the user has requested that we lock,
+	 * but we can't parse their request properly. The only safe thing to
+	 * do is abort.
+	 */
 	if ((r = sshbuf_get_cstring(e->request, &passwd, &pwlen)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if (pwlen == 0) {
@@ -724,17 +531,14 @@
 }
 
 static void
-no_identities(SocketEntry *e, u_int type)
+no_identities(SocketEntry *e)
 {
 	struct sshbuf *msg;
 	int r;
 
 	if ((msg = sshbuf_new()) == NULL)
 		fatal("%s: sshbuf_new failed", __func__);
-	if ((r = sshbuf_put_u8(msg,
-	    (type == SSH_AGENTC_REQUEST_RSA_IDENTITIES) ?
-	    SSH_AGENT_RSA_IDENTITIES_ANSWER :
-	    SSH2_AGENT_IDENTITIES_ANSWER)) != 0 ||
+	if ((r = sshbuf_put_u8(msg, SSH2_AGENT_IDENTITIES_ANSWER)) != 0 ||
 	    (r = sshbuf_put_u32(msg, 0)) != 0 ||
 	    (r = sshbuf_put_stringb(e->output, msg)) != 0)
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
@@ -745,35 +549,39 @@
 static void
 process_add_smartcard_key(SocketEntry *e)
 {
-	char *provider = NULL, *pin, canonical_provider[PATH_MAX];
-	int r, i, version, count = 0, success = 0, confirm = 0;
+	char *provider = NULL, *pin = NULL, canonical_provider[PATH_MAX];
+	int r, i, count = 0, success = 0, confirm = 0;
 	u_int seconds;
 	time_t death = 0;
 	u_char type;
 	struct sshkey **keys = NULL, *k;
 	Identity *id;
-	Idtab *tab;
 
 	if ((r = sshbuf_get_cstring(e->request, &provider, NULL)) != 0 ||
-	    (r = sshbuf_get_cstring(e->request, &pin, NULL)) != 0)
-		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	    (r = sshbuf_get_cstring(e->request, &pin, NULL)) != 0) {
+		error("%s: buffer error: %s", __func__, ssh_err(r));
+		goto send;
+	}
 
 	while (sshbuf_len(e->request)) {
-		if ((r = sshbuf_get_u8(e->request, &type)) != 0)
-			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+		if ((r = sshbuf_get_u8(e->request, &type)) != 0) {
+			error("%s: buffer error: %s", __func__, ssh_err(r));
+			goto send;
+		}
 		switch (type) {
 		case SSH_AGENT_CONSTRAIN_LIFETIME:
-			if ((r = sshbuf_get_u32(e->request, &seconds)) != 0)
-				fatal("%s: buffer error: %s",
+			if ((r = sshbuf_get_u32(e->request, &seconds)) != 0) {
+				error("%s: buffer error: %s",
 				    __func__, ssh_err(r));
+				goto send;
+			}
 			death = monotime() + seconds;
 			break;
 		case SSH_AGENT_CONSTRAIN_CONFIRM:
 			confirm = 1;
 			break;
 		default:
-			error("process_add_smartcard_key: "
-			    "Unknown constraint type %d", type);
+			error("%s: Unknown constraint type %d", __func__, type);
 			goto send;
 		}
 	}
@@ -794,17 +602,15 @@
 	count = pkcs11_add_provider(canonical_provider, pin, &keys);
 	for (i = 0; i < count; i++) {
 		k = keys[i];
-		version = k->type == KEY_RSA1 ? 1 : 2;
-		tab = idtab_lookup(version);
-		if (lookup_identity(k, version) == NULL) {
+		if (lookup_identity(k) == NULL) {
 			id = xcalloc(1, sizeof(Identity));
 			id->key = k;
 			id->provider = xstrdup(canonical_provider);
 			id->comment = xstrdup(canonical_provider); /* XXX */
 			id->death = death;
 			id->confirm = confirm;
-			TAILQ_INSERT_TAIL(&tab->idlist, id, next);
-			tab->nentries++;
+			TAILQ_INSERT_TAIL(&idtab->idlist, id, next);
+			idtab->nentries++;
 			success = 1;
 		} else {
 			sshkey_free(k);
@@ -821,35 +627,40 @@
 static void
 process_remove_smartcard_key(SocketEntry *e)
 {
-	char *provider = NULL, *pin = NULL;
-	int r, version, success = 0;
+	char *provider = NULL, *pin = NULL, canonical_provider[PATH_MAX];
+	int r, success = 0;
 	Identity *id, *nxt;
-	Idtab *tab;
 
 	if ((r = sshbuf_get_cstring(e->request, &provider, NULL)) != 0 ||
-	    (r = sshbuf_get_cstring(e->request, &pin, NULL)) != 0)
-		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	    (r = sshbuf_get_cstring(e->request, &pin, NULL)) != 0) {
+		error("%s: buffer error: %s", __func__, ssh_err(r));
+		goto send;
+	}
 	free(pin);
 
-	for (version = 1; version < 3; version++) {
-		tab = idtab_lookup(version);
-		for (id = TAILQ_FIRST(&tab->idlist); id; id = nxt) {
-			nxt = TAILQ_NEXT(id, next);
-			/* Skip file--based keys */
-			if (id->provider == NULL)
-				continue;
-			if (!strcmp(provider, id->provider)) {
-				TAILQ_REMOVE(&tab->idlist, id, next);
-				free_identity(id);
-				tab->nentries--;
-			}
+	if (realpath(provider, canonical_provider) == NULL) {
+		verbose("failed PKCS#11 add of \"%.100s\": realpath: %s",
+		    provider, strerror(errno));
+		goto send;
+	}
+
+	debug("%s: remove %.100s", __func__, canonical_provider);
+	for (id = TAILQ_FIRST(&idtab->idlist); id; id = nxt) {
+		nxt = TAILQ_NEXT(id, next);
+		/* Skip file--based keys */
+		if (id->provider == NULL)
+			continue;
+		if (!strcmp(canonical_provider, id->provider)) {
+			TAILQ_REMOVE(&idtab->idlist, id, next);
+			free_identity(id);
+			idtab->nentries--;
 		}
 	}
-	if (pkcs11_del_provider(provider) == 0)
+	if (pkcs11_del_provider(canonical_provider) == 0)
 		success = 1;
 	else
-		error("process_remove_smartcard_key:"
-		    " pkcs11_del_provider failed");
+		error("%s: pkcs11_del_provider failed", __func__);
+send:
 	free(provider);
 	send_status(e, success);
 }
@@ -857,88 +668,86 @@
 
 /* dispatch incoming messages */
 
-static void
-process_message(SocketEntry *e)
+static int
+process_message(u_int socknum)
 {
 	u_int msg_len;
 	u_char type;
 	const u_char *cp;
 	int r;
+	SocketEntry *e;
+
+	if (socknum >= sockets_alloc) {
+		fatal("%s: socket number %u >= allocated %u",
+		    __func__, socknum, sockets_alloc);
+	}
+	e = &sockets[socknum];
 
 	if (sshbuf_len(e->input) < 5)
-		return;		/* Incomplete message. */
+		return 0;		/* Incomplete message header. */
 	cp = sshbuf_ptr(e->input);
 	msg_len = PEEK_U32(cp);
-	if (msg_len > 256 * 1024) {
-		close_socket(e);
-		return;
+	if (msg_len > AGENT_MAX_LEN) {
+		debug("%s: socket %u (fd=%d) message too long %u > %u",
+		    __func__, socknum, e->fd, msg_len, AGENT_MAX_LEN);
+		return -1;
 	}
 	if (sshbuf_len(e->input) < msg_len + 4)
-		return;
+		return 0;		/* Incomplete message body. */
 
 	/* move the current input to e->request */
 	sshbuf_reset(e->request);
 	if ((r = sshbuf_get_stringb(e->input, e->request)) != 0 ||
-	    (r = sshbuf_get_u8(e->request, &type)) != 0)
+	    (r = sshbuf_get_u8(e->request, &type)) != 0) {
+		if (r == SSH_ERR_MESSAGE_INCOMPLETE ||
+		    r == SSH_ERR_STRING_TOO_LARGE) {
+			debug("%s: buffer error: %s", __func__, ssh_err(r));
+			return -1;
+		}
 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
 
-	/* check wheter agent is locked */
+	debug("%s: socket %u (fd=%d) type %d", __func__, socknum, e->fd, type);
+
+	/* check whether agent is locked */
 	if (locked && type != SSH_AGENTC_UNLOCK) {
 		sshbuf_reset(e->request);
 		switch (type) {
-		case SSH_AGENTC_REQUEST_RSA_IDENTITIES:
 		case SSH2_AGENTC_REQUEST_IDENTITIES:
 			/* send empty lists */
-			no_identities(e, type);
+			no_identities(e);
 			break;
 		default:
 			/* send a fail message for all other request types */
 			send_status(e, 0);
 		}
-		return;
+		return 0;
 	}
 
-	debug("type %d", type);
 	switch (type) {
 	case SSH_AGENTC_LOCK:
 	case SSH_AGENTC_UNLOCK:
 		process_lock_agent(e, type == SSH_AGENTC_LOCK);
 		break;
-#ifdef WITH_SSH1
-	/* ssh1 */
-	case SSH_AGENTC_RSA_CHALLENGE:
-		process_authentication_challenge1(e);
-		break;
-	case SSH_AGENTC_REQUEST_RSA_IDENTITIES:
-		process_request_identities(e, 1);
-		break;
-	case SSH_AGENTC_ADD_RSA_IDENTITY:
-	case SSH_AGENTC_ADD_RSA_ID_CONSTRAINED:
-		process_add_identity(e, 1);
-		break;
-	case SSH_AGENTC_REMOVE_RSA_IDENTITY:
-		process_remove_identity(e, 1);
-		break;
-#endif
 	case SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES:
-		process_remove_all_identities(e, 1); /* safe for !WITH_SSH1 */
+		process_remove_all_identities(e); /* safe for !WITH_SSH1 */
 		break;
 	/* ssh2 */
 	case SSH2_AGENTC_SIGN_REQUEST:
 		process_sign_request2(e);
 		break;
 	case SSH2_AGENTC_REQUEST_IDENTITIES:
-		process_request_identities(e, 2);
+		process_request_identities(e);
 		break;
 	case SSH2_AGENTC_ADD_IDENTITY:
 	case SSH2_AGENTC_ADD_ID_CONSTRAINED:
-		process_add_identity(e, 2);
+		process_add_identity(e);
 		break;
 	case SSH2_AGENTC_REMOVE_IDENTITY:
-		process_remove_identity(e, 2);
+		process_remove_identity(e);
 		break;
 	case SSH2_AGENTC_REMOVE_ALL_IDENTITIES:
-		process_remove_all_identities(e, 2);
+		process_remove_all_identities(e);
 		break;
 #ifdef ENABLE_PKCS11
 	case SSH_AGENTC_ADD_SMARTCARD_KEY:
@@ -956,6 +765,7 @@
 		send_status(e, 0);
 		break;
 	}
+	return 0;
 }
 
 static void
@@ -997,19 +807,152 @@
 }
 
 static int
-prepare_select(fd_set **fdrp, fd_set **fdwp, int *fdl, u_int *nallocp,
-    struct timeval **tvpp)
+handle_socket_read(u_int socknum)
 {
-	u_int i, sz;
-	int n = 0;
-	static struct timeval tv;
+	struct sockaddr_un sunaddr;
+	socklen_t slen;
+	uid_t euid;
+	gid_t egid;
+	int fd;
+
+	slen = sizeof(sunaddr);
+	fd = accept(sockets[socknum].fd, (struct sockaddr *)&sunaddr, &slen);
+	if (fd < 0) {
+		error("accept from AUTH_SOCKET: %s", strerror(errno));
+		return -1;
+	}
+	if (getpeereid(fd, &euid, &egid) < 0) {
+		error("getpeereid %d failed: %s", fd, strerror(errno));
+		close(fd);
+		return -1;
+	}
+	if ((euid != 0) && (getuid() != euid)) {
+		error("uid mismatch: peer euid %u != uid %u",
+		    (u_int) euid, (u_int) getuid());
+		close(fd);
+		return -1;
+	}
+	new_socket(AUTH_CONNECTION, fd);
+	return 0;
+}
+
+static int
+handle_conn_read(u_int socknum)
+{
+	char buf[1024];
+	ssize_t len;
+	int r;
+
+	if ((len = read(sockets[socknum].fd, buf, sizeof(buf))) <= 0) {
+		if (len == -1) {
+			if (errno == EAGAIN || errno == EINTR)
+				return 0;
+			error("%s: read error on socket %u (fd %d): %s",
+			    __func__, socknum, sockets[socknum].fd,
+			    strerror(errno));
+		}
+		return -1;
+	}
+	if ((r = sshbuf_put(sockets[socknum].input, buf, len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	explicit_bzero(buf, sizeof(buf));
+	process_message(socknum);
+	return 0;
+}
+
+static int
+handle_conn_write(u_int socknum)
+{
+	ssize_t len;
+	int r;
+
+	if (sshbuf_len(sockets[socknum].output) == 0)
+		return 0; /* shouldn't happen */
+	if ((len = write(sockets[socknum].fd,
+	    sshbuf_ptr(sockets[socknum].output),
+	    sshbuf_len(sockets[socknum].output))) <= 0) {
+		if (len == -1) {
+			if (errno == EAGAIN || errno == EINTR)
+				return 0;
+			error("%s: read error on socket %u (fd %d): %s",
+			    __func__, socknum, sockets[socknum].fd,
+			    strerror(errno));
+		}
+		return -1;
+	}
+	if ((r = sshbuf_consume(sockets[socknum].output, len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	return 0;
+}
+
+static void
+after_poll(struct pollfd *pfd, size_t npfd, u_int maxfds)
+{
+	size_t i;
+	u_int socknum, activefds = npfd;
+
+	for (i = 0; i < npfd; i++) {
+		if (pfd[i].revents == 0)
+			continue;
+		/* Find sockets entry */
+		for (socknum = 0; socknum < sockets_alloc; socknum++) {
+			if (sockets[socknum].type != AUTH_SOCKET &&
+			    sockets[socknum].type != AUTH_CONNECTION)
+				continue;
+			if (pfd[i].fd == sockets[socknum].fd)
+				break;
+		}
+		if (socknum >= sockets_alloc) {
+			error("%s: no socket for fd %d", __func__, pfd[i].fd);
+			continue;
+		}
+		/* Process events */
+		switch (sockets[socknum].type) {
+		case AUTH_SOCKET:
+			if ((pfd[i].revents & (POLLIN|POLLERR)) == 0)
+				break;
+			if (npfd > maxfds) {
+				debug3("out of fds (active %u >= limit %u); "
+				    "skipping accept", activefds, maxfds);
+				break;
+			}
+			if (handle_socket_read(socknum) == 0)
+				activefds++;
+			break;
+		case AUTH_CONNECTION:
+			if ((pfd[i].revents & (POLLIN|POLLERR)) != 0 &&
+			    handle_conn_read(socknum) != 0) {
+				goto close_sock;
+			}
+			if ((pfd[i].revents & (POLLOUT|POLLHUP)) != 0 &&
+			    handle_conn_write(socknum) != 0) {
+ close_sock:
+				if (activefds == 0)
+					fatal("activefds == 0 at close_sock");
+				close_socket(&sockets[socknum]);
+				activefds--;
+				break;
+			}
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+static int
+prepare_poll(struct pollfd **pfdp, size_t *npfdp, int *timeoutp, u_int maxfds)
+{
+	struct pollfd *pfd = *pfdp;
+	size_t i, j, npfd = 0;
 	time_t deadline;
 
+	/* Count active sockets */
 	for (i = 0; i < sockets_alloc; i++) {
 		switch (sockets[i].type) {
 		case AUTH_SOCKET:
 		case AUTH_CONNECTION:
-			n = MAXIMUM(n, sockets[i].fd);
+			npfd++;
 			break;
 		case AUTH_UNUSED:
 			break;
@@ -1018,28 +961,33 @@
 			break;
 		}
 	}
+	if (npfd != *npfdp &&
+	    (pfd = recallocarray(pfd, *npfdp, npfd, sizeof(*pfd))) == NULL)
+		fatal("%s: recallocarray failed", __func__);
+	*pfdp = pfd;
+	*npfdp = npfd;
 
-	sz = howmany(n+1, NFDBITS) * sizeof(fd_mask);
-	if (*fdrp == NULL || sz > *nallocp) {
-		free(*fdrp);
-		free(*fdwp);
-		*fdrp = xmalloc(sz);
-		*fdwp = xmalloc(sz);
-		*nallocp = sz;
-	}
-	if (n < *fdl)
-		debug("XXX shrink: %d < %d", n, *fdl);
-	*fdl = n;
-	memset(*fdrp, 0, sz);
-	memset(*fdwp, 0, sz);
-
-	for (i = 0; i < sockets_alloc; i++) {
+	for (i = j = 0; i < sockets_alloc; i++) {
 		switch (sockets[i].type) {
 		case AUTH_SOCKET:
+			if (npfd > maxfds) {
+				debug3("out of fds (active %zu >= limit %u); "
+				    "skipping arming listener", npfd, maxfds);
+				break;
+			}
+			pfd[j].fd = sockets[i].fd;
+			pfd[j].revents = 0;
+			pfd[j].events = POLLIN;
+			j++;
+			break;
 		case AUTH_CONNECTION:
-			FD_SET(sockets[i].fd, *fdrp);
+			pfd[j].fd = sockets[i].fd;
+			pfd[j].revents = 0;
+			/* XXX backoff when input buffer full */
+			pfd[j].events = POLLIN;
 			if (sshbuf_len(sockets[i].output) > 0)
-				FD_SET(sockets[i].fd, *fdwp);
+				pfd[j].events |= POLLOUT;
+			j++;
 			break;
 		default:
 			break;
@@ -1050,99 +998,17 @@
 		deadline = (deadline == 0) ? parent_alive_interval :
 		    MINIMUM(deadline, parent_alive_interval);
 	if (deadline == 0) {
-		*tvpp = NULL;
+		*timeoutp = -1; /* INFTIM */
 	} else {
-		tv.tv_sec = deadline;
-		tv.tv_usec = 0;
-		*tvpp = &tv;
+		if (deadline > INT_MAX / 1000)
+			*timeoutp = INT_MAX / 1000;
+		else
+			*timeoutp = deadline * 1000;
 	}
 	return (1);
 }
 
 static void
-after_select(fd_set *readset, fd_set *writeset)
-{
-	struct sockaddr_un sunaddr;
-	socklen_t slen;
-	char buf[1024];
-	int len, sock, r;
-	u_int i, orig_alloc;
-	uid_t euid;
-	gid_t egid;
-
-	for (i = 0, orig_alloc = sockets_alloc; i < orig_alloc; i++)
-		switch (sockets[i].type) {
-		case AUTH_UNUSED:
-			break;
-		case AUTH_SOCKET:
-			if (FD_ISSET(sockets[i].fd, readset)) {
-				slen = sizeof(sunaddr);
-				sock = accept(sockets[i].fd,
-				    (struct sockaddr *)&sunaddr, &slen);
-				if (sock < 0) {
-					error("accept from AUTH_SOCKET: %s",
-					    strerror(errno));
-					break;
-				}
-				if (getpeereid(sock, &euid, &egid) < 0) {
-					error("getpeereid %d failed: %s",
-					    sock, strerror(errno));
-					close(sock);
-					break;
-				}
-				if ((euid != 0) && (getuid() != euid)) {
-					error("uid mismatch: "
-					    "peer euid %u != uid %u",
-					    (u_int) euid, (u_int) getuid());
-					close(sock);
-					break;
-				}
-				new_socket(AUTH_CONNECTION, sock);
-			}
-			break;
-		case AUTH_CONNECTION:
-			if (sshbuf_len(sockets[i].output) > 0 &&
-			    FD_ISSET(sockets[i].fd, writeset)) {
-				len = write(sockets[i].fd,
-				    sshbuf_ptr(sockets[i].output),
-				    sshbuf_len(sockets[i].output));
-				if (len == -1 && (errno == EAGAIN ||
-				    errno == EWOULDBLOCK ||
-				    errno == EINTR))
-					continue;
-				if (len <= 0) {
-					close_socket(&sockets[i]);
-					break;
-				}
-				if ((r = sshbuf_consume(sockets[i].output,
-				    len)) != 0)
-					fatal("%s: buffer error: %s",
-					    __func__, ssh_err(r));
-			}
-			if (FD_ISSET(sockets[i].fd, readset)) {
-				len = read(sockets[i].fd, buf, sizeof(buf));
-				if (len == -1 && (errno == EAGAIN ||
-				    errno == EWOULDBLOCK ||
-				    errno == EINTR))
-					continue;
-				if (len <= 0) {
-					close_socket(&sockets[i]);
-					break;
-				}
-				if ((r = sshbuf_put(sockets[i].input,
-				    buf, len)) != 0)
-					fatal("%s: buffer error: %s",
-					    __func__, ssh_err(r));
-				explicit_bzero(buf, sizeof(buf));
-				process_message(&sockets[i]);
-			}
-			break;
-		default:
-			fatal("Unknown type %d", sockets[i].type);
-		}
-}
-
-static void
 cleanup_socket(void)
 {
 	if (cleanup_pid != 0 && getpid() != cleanup_pid)
@@ -1201,9 +1067,7 @@
 {
 	int c_flag = 0, d_flag = 0, D_flag = 0, k_flag = 0, s_flag = 0;
 	int sock, fd, ch, result, saved_errno;
-	u_int nalloc;
 	char *shell, *format, *pidstr, *agentsocket = NULL;
-	fd_set *readsetp = NULL, *writesetp = NULL;
 #ifdef HAVE_SETRLIMIT
 	struct rlimit rlim;
 #endif
@@ -1211,9 +1075,12 @@
 	extern char *optarg;
 	pid_t pid;
 	char pidstrbuf[1 + 3 * sizeof pid];
-	struct timeval *tvp = NULL;
 	size_t len;
 	mode_t prev_mask;
+	int timeout = -1; /* INFTIM */
+	struct pollfd *pfd = NULL;
+	size_t npfd = 0;
+	u_int maxfds;
 
 	ssh_malloc_init();	/* must be called before any mallocs */
 	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
@@ -1225,6 +1092,9 @@
 
 	platform_disable_tracing(0);	/* strict=no */
 
+	if (getrlimit(RLIMIT_NOFILE, &rlim) == -1)
+		fatal("%s: getrlimit: %s", __progname, strerror(errno));
+
 #ifdef WITH_OPENSSL
 	OpenSSL_add_all_algorithms();
 #endif
@@ -1321,6 +1191,18 @@
 		printf("echo Agent pid %ld killed;\n", (long)pid);
 		exit(0);
 	}
+
+	/*
+	 * Minimum file descriptors:
+	 * stdio (3) + listener (1) + syslog (1 maybe) + connection (1) +
+	 * a few spare for libc / stack protectors / sanitisers, etc.
+	 */
+#define SSH_AGENT_MIN_FDS (3+1+1+1+4)
+	if (rlim.rlim_cur < SSH_AGENT_MIN_FDS)
+		fatal("%s: file descriptior rlimit %lld too low (minimum %u)",
+		    __progname, (long long)rlim.rlim_cur, SSH_AGENT_MIN_FDS);
+	maxfds = rlim.rlim_cur - SSH_AGENT_MIN_FDS;
+
 	parent_pid = getpid();
 
 	if (agentsocket == NULL) {
@@ -1434,19 +1316,14 @@
 	signal(SIGINT, (d_flag | D_flag) ? cleanup_handler : SIG_IGN);
 	signal(SIGHUP, cleanup_handler);
 	signal(SIGTERM, cleanup_handler);
-	nalloc = 0;
 
 	if (pledge("stdio rpath cpath unix id proc exec", NULL) == -1)
 		fatal("%s: pledge: %s", __progname, strerror(errno));
 	platform_pledge_agent();
 
 	while (1) {
-		prepare_select(&readsetp, &writesetp, &max_fd, &nalloc, &tvp);
-#ifdef __Fuchsia__
-		result = fuchsia_select(max_fd + 1, readsetp, writesetp, tvp);
-#else
-		result = select(max_fd + 1, readsetp, writesetp, NULL, tvp);
-#endif
+		prepare_poll(&pfd, &npfd, &timeout, maxfds);
+		result = poll(pfd, npfd, timeout);
 		saved_errno = errno;
 		if (parent_alive_interval != 0)
 			check_parent_exists();
@@ -1454,9 +1331,9 @@
 		if (result < 0) {
 			if (saved_errno == EINTR)
 				continue;
-			fatal("select: %s", strerror(saved_errno));
+			fatal("poll: %s", strerror(saved_errno));
 		} else if (result > 0)
-			after_select(readsetp, writesetp);
+			after_poll(pfd, npfd, maxfds);
 	}
 	/* NOTREACHED */
 }
diff --git a/ssh-dss.c b/ssh-dss.c
index 7af59fa..9f832ee 100644
--- a/ssh-dss.c
+++ b/ssh-dss.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-dss.c,v 1.35 2016/04/21 06:08:02 djm Exp $ */
+/* $OpenBSD: ssh-dss.c,v 1.37 2018/02/07 02:06:51 jsing Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
@@ -86,42 +86,28 @@
 	BN_bn2bin(sig->r, sigblob + SIGBLOB_LEN - INTBLOB_LEN - rlen);
 	BN_bn2bin(sig->s, sigblob + SIGBLOB_LEN - slen);
 
-	if (compat & SSH_BUG_SIGBLOB) {
-		if (sigp != NULL) {
-			if ((*sigp = malloc(SIGBLOB_LEN)) == NULL) {
-				ret = SSH_ERR_ALLOC_FAIL;
-				goto out;
-			}
-			memcpy(*sigp, sigblob, SIGBLOB_LEN);
-		}
-		if (lenp != NULL)
-			*lenp = SIGBLOB_LEN;
-		ret = 0;
-	} else {
-		/* ietf-drafts */
-		if ((b = sshbuf_new()) == NULL) {
+	if ((b = sshbuf_new()) == NULL) {
+		ret = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+	if ((ret = sshbuf_put_cstring(b, "ssh-dss")) != 0 ||
+	    (ret = sshbuf_put_string(b, sigblob, SIGBLOB_LEN)) != 0)
+		goto out;
+
+	len = sshbuf_len(b);
+	if (sigp != NULL) {
+		if ((*sigp = malloc(len)) == NULL) {
 			ret = SSH_ERR_ALLOC_FAIL;
 			goto out;
 		}
-		if ((ret = sshbuf_put_cstring(b, "ssh-dss")) != 0 ||
-		    (ret = sshbuf_put_string(b, sigblob, SIGBLOB_LEN)) != 0)
-			goto out;
-		len = sshbuf_len(b);
-		if (sigp != NULL) {
-			if ((*sigp = malloc(len)) == NULL) {
-				ret = SSH_ERR_ALLOC_FAIL;
-				goto out;
-			}
-			memcpy(*sigp, sshbuf_ptr(b), len);
-		}
-		if (lenp != NULL)
-			*lenp = len;
-		ret = 0;
+		memcpy(*sigp, sshbuf_ptr(b), len);
 	}
+	if (lenp != NULL)
+		*lenp = len;
+	ret = 0;
  out:
 	explicit_bzero(digest, sizeof(digest));
-	if (sig != NULL)
-		DSA_SIG_free(sig);
+	DSA_SIG_free(sig);
 	sshbuf_free(b);
 	return ret;
 }
@@ -146,28 +132,20 @@
 		return SSH_ERR_INTERNAL_ERROR;
 
 	/* fetch signature */
-	if (compat & SSH_BUG_SIGBLOB) {
-		if ((sigblob = malloc(signaturelen)) == NULL)
-			return SSH_ERR_ALLOC_FAIL;
-		memcpy(sigblob, signature, signaturelen);
-		len = signaturelen;
-	} else {
-		/* ietf-drafts */
-		if ((b = sshbuf_from(signature, signaturelen)) == NULL)
-			return SSH_ERR_ALLOC_FAIL;
-		if (sshbuf_get_cstring(b, &ktype, NULL) != 0 ||
-		    sshbuf_get_string(b, &sigblob, &len) != 0) {
-			ret = SSH_ERR_INVALID_FORMAT;
-			goto out;
-		}
-		if (strcmp("ssh-dss", ktype) != 0) {
-			ret = SSH_ERR_KEY_TYPE_MISMATCH;
-			goto out;
-		}
-		if (sshbuf_len(b) != 0) {
-			ret = SSH_ERR_UNEXPECTED_TRAILING_DATA;
-			goto out;
-		}
+	if ((b = sshbuf_from(signature, signaturelen)) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	if (sshbuf_get_cstring(b, &ktype, NULL) != 0 ||
+	    sshbuf_get_string(b, &sigblob, &len) != 0) {
+		ret = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+	if (strcmp("ssh-dss", ktype) != 0) {
+		ret = SSH_ERR_KEY_TYPE_MISMATCH;
+		goto out;
+	}
+	if (sshbuf_len(b) != 0) {
+		ret = SSH_ERR_UNEXPECTED_TRAILING_DATA;
+		goto out;
 	}
 
 	if (len != SIGBLOB_LEN) {
@@ -207,8 +185,7 @@
 
  out:
 	explicit_bzero(digest, sizeof(digest));
-	if (sig != NULL)
-		DSA_SIG_free(sig);
+	DSA_SIG_free(sig);
 	sshbuf_free(b);
 	free(ktype);
 	if (sigblob != NULL) {
diff --git a/ssh-ecdsa.c b/ssh-ecdsa.c
index d7bf3c6..3d3b78d 100644
--- a/ssh-ecdsa.c
+++ b/ssh-ecdsa.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-ecdsa.c,v 1.13 2016/04/21 06:08:02 djm Exp $ */
+/* $OpenBSD: ssh-ecdsa.c,v 1.14 2018/02/07 02:06:51 jsing Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  * Copyright (c) 2010 Damien Miller.  All rights reserved.
@@ -101,8 +101,7 @@
 	explicit_bzero(digest, sizeof(digest));
 	sshbuf_free(b);
 	sshbuf_free(bb);
-	if (sig != NULL)
-		ECDSA_SIG_free(sig);
+	ECDSA_SIG_free(sig);
 	return ret;
 }
 
@@ -180,8 +179,7 @@
 	explicit_bzero(digest, sizeof(digest));
 	sshbuf_free(sigbuf);
 	sshbuf_free(b);
-	if (sig != NULL)
-		ECDSA_SIG_free(sig);
+	ECDSA_SIG_free(sig);
 	free(ktype);
 	return ret;
 }
diff --git a/ssh-gss.h b/ssh-gss.h
index a99d7f0..36180d0 100644
--- a/ssh-gss.h
+++ b/ssh-gss.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-gss.h,v 1.11 2014/02/26 20:28:44 djm Exp $ */
+/* $OpenBSD: ssh-gss.h,v 1.14 2018/07/10 09:13:30 djm Exp $ */
 /*
  * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
  *
@@ -107,6 +107,9 @@
 void ssh_gssapi_prepare_supported_oids(void);
 OM_uint32 ssh_gssapi_test_oid_supported(OM_uint32 *, gss_OID, int *);
 
+struct sshbuf;
+int ssh_gssapi_get_buffer_desc(struct sshbuf *, gss_buffer_desc *);
+
 OM_uint32 ssh_gssapi_import_name(Gssctxt *, const char *);
 OM_uint32 ssh_gssapi_init_ctx(Gssctxt *, int,
     gss_buffer_desc *, gss_buffer_desc *, OM_uint32 *);
@@ -118,7 +121,8 @@
 void ssh_gssapi_build_ctx(Gssctxt **);
 void ssh_gssapi_delete_ctx(Gssctxt **);
 OM_uint32 ssh_gssapi_sign(Gssctxt *, gss_buffer_t, gss_buffer_t);
-void ssh_gssapi_buildmic(Buffer *, const char *, const char *, const char *);
+void ssh_gssapi_buildmic(struct sshbuf *, const char *,
+    const char *, const char *);
 int ssh_gssapi_check_mechanism(Gssctxt **, gss_OID, const char *);
 
 /* In the server */
@@ -128,6 +132,7 @@
 void ssh_gssapi_do_child(char ***, u_int *);
 void ssh_gssapi_cleanup_creds(void);
 void ssh_gssapi_storecreds(void);
+const char *ssh_gssapi_displayname(void);
 
 #endif /* GSSAPI */
 
diff --git a/ssh-keygen.1 b/ssh-keygen.1
index ce2213c..dd6e7e5 100644
--- a/ssh-keygen.1
+++ b/ssh-keygen.1
@@ -1,4 +1,4 @@
-.\"	$OpenBSD: ssh-keygen.1,v 1.133 2016/06/16 06:10:45 jmc Exp $
+.\"	$OpenBSD: ssh-keygen.1,v 1.148 2018/08/08 01:16:01 djm Exp $
 .\"
 .\" Author: Tatu Ylonen <ylo@cs.hut.fi>
 .\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -35,7 +35,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd $Mdocdate: June 16 2016 $
+.Dd $Mdocdate: August 8 2018 $
 .Dt SSH-KEYGEN 1
 .Os
 .Sh NAME
@@ -46,7 +46,7 @@
 .Nm ssh-keygen
 .Op Fl q
 .Op Fl b Ar bits
-.Op Fl t Cm dsa | ecdsa | ed25519 | rsa | rsa1
+.Op Fl t Cm dsa | ecdsa | ed25519 | rsa
 .Op Fl N Ar new_passphrase
 .Op Fl C Ar comment
 .Op Fl f Ar output_keyfile
@@ -114,6 +114,8 @@
 .Fl s Ar ca_key
 .Fl I Ar certificate_identity
 .Op Fl h
+.Op Fl U
+.Op Fl D Ar pkcs11_provider
 .Op Fl n Ar principals
 .Op Fl O Ar option
 .Op Fl V Ar validity_interval
@@ -124,6 +126,7 @@
 .Op Fl f Ar input_keyfile
 .Nm ssh-keygen
 .Fl A
+.Op Fl f Ar prefix_path
 .Nm ssh-keygen
 .Fl k
 .Fl f Ar krl_file
@@ -141,18 +144,14 @@
 generates, manages and converts authentication keys for
 .Xr ssh 1 .
 .Nm
-can create keys for use by SSH protocol versions 1 and 2.
-Protocol 1 should not be used
-and is only offered to support legacy devices.
-It suffers from a number of cryptographic weaknesses
-and doesn't support many of the advanced features available for protocol 2.
+can create keys for use by SSH protocol version 2.
 .Pp
 The type of key to be generated is specified with the
 .Fl t
 option.
 If invoked without any arguments,
 .Nm
-will generate an RSA key for use in SSH protocol 2 connections.
+will generate an RSA key.
 .Pp
 .Nm
 is also used to generate groups for use in Diffie-Hellman group
@@ -172,7 +171,6 @@
 Normally each user wishing to use SSH
 with public key authentication runs this once to create the authentication
 key in
-.Pa ~/.ssh/identity ,
 .Pa ~/.ssh/id_dsa ,
 .Pa ~/.ssh/id_ecdsa ,
 .Pa ~/.ssh/id_ed25519
@@ -207,7 +205,7 @@
 If the passphrase is lost or forgotten, a new key must be generated
 and the corresponding public key copied to other machines.
 .Pp
-For RSA1 keys and keys stored in the newer OpenSSH format,
+For keys stored in the newer OpenSSH format,
 there is also a comment field in the key file that is only for
 convenience to the user to help identify the key.
 The comment can tell what the key is for, or whatever is useful.
@@ -223,24 +221,24 @@
 The options are as follows:
 .Bl -tag -width Ds
 .It Fl A
-For each of the key types (rsa1, rsa, dsa, ecdsa and ed25519)
+For each of the key types (rsa, dsa, ecdsa and ed25519)
 for which host keys
 do not exist, generate the host keys with the default key file path,
 an empty passphrase, default bits for the key type, and default comment.
+If
+.Fl f
+has also been specified, its argument is used as a prefix to the
+default path for the resulting host key files.
 This is used by
 .Pa /etc/rc
 to generate new host keys.
 .It Fl a Ar rounds
-When saving a new-format private key (i.e. an ed25519 key or any SSH protocol
-2 key when the
-.Fl o
-flag is set), this option specifies the number of KDF (key derivation function)
-rounds used.
+When saving a private key this option specifies the number of KDF
+(key derivation function) rounds used.
 Higher numbers result in slower passphrase verification and increased
 resistance to brute-force password cracking (should the keys be stolen).
 .Pp
-When screening DH-GEX candidates (
-using the
+When screening DH-GEX candidates (using the
 .Fl T
 command).
 This option specifies the number of primality tests to perform.
@@ -264,8 +262,6 @@
 Provides a new comment.
 .It Fl c
 Requests changing the comment in the private and public key files.
-This operation is only supported for RSA1 keys and keys stored in the
-newer OpenSSH format.
 The program will prompt for the file containing the private keys, for
 the passphrase if the key has one, and for the new comment.
 .It Fl D Ar pkcs11
@@ -384,7 +380,6 @@
 Prints the contents of one or more certificates.
 .It Fl l
 Show fingerprint of specified public key file.
-Private RSA1 keys are also supported.
 For RSA and DSA keys
 .Nm
 tries to find the matching public key file and prints its fingerprint.
@@ -411,6 +406,10 @@
 (PEM public key).
 The default conversion format is
 .Dq RFC4716 .
+Setting a format of
+.Dq PEM
+when generating or updating a supported private key type will cause the
+key to be stored in the legacy PEM private key format.
 .It Fl N Ar new_passphrase
 Provides the new passphrase.
 .It Fl n Ar principals
@@ -423,51 +422,81 @@
 .It Fl O Ar option
 Specify a certificate option when signing a key.
 This option may be specified multiple times.
-Please see the
+See also the
 .Sx CERTIFICATES
-section for details.
+section for further details.
+.Pp
+At present, no standard options are valid for host keys.
 The options that are valid for user certificates are:
-.Bl -tag -width Ds
+.Pp
+.Bl -tag -width Ds -compact
 .It Ic clear
 Clear all enabled permissions.
 This is useful for clearing the default set of permissions so permissions may
 be added individually.
+.Pp
+.It Ic critical : Ns Ar name Ns Op Ns = Ns Ar contents
+.It Ic extension : Ns Ar name Ns Op Ns = Ns Ar contents
+Includes an arbitrary certificate critical option or extension.
+The specified
+.Ar name
+should include a domain suffix, e.g.\&
+.Dq name@example.com .
+If
+.Ar contents
+is specified then it is included as the contents of the extension/option
+encoded as a string, otherwise the extension/option is created with no
+contents (usually indicating a flag).
+Extensions may be ignored by a client or server that does not recognise them,
+whereas unknown critical options will cause the certificate to be refused.
+.Pp
 .It Ic force-command Ns = Ns Ar command
 Forces the execution of
 .Ar command
 instead of any shell or command specified by the user when
 the certificate is used for authentication.
+.Pp
 .It Ic no-agent-forwarding
 Disable
 .Xr ssh-agent 1
 forwarding (permitted by default).
+.Pp
 .It Ic no-port-forwarding
 Disable port forwarding (permitted by default).
+.Pp
 .It Ic no-pty
 Disable PTY allocation (permitted by default).
+.Pp
 .It Ic no-user-rc
 Disable execution of
 .Pa ~/.ssh/rc
 by
 .Xr sshd 8
 (permitted by default).
+.Pp
 .It Ic no-x11-forwarding
 Disable X11 forwarding (permitted by default).
+.Pp
 .It Ic permit-agent-forwarding
 Allows
 .Xr ssh-agent 1
 forwarding.
+.Pp
 .It Ic permit-port-forwarding
 Allows port forwarding.
+.Pp
 .It Ic permit-pty
 Allows PTY allocation.
+.Pp
 .It Ic permit-user-rc
 Allows execution of
 .Pa ~/.ssh/rc
 by
 .Xr sshd 8 .
-.It Ic permit-x11-forwarding
+.Pp
+.It Ic permit-X11-forwarding
 Allows X11 forwarding.
+.Pp
 .It Ic source-address Ns = Ns Ar address_list
 Restrict the source addresses from which the certificate is considered valid.
 The
@@ -475,16 +504,6 @@
 is a comma-separated list of one or more address/netmask pairs in CIDR
 format.
 .El
-.Pp
-At present, no options are valid for host keys.
-.It Fl o
-Causes
-.Nm
-to save private keys using the new OpenSSH format rather than
-the more compatible PEM format.
-The new format has increased resistance to brute-force password cracking
-but is not supported by versions of OpenSSH prior to 6.5.
-Ed25519 keys always use the new private key format.
 .It Fl P Ar passphrase
 Provides the (old) passphrase.
 .It Fl p
@@ -530,17 +549,22 @@
 Test DH group exchange candidate primes (generated using the
 .Fl G
 option) for safety.
-.It Fl t Cm dsa | ecdsa | ed25519 | rsa | rsa1
+.It Fl t Cm dsa | ecdsa | ed25519 | rsa
 Specifies the type of key to create.
 The possible values are
-.Dq rsa1
-for protocol version 1 and
 .Dq dsa ,
 .Dq ecdsa ,
 .Dq ed25519 ,
 or
-.Dq rsa
-for protocol version 2.
+.Dq rsa .
+.It Fl U
+When used in combination with
+.Fl s ,
+this option indicates that a CA key resides in a
+.Xr ssh-agent 1 .
+See the
+.Sx CERTIFICATES
+section for more information.
 .It Fl u
 Update a KRL.
 When specified with
@@ -552,13 +576,20 @@
 A validity interval may consist of a single time, indicating that the
 certificate is valid beginning now and expiring at that time, or may consist
 of two times separated by a colon to indicate an explicit time interval.
-The start time may be specified as a date in YYYYMMDD format, a time
-in YYYYMMDDHHMMSS format or a relative time (to the current time) consisting
-of a minus sign followed by a relative time in the format described in the
+.Pp
+The start time may be specified as the string
+.Dq always
+to indicate the certificate has no specified start time,
+a date in YYYYMMDD format, a time in YYYYMMDDHHMM[SS] format,
+a relative time (to the current time) consisting of a minus sign followed by
+an interval in the format described in the
 TIME FORMATS section of
 .Xr sshd_config 5 .
-The end time may be specified as a YYYYMMDD date, a YYYYMMDDHHMMSS time or
-a relative time starting with a plus character.
+.Pp
+The end time may be specified as a YYYYMMDD date, a YYYYMMDDHHMM[SS] time,
+a relative time starting with a plus character or the string
+.Dq forever
+to indicate that the certificate has no expirty date.
 .Pp
 For example:
 .Dq +52w1d
@@ -569,6 +600,8 @@
 (valid from 12:30 PM, January 1st, 2010 to 12:30 PM, January 1st, 2011),
 .Dq -1d:20110101
 (valid from yesterday to midnight, January 1st, 2011).
+.Dq -1m:forever
+(valid from one minute ago and never expiring).
 .It Fl v
 Verbose mode.
 Causes
@@ -688,6 +721,14 @@
 .Pp
 .Dl $ ssh-keygen -s ca_key.pub -D libpkcs11.so -I key_id user_key.pub
 .Pp
+Similarly, it is possible for the CA key to be hosted in a
+.Xr ssh-agent 1 .
+This is indicated by the
+.Fl U
+flag and, again, the CA key must be identified by its public half.
+.Pp
+.Dl $ ssh-keygen -Us ca_key.pub -I key_id user_key.pub
+.Pp
 In all cases,
 .Ar key_id
 is a "key identifier" that is logged by the server when the certificate
@@ -795,31 +836,11 @@
 A zero exit status will only be returned if no key was revoked.
 .Sh FILES
 .Bl -tag -width Ds -compact
-.It Pa ~/.ssh/identity
-Contains the protocol version 1 RSA authentication identity of the user.
-This file should not be readable by anyone but the user.
-It is possible to
-specify a passphrase when generating the key; that passphrase will be
-used to encrypt the private part of this file using 3DES.
-This file is not automatically accessed by
-.Nm
-but it is offered as the default file for the private key.
-.Xr ssh 1
-will read this file when a login attempt is made.
-.Pp
-.It Pa ~/.ssh/identity.pub
-Contains the protocol version 1 RSA public key for authentication.
-The contents of this file should be added to
-.Pa ~/.ssh/authorized_keys
-on all machines
-where the user wishes to log in using RSA authentication.
-There is no need to keep the contents of this file secret.
-.Pp
 .It Pa ~/.ssh/id_dsa
 .It Pa ~/.ssh/id_ecdsa
 .It Pa ~/.ssh/id_ed25519
 .It Pa ~/.ssh/id_rsa
-Contains the protocol version 2 DSA, ECDSA, Ed25519 or RSA
+Contains the DSA, ECDSA, Ed25519 or RSA
 authentication identity of the user.
 This file should not be readable by anyone but the user.
 It is possible to
@@ -835,7 +856,7 @@
 .It Pa ~/.ssh/id_ecdsa.pub
 .It Pa ~/.ssh/id_ed25519.pub
 .It Pa ~/.ssh/id_rsa.pub
-Contains the protocol version 2 DSA, ECDSA, Ed25519 or RSA
+Contains the DSA, ECDSA, Ed25519 or RSA
 public key for authentication.
 The contents of this file should be added to
 .Pa ~/.ssh/authorized_keys
diff --git a/ssh-keygen.c b/ssh-keygen.c
index 2259b34..22860ad 100644
--- a/ssh-keygen.c
+++ b/ssh-keygen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keygen.c,v 1.296 2017/03/03 06:13:11 djm Exp $ */
+/* $OpenBSD: ssh-keygen.c,v 1.319 2018/08/08 01:16:01 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -38,10 +38,10 @@
 #include <unistd.h>
 #include <limits.h>
 #include <locale.h>
+#include <time.h>
 
 #include "xmalloc.h"
 #include "sshkey.h"
-#include "rsa.h"
 #include "authfile.h"
 #include "uuencode.h"
 #include "sshbuf.h"
@@ -59,6 +59,7 @@
 #include "krl.h"
 #include "digest.h"
 #include "utf8.h"
+#include "authfd.h"
 
 #ifdef WITH_OPENSSL
 # define DEFAULT_KEY_TYPE_NAME "rsa"
@@ -121,6 +122,9 @@
 /* Path to CA key when certifying keys. */
 char *ca_key_path = NULL;
 
+/* Prefer to use agent keys for CA signing */
+int prefer_agent = 0;
+
 /* Certificate serial number */
 unsigned long long cert_serial = 0;
 
@@ -149,6 +153,15 @@
 char *certflags_command = NULL;
 char *certflags_src_addr = NULL;
 
+/* Arbitrary extensions specified by user */
+struct cert_userext {
+	char *key;
+	char *val;
+	int crit;
+};
+struct cert_userext *cert_userext;
+size_t ncert_userext;
+
 /* Conversion to/from various formats */
 int convert_to = 0;
 int convert_from = 0;
@@ -166,7 +179,7 @@
 char *pkcs11provider = NULL;
 
 /* Use new OpenSSH private key format when writing SSH2 keys instead of PEM */
-int use_new_format = 0;
+int use_new_format = 1;
 
 /* Cipher for new-format private keys */
 char *new_format_cipher = NULL;
@@ -217,13 +230,21 @@
 	    OPENSSL_DSA_MAX_MODULUS_BITS : OPENSSL_RSA_MAX_MODULUS_BITS;
 	if (*bitsp > maxbits)
 		fatal("key bits exceeds maximum %d", maxbits);
-	if (type == KEY_DSA && *bitsp != 1024)
-		fatal("DSA keys must be 1024 bits");
-	else if (type != KEY_ECDSA && type != KEY_ED25519 && *bitsp < 1024)
-		fatal("Key must at least be 1024 bits");
-	else if (type == KEY_ECDSA && sshkey_ecdsa_bits_to_nid(*bitsp) == -1)
-		fatal("Invalid ECDSA key length - valid lengths are "
-		    "256, 384 or 521 bits");
+	switch (type) {
+	case KEY_DSA:
+		if (*bitsp != 1024)
+			fatal("Invalid DSA key length: must be 1024 bits");
+		break;
+	case KEY_RSA:
+		if (*bitsp < SSH_RSA_MINIMUM_MODULUS_SIZE)
+			fatal("Invalid RSA key length: minimum is %d bits",
+			    SSH_RSA_MINIMUM_MODULUS_SIZE);
+		break;
+	case KEY_ECDSA:
+		if (sshkey_ecdsa_bits_to_nid(*bitsp) == -1)
+			fatal("Invalid ECDSA key length: valid lengths are "
+			    "256, 384 or 521 bits");
+	}
 #endif
 }
 
@@ -237,9 +258,6 @@
 		name = _PATH_SSH_CLIENT_ID_RSA;
 	else {
 		switch (sshkey_type_from_name(key_type_name)) {
-		case KEY_RSA1:
-			name = _PATH_SSH_CLIENT_IDENTITY;
-			break;
 		case KEY_DSA_CERT:
 		case KEY_DSA:
 			name = _PATH_SSH_CLIENT_ID_DSA;
@@ -258,6 +276,10 @@
 		case KEY_ED25519_CERT:
 			name = _PATH_SSH_CLIENT_ID_ED25519;
 			break;
+		case KEY_XMSS:
+		case KEY_XMSS_CERT:
+			name = _PATH_SSH_CLIENT_ID_XMSS;
+			break;
 		default:
 			fatal("bad key type");
 		}
@@ -311,8 +333,6 @@
 	char comment[61];
 	int r;
 
-	if (k->type == KEY_RSA1)
-		fatal("version 1 keys are not supported");
 	if ((r = sshkey_to_blob(k, &blob, &len)) != 0)
 		fatal("key_to_blob failed: %s", ssh_err(r));
 	/* Comment + surrounds must fit into 72 chars (RFC 4716 sec 3.3) */
@@ -334,7 +354,6 @@
 do_convert_to_pkcs8(struct sshkey *k)
 {
 	switch (sshkey_type_plain(k->type)) {
-	case KEY_RSA1:
 	case KEY_RSA:
 		if (!PEM_write_RSA_PUBKEY(stdout, k->rsa))
 			fatal("PEM_write_RSA_PUBKEY failed");
@@ -359,18 +378,10 @@
 do_convert_to_pem(struct sshkey *k)
 {
 	switch (sshkey_type_plain(k->type)) {
-	case KEY_RSA1:
 	case KEY_RSA:
 		if (!PEM_write_RSAPublicKey(stdout, k->rsa))
 			fatal("PEM_write_RSAPublicKey failed");
 		break;
-#if notyet /* OpenSSH 0.9.8 lacks this function */
-	case KEY_DSA:
-		if (!PEM_write_DSAPublicKey(stdout, k->dsa))
-			fatal("PEM_write_DSAPublicKey failed");
-		break;
-#endif
-	/* XXX ECDSA? */
 	default:
 		fatal("%s: unsupported key type %s", __func__, sshkey_type(k));
 	}
@@ -478,7 +489,7 @@
 		return NULL;
 	}
 	if ((key = sshkey_new_private(ktype)) == NULL)
-		fatal("key_new_private failed");
+		fatal("sshkey_new_private failed");
 	free(type);
 
 	switch (key->type) {
@@ -514,7 +525,7 @@
 		buffer_get_bignum_bits(b, key->rsa->iqmp);
 		buffer_get_bignum_bits(b, key->rsa->q);
 		buffer_get_bignum_bits(b, key->rsa->p);
-		if ((r = rsa_generate_additional_parameters(key->rsa)) != 0)
+		if ((r = ssh_rsa_generate_additional_parameters(key)) != 0)
 			fatal("generate RSA parameters failed: %s", ssh_err(r));
 		break;
 	}
@@ -526,7 +537,7 @@
 
 	/* try the key */
 	if (sshkey_sign(key, &sig, &slen, data, sizeof(data), NULL, 0) != 0 ||
-	    sshkey_verify(key, sig, slen, data, sizeof(data), 0) != 0) {
+	    sshkey_verify(key, sig, slen, data, sizeof(data), NULL, 0) != 0) {
 		sshkey_free(key);
 		free(sig);
 		return NULL;
@@ -658,9 +669,6 @@
 {
 	FILE *fp;
 	RSA *rsa;
-#ifdef notyet
-	DSA *dsa;
-#endif
 
 	if ((fp = fopen(identity_file, "r")) == NULL)
 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
@@ -672,18 +680,6 @@
 		fclose(fp);
 		return;
 	}
-#if notyet /* OpenSSH 0.9.8 lacks this function */
-	rewind(fp);
-	if ((dsa = PEM_read_DSAPublicKey(fp, NULL, NULL, NULL)) != NULL) {
-		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
-			fatal("sshkey_new failed");
-		(*k)->type = KEY_DSA;
-		(*k)->dsa = dsa;
-		fclose(fp);
-		return;
-	}
-	/* XXX ECDSA */
-#endif
 	fatal("%s: unrecognised raw private key format", __func__);
 }
 
@@ -760,7 +756,7 @@
 		fatal("%s: %s", identity_file, strerror(errno));
 	prv = load_identity(identity_file);
 	if ((r = sshkey_write(prv, stdout)) != 0)
-		error("key_write failed: %s", ssh_err(r));
+		error("sshkey_write failed: %s", ssh_err(r));
 	sshkey_free(prv);
 	fprintf(stdout, "\n");
 	exit(0);
@@ -816,13 +812,6 @@
 	struct sshkey *ret;
 	int r;
 
-	if ((ret = sshkey_new(KEY_RSA1)) == NULL)
-		fatal("sshkey_new failed");
-	/* Try RSA1 */
-	if ((r = sshkey_read(ret, cpp)) == 0)
-		return ret;
-	/* Try modern */
-	sshkey_free(ret);
 	if ((ret = sshkey_new(KEY_UNSPEC)) == NULL)
 		fatal("sshkey_new failed");
 	if ((r = sshkey_read(ret, cpp)) == 0)
@@ -882,7 +871,8 @@
 {
 	FILE *f;
 	struct sshkey *public = NULL;
-	char *comment = NULL, *cp, *ep, line[SSH_MAX_PUBKEY_BYTES];
+	char *comment = NULL, *cp, *ep, *line = NULL;
+	size_t linesize = 0;
 	int i, invalid = 1;
 	const char *path;
 	u_long lnum = 0;
@@ -897,7 +887,8 @@
 	} else if ((f = fopen(path, "r")) == NULL)
 		fatal("%s: %s: %s", __progname, path, strerror(errno));
 
-	while (read_keyfile_line(f, path, line, sizeof(line), &lnum) == 0) {
+	while (getline(&line, &linesize, f) != -1) {
+		lnum++;
 		cp = line;
 		cp[strcspn(cp, "\n")] = '\0';
 		/* Trim leading space and comments */
@@ -917,6 +908,7 @@
 		 */
 		if (lnum == 1 && strcmp(identity_file, "-") != 0 &&
 		    strstr(cp, "PRIVATE KEY") != NULL) {
+			free(line);
 			fclose(f);
 			fingerprint_private(path);
 			exit(0);
@@ -963,6 +955,7 @@
 		invalid = 0; /* One good key in the file is sufficient */
 	}
 	fclose(f);
+	free(line);
 
 	if (invalid)
 		fatal("%s is not a public key file.", path);
@@ -978,9 +971,6 @@
 		char *path;
 	} key_types[] = {
 #ifdef WITH_OPENSSL
-#ifdef WITH_SSH1
-		{ "rsa1", "RSA1", _PATH_HOST_KEY_FILE },
-#endif /* WITH_SSH1 */
 		{ "rsa", "RSA" ,_PATH_HOST_RSA_KEY_FILE },
 		{ "dsa", "DSA", _PATH_HOST_DSA_KEY_FILE },
 #ifdef OPENSSL_HAS_ECC
@@ -988,26 +978,47 @@
 #endif /* OPENSSL_HAS_ECC */
 #endif /* WITH_OPENSSL */
 		{ "ed25519", "ED25519",_PATH_HOST_ED25519_KEY_FILE },
+#ifdef WITH_XMSS
+		{ "xmss", "XMSS",_PATH_HOST_XMSS_KEY_FILE },
+#endif /* WITH_XMSS */
 		{ NULL, NULL, NULL }
 	};
 
 	int first = 0;
 	struct stat st;
 	struct sshkey *private, *public;
-	char comment[1024];
+	char comment[1024], *prv_tmp, *pub_tmp, *prv_file, *pub_file;
 	int i, type, fd, r;
 	FILE *f;
 
 	for (i = 0; key_types[i].key_type; i++) {
-		if (stat(key_types[i].path, &st) == 0)
-			continue;
-		if (errno != ENOENT) {
+		public = private = NULL;
+		prv_tmp = pub_tmp = prv_file = pub_file = NULL;
+
+		xasprintf(&prv_file, "%s%s",
+		    identity_file, key_types[i].path);
+
+		/* Check whether private key exists and is not zero-length */
+		if (stat(prv_file, &st) == 0) {
+			if (st.st_size != 0)
+				goto next;
+		} else if (errno != ENOENT) {
 			error("Could not stat %s: %s", key_types[i].path,
 			    strerror(errno));
-			first = 0;
-			continue;
+			goto failnext;
 		}
 
+		/*
+		 * Private key doesn't exist or is invalid; proceed with
+		 * key generation.
+		 */
+		xasprintf(&prv_tmp, "%s%s.XXXXXXXXXX",
+		    identity_file, key_types[i].path);
+		xasprintf(&pub_tmp, "%s%s.pub.XXXXXXXXXX",
+		    identity_file, key_types[i].path);
+		xasprintf(&pub_file, "%s%s.pub",
+		    identity_file, key_types[i].path);
+
 		if (first == 0) {
 			first = 1;
 			printf("%s: generating new host keys: ", __progname);
@@ -1015,56 +1026,76 @@
 		printf("%s ", key_types[i].key_type_display);
 		fflush(stdout);
 		type = sshkey_type_from_name(key_types[i].key_type);
-		strlcpy(identity_file, key_types[i].path, sizeof(identity_file));
+		if ((fd = mkstemp(prv_tmp)) == -1) {
+			error("Could not save your public key in %s: %s",
+			    prv_tmp, strerror(errno));
+			goto failnext;
+		}
+		close(fd); /* just using mkstemp() to generate/reserve a name */
 		bits = 0;
 		type_bits_valid(type, NULL, &bits);
 		if ((r = sshkey_generate(type, bits, &private)) != 0) {
-			error("key_generate failed: %s", ssh_err(r));
-			first = 0;
-			continue;
+			error("sshkey_generate failed: %s", ssh_err(r));
+			goto failnext;
 		}
 		if ((r = sshkey_from_private(private, &public)) != 0)
 			fatal("sshkey_from_private failed: %s", ssh_err(r));
 		snprintf(comment, sizeof comment, "%s@%s", pw->pw_name,
 		    hostname);
-		if ((r = sshkey_save_private(private, identity_file, "",
+		if ((r = sshkey_save_private(private, prv_tmp, "",
 		    comment, use_new_format, new_format_cipher, rounds)) != 0) {
 			error("Saving key \"%s\" failed: %s",
-			    identity_file, ssh_err(r));
-			sshkey_free(private);
-			sshkey_free(public);
-			first = 0;
-			continue;
+			    prv_tmp, ssh_err(r));
+			goto failnext;
 		}
-		sshkey_free(private);
-		strlcat(identity_file, ".pub", sizeof(identity_file));
-		fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-		if (fd == -1) {
-			error("Could not save your public key in %s",
-			    identity_file);
-			sshkey_free(public);
-			first = 0;
-			continue;
+		if ((fd = mkstemp(pub_tmp)) == -1) {
+			error("Could not save your public key in %s: %s",
+			    pub_tmp, strerror(errno));
+			goto failnext;
 		}
+		(void)fchmod(fd, 0644);
 		f = fdopen(fd, "w");
 		if (f == NULL) {
-			error("fdopen %s failed", identity_file);
+			error("fdopen %s failed: %s", pub_tmp, strerror(errno));
 			close(fd);
-			sshkey_free(public);
-			first = 0;
-			continue;
+			goto failnext;
 		}
 		if ((r = sshkey_write(public, f)) != 0) {
 			error("write key failed: %s", ssh_err(r));
 			fclose(f);
-			sshkey_free(public);
-			first = 0;
-			continue;
+			goto failnext;
 		}
 		fprintf(f, " %s\n", comment);
-		fclose(f);
-		sshkey_free(public);
+		if (ferror(f) != 0) {
+			error("write key failed: %s", strerror(errno));
+			fclose(f);
+			goto failnext;
+		}
+		if (fclose(f) != 0) {
+			error("key close failed: %s", strerror(errno));
+			goto failnext;
+		}
 
+		/* Rename temporary files to their permanent locations. */
+		if (rename(pub_tmp, pub_file) != 0) {
+			error("Unable to move %s into position: %s",
+			    pub_file, strerror(errno));
+			goto failnext;
+		}
+		if (rename(prv_tmp, prv_file) != 0) {
+			error("Unable to move %s into position: %s",
+			    key_types[i].path, strerror(errno));
+ failnext:
+			first = 0;
+			goto next;
+		}
+ next:
+		sshkey_free(private);
+		sshkey_free(public);
+		free(prv_tmp);
+		free(pub_tmp);
+		free(prv_file);
+		free(pub_file);
 	}
 	if (first != 0)
 		printf("\n");
@@ -1084,7 +1115,7 @@
 	struct known_hosts_ctx *ctx = (struct known_hosts_ctx *)_ctx;
 	char *hashed, *cp, *hosts, *ohosts;
 	int has_wild = l->hosts && strcspn(l->hosts, "*?!") != strlen(l->hosts);
-	int was_hashed = l->hosts[0] == HASH_DELIM;
+	int was_hashed = l->hosts && l->hosts[0] == HASH_DELIM;
 
 	switch (l->status) {
 	case HKF_STATUS_OK:
@@ -1096,7 +1127,7 @@
 		if (was_hashed || has_wild || l->marker != MRK_NONE) {
 			fprintf(ctx->out, "%s\n", l->line);
 			if (has_wild && !find_host) {
-				logit("%s:%ld: ignoring host name "
+				logit("%s:%lu: ignoring host name "
 				    "with wildcard: %.64s", l->path,
 				    l->linenum, l->hosts);
 			}
@@ -1108,6 +1139,7 @@
 		 */
 		ohosts = hosts = xstrdup(l->hosts);
 		while ((cp = strsep(&hosts, ",")) != NULL && *cp != '\0') {
+			lowercase(cp);
 			if ((hashed = host_hash(cp, NULL, 0)) == NULL)
 				fatal("hash_host failed");
 			fprintf(ctx->out, "%s %s\n", hashed, l->rawkey);
@@ -1118,7 +1150,7 @@
 	case HKF_STATUS_INVALID:
 		/* Retain invalid lines, but mark file as invalid. */
 		ctx->invalid = 1;
-		logit("%s:%ld: invalid line", l->path, l->linenum);
+		logit("%s:%lu: invalid line", l->path, l->linenum);
 		/* FALLTHROUGH */
 	default:
 		fprintf(ctx->out, "%s\n", l->line);
@@ -1152,14 +1184,14 @@
 				 */
 				ctx->found_key = 1;
 				if (!quiet)
-					printf("# Host %s found: line %ld\n",
+					printf("# Host %s found: line %lu\n",
 					    ctx->host, l->linenum);
 			}
 			return 0;
 		} else if (find_host) {
 			ctx->found_key = 1;
 			if (!quiet) {
-				printf("# Host %s found: line %ld %s\n",
+				printf("# Host %s found: line %lu %s\n",
 				    ctx->host,
 				    l->linenum, l->marker == MRK_CA ? "CA" :
 				    (l->marker == MRK_REVOKE ? "REVOKED" : ""));
@@ -1179,7 +1211,7 @@
 		/* Retain non-matching hosts when deleting */
 		if (l->status == HKF_STATUS_INVALID) {
 			ctx->invalid = 1;
-			logit("%s:%ld: invalid line", l->path, l->linenum);
+			logit("%s:%lu: invalid line", l->path, l->linenum);
 		}
 		fprintf(ctx->out, "%s\n", l->line);
 	}
@@ -1227,13 +1259,12 @@
 		}
 		inplace = 1;
 	}
-
 	/* XXX support identity_file == "-" for stdin */
 	foreach_options = find_host ? HKF_WANT_MATCH : 0;
 	foreach_options |= print_fingerprint ? HKF_WANT_PARSE_KEY : 0;
-	if ((r = hostkeys_foreach(identity_file,
-	    hash_hosts ? known_hosts_hash : known_hosts_find_delete, &ctx,
-	    name, NULL, foreach_options)) != 0) {
+	if ((r = hostkeys_foreach(identity_file, (find_host || !hash_hosts) ?
+	    known_hosts_find_delete : known_hosts_hash, &ctx, name, NULL,
+	    foreach_options)) != 0) {
 		if (inplace)
 			unlink(tmp);
 		fatal("%s: hostkeys_foreach failed: %s", __func__, ssh_err(r));
@@ -1435,9 +1466,9 @@
 		}
 	}
 
-	if (private->type != KEY_RSA1 && private->type != KEY_ED25519 &&
+	if (private->type != KEY_ED25519 && private->type != KEY_XMSS &&
 	    !use_new_format) {
-		error("Comments are only supported for RSA1 or keys stored in "
+		error("Comments are only supported for keys stored in "
 		    "the new format (-o).");
 		explicit_bzero(passphrase, strlen(passphrase));
 		sshkey_free(private);
@@ -1475,7 +1506,7 @@
 	explicit_bzero(passphrase, strlen(passphrase));
 	free(passphrase);
 	if ((r = sshkey_from_private(private, &public)) != 0)
-		fatal("key_from_private failed: %s", ssh_err(r));
+		fatal("sshkey_from_private failed: %s", ssh_err(r));
 	sshkey_free(private);
 
 	strlcat(identity_file, ".pub", sizeof(identity_file));
@@ -1530,6 +1561,8 @@
 static void
 prepare_options_buf(struct sshbuf *c, int which)
 {
+	size_t i;
+
 	sshbuf_reset(c);
 	if ((which & OPTIONS_CRITICAL) != 0 &&
 	    certflags_command != NULL)
@@ -1552,6 +1585,17 @@
 	if ((which & OPTIONS_CRITICAL) != 0 &&
 	    certflags_src_addr != NULL)
 		add_string_option(c, "source-address", certflags_src_addr);
+	for (i = 0; i < ncert_userext; i++) {
+		if ((cert_userext[i].crit && (which & OPTIONS_EXTENSIONS)) ||
+		    (!cert_userext[i].crit && (which & OPTIONS_CRITICAL)))
+			continue;
+		if (cert_userext[i].val == NULL)
+			add_flag_option(c, cert_userext[i].key);
+		else {
+			add_string_option(c, cert_userext[i].key,
+			    cert_userext[i].val);
+		}
+	}
 }
 
 static struct sshkey *
@@ -1584,24 +1628,66 @@
 #endif /* ENABLE_PKCS11 */
 }
 
+/* Signer for sshkey_certify_custom that uses the agent */
+static int
+agent_signer(const struct sshkey *key, u_char **sigp, size_t *lenp,
+    const u_char *data, size_t datalen,
+    const char *alg, u_int compat, void *ctx)
+{
+	int *agent_fdp = (int *)ctx;
+
+	return ssh_agent_sign(*agent_fdp, key, sigp, lenp,
+	    data, datalen, alg, compat);
+}
+
 static void
 do_ca_sign(struct passwd *pw, int argc, char **argv)
 {
-	int r, i, fd;
+	int r, i, fd, found, agent_fd = -1;
 	u_int n;
 	struct sshkey *ca, *public;
 	char valid[64], *otmp, *tmp, *cp, *out, *comment, **plist = NULL;
 	FILE *f;
+	struct ssh_identitylist *agent_ids;
+	size_t j;
 
 #ifdef ENABLE_PKCS11
 	pkcs11_init(1);
 #endif
 	tmp = tilde_expand_filename(ca_key_path, pw->pw_uid);
 	if (pkcs11provider != NULL) {
+		/* If a PKCS#11 token was specified then try to use it */
 		if ((ca = load_pkcs11_key(tmp)) == NULL)
 			fatal("No PKCS#11 key matching %s found", ca_key_path);
-	} else
+	} else if (prefer_agent) {
+		/*
+		 * Agent signature requested. Try to use agent after making
+		 * sure the public key specified is actually present in the
+		 * agent.
+		 */
+		if ((r = sshkey_load_public(tmp, &ca, NULL)) != 0)
+			fatal("Cannot load CA public key %s: %s",
+			    tmp, ssh_err(r));
+		if ((r = ssh_get_authentication_socket(&agent_fd)) != 0)
+			fatal("Cannot use public key for CA signature: %s",
+			    ssh_err(r));
+		if ((r = ssh_fetch_identitylist(agent_fd, &agent_ids)) != 0)
+			fatal("Retrieve agent key list: %s", ssh_err(r));
+		found = 0;
+		for (j = 0; j < agent_ids->nkeys; j++) {
+			if (sshkey_equal(ca, agent_ids->keys[j])) {
+				found = 1;
+				break;
+			}
+		}
+		if (!found)
+			fatal("CA key %s not found in agent", tmp);
+		ssh_free_identitylist(agent_ids);
+		ca->flags |= SSHKEY_FLAG_EXT;
+	} else {
+		/* CA key is assumed to be a private key on the filesystem */
 		ca = load_identity(tmp);
+	}
 	free(tmp);
 
 	if (key_type_name != NULL &&
@@ -1623,13 +1709,16 @@
 			}
 			free(otmp);
 		}
+		if (n > SSHKEY_CERT_MAX_PRINCIPALS)
+			fatal("Too many certificate principals specified");
 	
 		tmp = tilde_expand_filename(argv[i], pw->pw_uid);
 		if ((r = sshkey_load_public(tmp, &public, &comment)) != 0)
 			fatal("%s: unable to open \"%s\": %s",
 			    __func__, tmp, ssh_err(r));
 		if (public->type != KEY_RSA && public->type != KEY_DSA &&
-		    public->type != KEY_ECDSA && public->type != KEY_ED25519)
+		    public->type != KEY_ECDSA && public->type != KEY_ED25519 &&
+		    public->type != KEY_XMSS)
 			fatal("%s: key \"%s\" type %s cannot be certified",
 			    __func__, tmp, sshkey_type(public));
 
@@ -1649,10 +1738,18 @@
 		    OPTIONS_EXTENSIONS);
 		if ((r = sshkey_from_private(ca,
 		    &public->cert->signature_key)) != 0)
-			fatal("key_from_private (ca key): %s", ssh_err(r));
+			fatal("sshkey_from_private (ca key): %s", ssh_err(r));
 
-		if ((r = sshkey_certify(public, ca, key_type_name)) != 0)
-			fatal("Couldn't certify key %s: %s", tmp, ssh_err(r));
+		if (agent_fd != -1 && (ca->flags & SSHKEY_FLAG_EXT) != 0) {
+			if ((r = sshkey_certify_custom(public, ca,
+			    key_type_name, agent_signer, &agent_fd)) != 0)
+				fatal("Couldn't certify key %s via agent: %s",
+				    tmp, ssh_err(r));
+		} else {
+			if ((sshkey_certify(public, ca, key_type_name)) != 0)
+				fatal("Couldn't certify key %s: %s",
+				    tmp, ssh_err(r));
+		}
 
 		if ((cp = strrchr(tmp, '.')) != NULL && strcmp(cp, ".pub") == 0)
 			*cp = '\0';
@@ -1705,40 +1802,6 @@
 	return now + (u_int64_t)(secs * mul);
 }
 
-static u_int64_t
-parse_absolute_time(const char *s)
-{
-	struct tm tm;
-	time_t tt;
-	char buf[32], *fmt;
-
-	/*
-	 * POSIX strptime says "The application shall ensure that there
-	 * is white-space or other non-alphanumeric characters between
-	 * any two conversion specifications" so arrange things this way.
-	 */
-	switch (strlen(s)) {
-	case 8:
-		fmt = "%Y-%m-%d";
-		snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2s", s, s + 4, s + 6);
-		break;
-	case 14:
-		fmt = "%Y-%m-%dT%H:%M:%S";
-		snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2sT%.2s:%.2s:%.2s",
-		    s, s + 4, s + 6, s + 8, s + 10, s + 12);
-		break;
-	default:
-		fatal("Invalid certificate time format %s", s);
-	}
-
-	memset(&tm, 0, sizeof(tm));
-	if (strptime(buf, fmt, &tm) == NULL)
-		fatal("Invalid certificate time %s", s);
-	if ((tt = mktime(&tm)) < 0)
-		fatal("Certificate time %s cannot be represented", s);
-	return (u_int64_t)tt;
-}
-
 static void
 parse_cert_times(char *timespec)
 {
@@ -1761,8 +1824,8 @@
 
 	/*
 	 * from:to, where
-	 * from := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS
-	 *   to := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS
+	 * from := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS | "always"
+	 *   to := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS | "forever"
 	 */
 	from = xstrdup(timespec);
 	to = strchr(from, ':');
@@ -1772,13 +1835,17 @@
 
 	if (*from == '-' || *from == '+')
 		cert_valid_from = parse_relative_time(from, now);
-	else
-		cert_valid_from = parse_absolute_time(from);
+	else if (strcmp(from, "always") == 0)
+		cert_valid_from = 0;
+	else if (parse_absolute_time(from, &cert_valid_from) != 0)
+		fatal("Invalid from time \"%s\"", from);
 
 	if (*to == '-' || *to == '+')
 		cert_valid_to = parse_relative_time(to, now);
-	else
-		cert_valid_to = parse_absolute_time(to);
+	else if (strcmp(to, "forever") == 0)
+		cert_valid_to = ~(u_int64_t)0;
+	else if (parse_absolute_time(to, &cert_valid_to) != 0)
+		fatal("Invalid to time \"%s\"", to);
 
 	if (cert_valid_to <= cert_valid_from)
 		fatal("Empty certificate validity interval");
@@ -1788,7 +1855,8 @@
 static void
 add_cert_option(char *opt)
 {
-	char *val;
+	char *val, *cp;
+	int iscrit = 0;
 
 	if (strcasecmp(opt, "clear") == 0)
 		certflags_flags = 0;
@@ -1828,6 +1896,18 @@
 		if (addr_match_cidr_list(NULL, val) != 0)
 			fatal("Invalid source-address list");
 		certflags_src_addr = xstrdup(val);
+	} else if (strncasecmp(opt, "extension:", 10) == 0 ||
+		   (iscrit = (strncasecmp(opt, "critical:", 9) == 0))) {
+		val = xstrdup(strchr(opt, ':') + 1);
+		if ((cp = strchr(val, '=')) != NULL)
+			*cp++ = '\0';
+		cert_userext = xreallocarray(cert_userext, ncert_userext + 1,
+		    sizeof(*cert_userext));
+		cert_userext[ncert_userext].key = val;
+		cert_userext[ncert_userext].val = cp == NULL ?
+		    NULL : xstrdup(cp);
+		cert_userext[ncert_userext].crit = iscrit;
+		ncert_userext++;
 	} else
 		fatal("Unsupported certificate option \"%s\"", opt);
 }
@@ -1929,8 +2009,9 @@
 	struct stat st;
 	int r, is_stdin = 0, ok = 0;
 	FILE *f;
-	char *cp, line[SSH_MAX_PUBKEY_BYTES];
+	char *cp, *line = NULL;
 	const char *path;
+	size_t linesize = 0;
 	u_long lnum = 0;
 
 	if (!have_identity)
@@ -1946,7 +2027,8 @@
 	} else if ((f = fopen(identity_file, "r")) == NULL)
 		fatal("fopen %s: %s", identity_file, strerror(errno));
 
-	while (read_keyfile_line(f, path, line, sizeof(line), &lnum) == 0) {
+	while (getline(&line, &linesize, f) != -1) {
+		lnum++;
 		sshkey_free(key);
 		key = NULL;
 		/* Trim leading space and comments */
@@ -1954,7 +2036,7 @@
 		if (*cp == '#' || *cp == '\0')
 			continue;
 		if ((key = sshkey_new(KEY_UNSPEC)) == NULL)
-			fatal("key_new");
+			fatal("sshkey_new");
 		if ((r = sshkey_read(key, &cp)) != 0) {
 			error("%s:%lu: invalid key: %s", path,
 			    lnum, ssh_err(r));
@@ -1971,6 +2053,7 @@
 			printf("%s:%lu:\n", path, lnum);
 		print_cert(key);
 	}
+	free(line);
 	sshkey_free(key);
 	fclose(f);
 	exit(ok ? 0 : 1);
@@ -2002,7 +2085,8 @@
 {
 	struct sshkey *key = NULL;
 	u_long lnum = 0;
-	char *path, *cp, *ep, line[SSH_MAX_PUBKEY_BYTES];
+	char *path, *cp, *ep, *line = NULL;
+	size_t linesize = 0;
 	unsigned long long serial, serial2;
 	int i, was_explicit_key, was_sha1, r;
 	FILE *krl_spec;
@@ -2017,8 +2101,8 @@
 
 	if (!quiet)
 		printf("Revoking from %s\n", path);
-	while (read_keyfile_line(krl_spec, path, line, sizeof(line),
-	    &lnum) == 0) {
+	while (getline(&line, &linesize, krl_spec) != -1) {
+		lnum++;
 		was_explicit_key = was_sha1 = 0;
 		cp = line + strspn(line, " \t");
 		/* Trim trailing space, comments and strip \n */
@@ -2100,7 +2184,7 @@
 				 */
 			}
 			if ((key = sshkey_new(KEY_UNSPEC)) == NULL)
-				fatal("key_new");
+				fatal("sshkey_new");
 			if ((r = sshkey_read(key, &cp)) != 0)
 				fatal("%s:%lu: invalid key: %s",
 				    path, lnum, ssh_err(r));
@@ -2118,6 +2202,7 @@
 	}
 	if (strcmp(path, "-") != 0)
 		fclose(krl_spec);
+	free(line);
 	free(path);
 }
 
@@ -2171,7 +2256,7 @@
 		fatal("Couldn't generate KRL");
 	if ((fd = open(identity_file, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1)
 		fatal("open %s: %s", identity_file, strerror(errno));
-	if (atomicio(vwrite, fd, (void *)sshbuf_ptr(kbuf), sshbuf_len(kbuf)) !=
+	if (atomicio(vwrite, fd, sshbuf_mutable_ptr(kbuf), sshbuf_len(kbuf)) !=
 	    sshbuf_len(kbuf))
 		fatal("write %s: %s", identity_file, strerror(errno));
 	close(fd);
@@ -2208,17 +2293,11 @@
 	exit(ret);
 }
 
-#ifdef WITH_SSH1
-# define RSA1_USAGE " | rsa1"
-#else
-# define RSA1_USAGE ""
-#endif
-
 static void
 usage(void)
 {
 	fprintf(stderr,
-	    "usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa%s]\n"
+	    "usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa]\n"
 	    "                  [-N new_passphrase] [-C comment] [-f output_keyfile]\n"
 	    "       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]\n"
 	    "       ssh-keygen -i [-m key_format] [-f input_keyfile]\n"
@@ -2226,7 +2305,7 @@
 	    "       ssh-keygen -y [-f input_keyfile]\n"
 	    "       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]\n"
 	    "       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]\n"
-	    "       ssh-keygen -B [-f input_keyfile]\n", RSA1_USAGE);
+	    "       ssh-keygen -B [-f input_keyfile]\n");
 #ifdef ENABLE_PKCS11
 	fprintf(stderr,
 	    "       ssh-keygen -D pkcs11\n");
@@ -2241,8 +2320,9 @@
 	    "       ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]\n"
 	    "                  [-j start_line] [-K checkpt] [-W generator]\n"
 #endif
-	    "       ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]\n"
-	    "                  [-O option] [-V validity_interval] [-z serial_number] file ...\n"
+	    "       ssh-keygen -s ca_key -I certificate_identity [-h] [-U]\n"
+	    "                  [-D pkcs11_provider] [-n principals] [-O option]\n"
+	    "                  [-V validity_interval] [-z serial_number] file ...\n"
 	    "       ssh-keygen -L [-f input_keyfile]\n"
 	    "       ssh-keygen -A\n"
 	    "       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]\n"
@@ -2300,8 +2380,8 @@
 	if (gethostname(hostname, sizeof(hostname)) < 0)
 		fatal("gethostname: %s", strerror(errno));
 
-	/* Remaining characters: UYdw */
-	while ((opt = getopt(argc, argv, "ABHLQXceghiklopquvxy"
+	/* Remaining characters: Ydw */
+	while ((opt = getopt(argc, argv, "ABHLQUXceghiklopquvxy"
 	    "C:D:E:F:G:I:J:K:M:N:O:P:R:S:T:V:W:Z:"
 	    "a:b:f:g:j:m:n:r:s:t:z:")) != -1) {
 		switch (opt) {
@@ -2309,7 +2389,7 @@
 			gen_all_hostkeys = 1;
 			break;
 		case 'b':
-			bits = (u_int32_t)strtonum(optarg, 256, 32768, &errstr);
+			bits = (u_int32_t)strtonum(optarg, 10, 32768, &errstr);
 			if (errstr)
 				fatal("Bits has bad value %s (%s)",
 					optarg, errstr);
@@ -2354,6 +2434,7 @@
 			}
 			if (strcasecmp(optarg, "PEM") == 0) {
 				convert_format = FMT_PEM;
+				use_new_format = 0;
 				break;
 			}
 			fatal("Unsupported conversion format \"%s\"", optarg);
@@ -2361,7 +2442,7 @@
 			cert_principals = optarg;
 			break;
 		case 'o':
-			use_new_format = 1;
+			/* no-op; new format is already the default */
 			break;
 		case 'p':
 			change_passphrase = 1;
@@ -2428,6 +2509,9 @@
 		case 'D':
 			pkcs11provider = optarg;
 			break;
+		case 'U':
+			prefer_agent = 1;
+			break;
 		case 'u':
 			update_krl = 1;
 			break;
@@ -2584,6 +2668,8 @@
 			    _PATH_HOST_ECDSA_KEY_FILE, rr_hostname);
 			n += do_print_resource_record(pw,
 			    _PATH_HOST_ED25519_KEY_FILE, rr_hostname);
+			n += do_print_resource_record(pw,
+			    _PATH_HOST_XMSS_KEY_FILE, rr_hostname);
 			if (n == 0)
 				fatal("no keys found.");
 			exit(0);
@@ -2647,9 +2733,9 @@
 		printf("Generating public/private %s key pair.\n",
 		    key_type_name);
 	if ((r = sshkey_generate(type, bits, &private)) != 0)
-		fatal("key_generate failed");
+		fatal("sshkey_generate failed");
 	if ((r = sshkey_from_private(private, &public)) != 0)
-		fatal("key_from_private failed: %s\n", ssh_err(r));
+		fatal("sshkey_from_private failed: %s\n", ssh_err(r));
 
 	if (!have_identity)
 		ask_filename(pw, "Enter file in which to save the key");
@@ -2744,7 +2830,8 @@
 	if ((r = sshkey_write(public, f)) != 0)
 		error("write key failed: %s", ssh_err(r));
 	fprintf(f, " %s\n", comment);
-	fclose(f);
+	if (ferror(f) || fclose(f) != 0)
+		fatal("write public failed: %s", strerror(errno));
 
 	if (!quiet) {
 		fp = sshkey_fingerprint(public, fingerprint_hash,
diff --git a/ssh-keyscan.1 b/ssh-keyscan.1
index d29d9d9..f3d7a40 100644
--- a/ssh-keyscan.1
+++ b/ssh-keyscan.1
@@ -1,4 +1,4 @@
-.\"	$OpenBSD: ssh-keyscan.1,v 1.38 2015/11/08 23:24:03 jmc Exp $
+.\"	$OpenBSD: ssh-keyscan.1,v 1.44 2018/03/05 07:03:18 jmc Exp $
 .\"
 .\" Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>.
 .\"
@@ -6,30 +6,29 @@
 .\" permitted provided that due credit is given to the author and the
 .\" OpenBSD project by leaving this copyright notice intact.
 .\"
-.Dd $Mdocdate: November 8 2015 $
+.Dd $Mdocdate: March 5 2018 $
 .Dt SSH-KEYSCAN 1
 .Os
 .Sh NAME
 .Nm ssh-keyscan
-.Nd gather ssh public keys
+.Nd gather SSH public keys
 .Sh SYNOPSIS
 .Nm ssh-keyscan
-.Bk -words
-.Op Fl 46cHv
+.Op Fl 46cDHv
 .Op Fl f Ar file
 .Op Fl p Ar port
 .Op Fl T Ar timeout
 .Op Fl t Ar type
 .Op Ar host | addrlist namelist
-.Ar ...
-.Ek
 .Sh DESCRIPTION
 .Nm
-is a utility for gathering the public ssh host keys of a number of
+is a utility for gathering the public SSH host keys of a number of
 hosts.
 It was designed to aid in building and verifying
 .Pa ssh_known_hosts
-files.
+files,
+the format of which is documented in
+.Xr sshd 8 .
 .Nm
 provides a minimal interface suitable for use by shell and perl
 scripts.
@@ -39,7 +38,8 @@
 parallel, so it is very efficient.
 The keys from a domain of 1,000
 hosts can be collected in tens of seconds, even when some of those
-hosts are down or do not run ssh.
+hosts are down or do not run
+.Xr sshd 8 .
 For scanning, one does not need
 login access to the machines that are being scanned, nor does the
 scanning process involve any encryption.
@@ -47,15 +47,21 @@
 The options are as follows:
 .Bl -tag -width Ds
 .It Fl 4
-Forces
+Force
 .Nm
 to use IPv4 addresses only.
 .It Fl 6
-Forces
+Force
 .Nm
 to use IPv6 addresses only.
 .It Fl c
 Request certificates from target hosts instead of plain keys.
+.It Fl D
+Print keys found as SSHFP DNS records.
+The default is to print keys in a format usable as a
+.Xr ssh 1
+.Pa known_hosts
+file.
 .It Fl f Ar file
 Read hosts or
 .Dq addrlist namelist
@@ -63,41 +69,42 @@
 .Ar file ,
 one per line.
 If
-.Pa -
+.Sq -
 is supplied instead of a filename,
 .Nm
-will read hosts or
-.Dq addrlist namelist
-pairs from the standard input.
+will read from the standard input.
+Input is expected in the format:
+.Bd -literal
+1.2.3.4,1.2.4.4 name.my.domain,name,n.my.domain,n,1.2.3.4,1.2.4.4
+.Ed
 .It Fl H
 Hash all hostnames and addresses in the output.
 Hashed names may be used normally by
-.Nm ssh
+.Xr ssh 1
 and
-.Nm sshd ,
+.Xr sshd 8 ,
 but they do not reveal identifying information should the file's contents
 be disclosed.
 .It Fl p Ar port
-Port to connect to on the remote host.
+Connect to
+.Ar port
+on the remote host.
 .It Fl T Ar timeout
 Set the timeout for connection attempts.
 If
 .Ar timeout
 seconds have elapsed since a connection was initiated to a host or since the
-last time anything was read from that host, then the connection is
+last time anything was read from that host, the connection is
 closed and the host in question considered unavailable.
-Default is 5 seconds.
+The default is 5 seconds.
 .It Fl t Ar type
-Specifies the type of the key to fetch from the scanned hosts.
+Specify the type of the key to fetch from the scanned hosts.
 The possible values are
-.Dq rsa1
-for protocol version 1 and
 .Dq dsa ,
 .Dq ecdsa ,
 .Dq ed25519 ,
 or
-.Dq rsa
-for protocol version 2.
+.Dq rsa .
 Multiple values may be specified by separating them with commas.
 The default is to fetch
 .Dq rsa ,
@@ -106,12 +113,10 @@
 .Dq ed25519
 keys.
 .It Fl v
-Verbose mode.
-Causes
-.Nm
-to print debugging messages about its progress.
+Verbose mode:
+print debugging messages about progress.
 .El
-.Sh SECURITY
+.Pp
 If an ssh_known_hosts file is constructed using
 .Nm
 without verifying the keys, users will be vulnerable to
@@ -122,59 +127,32 @@
 can help in the detection of tampered keyfiles or man in the middle
 attacks which have begun after the ssh_known_hosts file was created.
 .Sh FILES
-Input format:
-.Bd -literal
-1.2.3.4,1.2.4.4 name.my.domain,name,n.my.domain,n,1.2.3.4,1.2.4.4
-.Ed
-.Pp
-Output format for RSA1 keys:
-.Bd -literal
-host-or-namelist bits exponent modulus
-.Ed
-.Pp
-Output format for RSA, DSA, ECDSA, and Ed25519 keys:
-.Bd -literal
-host-or-namelist keytype base64-encoded-key
-.Ed
-.Pp
-Where
-.Ar keytype
-is either
-.Dq ecdsa-sha2-nistp256 ,
-.Dq ecdsa-sha2-nistp384 ,
-.Dq ecdsa-sha2-nistp521 ,
-.Dq ssh-ed25519 ,
-.Dq ssh-dss
-or
-.Dq ssh-rsa .
-.Pp
 .Pa /etc/ssh/ssh_known_hosts
 .Sh EXAMPLES
-Print the rsa host key for machine
+Print the RSA host key for machine
 .Ar hostname :
-.Bd -literal
-$ ssh-keyscan hostname
-.Ed
+.Pp
+.Dl $ ssh-keyscan -t rsa hostname
 .Pp
 Find all hosts from the file
 .Pa ssh_hosts
 which have new or different keys from those in the sorted file
 .Pa ssh_known_hosts :
-.Bd -literal
+.Bd -literal -offset indent
 $ ssh-keyscan -t rsa,dsa,ecdsa,ed25519 -f ssh_hosts | \e
 	sort -u - ssh_known_hosts | diff ssh_known_hosts -
 .Ed
 .Sh SEE ALSO
 .Xr ssh 1 ,
 .Xr sshd 8
+.Rs
+.%D 2006
+.%R RFC 4255
+.%T Using DNS to Securely Publish Secure Shell (SSH) Key Fingerprints
+.Re
 .Sh AUTHORS
 .An -nosplit
 .An David Mazieres Aq Mt dm@lcs.mit.edu
 wrote the initial version, and
 .An Wayne Davison Aq Mt wayned@users.sourceforge.net
 added support for protocol version 2.
-.Sh BUGS
-It generates "Connection closed by remote host" messages on the consoles
-of all the machines it scans if the server is older than version 2.9.
-This is because it opens a connection to the ssh port, reads the public
-key, and drops the connection as soon as it gets the key.
diff --git a/ssh-keyscan.c b/ssh-keyscan.c
index eea8d0a..38b1c54 100644
--- a/ssh-keyscan.c
+++ b/ssh-keyscan.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keyscan.c,v 1.107 2017/01/06 03:41:58 djm Exp $ */
+/* $OpenBSD: ssh-keyscan.c,v 1.120 2018/06/06 18:29:18 markus Exp $ */
 /*
  * Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>.
  *
@@ -32,7 +32,6 @@
 
 #include "xmalloc.h"
 #include "ssh.h"
-#include "ssh1.h"
 #include "sshbuf.h"
 #include "sshkey.h"
 #include "cipher.h"
@@ -47,6 +46,7 @@
 #include "hostfile.h"
 #include "ssherr.h"
 #include "ssh_api.h"
+#include "dns.h"
 
 /* Flag indicating whether IPv4 or IPv6.  This can be set on the command line.
    Default value is AF_UNSPEC means both IPv4 and IPv6. */
@@ -54,17 +54,22 @@
 
 int ssh_port = SSH_DEFAULT_PORT;
 
-#define KT_RSA1		1
-#define KT_DSA		2
-#define KT_RSA		4
-#define KT_ECDSA	8
-#define KT_ED25519	16
+#define KT_DSA		(1)
+#define KT_RSA		(1<<1)
+#define KT_ECDSA	(1<<2)
+#define KT_ED25519	(1<<3)
+#define KT_XMSS		(1<<4)
+
+#define KT_MIN		KT_DSA
+#define KT_MAX		KT_XMSS
 
 int get_cert = 0;
 int get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519;
 
 int hash_hosts = 0;		/* Hash hostname on output */
 
+int print_sshfp = 0;		/* Print SSHFP records instead of known_hosts */
+
 #define MAXMAXFD 256
 
 /* The number of seconds after which to give up on a TCP connection */
@@ -94,7 +99,7 @@
 	int c_plen;		/* Packet length field for ssh packet */
 	int c_len;		/* Total bytes which must be read. */
 	int c_off;		/* Length of data read so far. */
-	int c_keytype;		/* Only one of KT_RSA1, KT_DSA, or KT_RSA */
+	int c_keytype;		/* Only one of KT_* */
 	sig_atomic_t c_done;	/* SSH2 done */
 	char *c_namebase;	/* Address to free for c_name and c_namelist */
 	char *c_name;		/* Hostname of connection for errors */
@@ -187,52 +192,6 @@
 	return (tok);
 }
 
-#ifdef WITH_SSH1
-static struct sshkey *
-keygrab_ssh1(con *c)
-{
-	static struct sshkey *rsa;
-	static struct sshbuf *msg;
-	int r;
-	u_char type;
-
-	if (rsa == NULL) {
-		if ((rsa = sshkey_new(KEY_RSA1)) == NULL) {
-			error("%s: sshkey_new failed", __func__);
-			return NULL;
-		}
-		if ((msg = sshbuf_new()) == NULL)
-			fatal("%s: sshbuf_new failed", __func__);
-	}
-	if ((r = sshbuf_put(msg, c->c_data, c->c_plen)) != 0 ||
-	    (r = sshbuf_consume(msg, 8 - (c->c_plen & 7))) != 0 || /* padding */
-	    (r = sshbuf_get_u8(msg, &type)) != 0)
-		goto buf_err;
-	if (type != (int) SSH_SMSG_PUBLIC_KEY) {
-		error("%s: invalid packet type", c->c_name);
-		sshbuf_reset(msg);
-		return NULL;
-	}
-	if ((r = sshbuf_consume(msg, 8)) != 0 || /* cookie */
-	    /* server key */
-	    (r = sshbuf_get_u32(msg, NULL)) != 0 ||
-	    (r = sshbuf_get_bignum1(msg, NULL)) != 0 ||
-	    (r = sshbuf_get_bignum1(msg, NULL)) != 0 ||
-	    /* host key */
-	    (r = sshbuf_get_u32(msg, NULL)) != 0 ||
-	    (r = sshbuf_get_bignum1(msg, rsa->rsa->e)) != 0 ||
-	    (r = sshbuf_get_bignum1(msg, rsa->rsa->n)) != 0) {
- buf_err:
-		error("%s: buffer error: %s", __func__, ssh_err(r));
-		sshbuf_reset(msg);
-		return NULL;
-	}
-
-	sshbuf_reset(msg);
-
-	return (rsa);
-}
-#endif
 
 static int
 key_print_wrapper(struct sshkey *hostkey, struct ssh *ssh)
@@ -267,7 +226,6 @@
 	char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT };
 	int r;
 
-	enable_compat20();
 	switch (c->c_keytype) {
 	case KT_DSA:
 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ?
@@ -281,6 +239,10 @@
 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ?
 		    "ssh-ed25519-cert-v01@openssh.com" : "ssh-ed25519";
 		break;
+	case KT_XMSS:
+		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ?
+		    "ssh-xmss-cert-v01@openssh.com" : "ssh-xmss@openssh.com";
+		break;
 	case KT_ECDSA:
 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ?
 		    "ecdsa-sha2-nistp256-cert-v01@openssh.com,"
@@ -317,20 +279,27 @@
 	 * do the key-exchange until an error occurs or until
 	 * the key_print_wrapper() callback sets c_done.
 	 */
-	ssh_dispatch_run(c->c_ssh, DISPATCH_BLOCK, &c->c_done, c->c_ssh);
+	ssh_dispatch_run(c->c_ssh, DISPATCH_BLOCK, &c->c_done);
 }
 
 static void
-keyprint_one(char *host, struct sshkey *key)
+keyprint_one(const char *host, struct sshkey *key)
 {
 	char *hostport;
+	const char *known_host, *hashed;
 
-	if (hash_hosts && (host = host_hash(host, NULL, 0)) == NULL)
-		fatal("host_hash failed");
+	if (print_sshfp) {
+		export_dns_rr(host, key, stdout, 0);
+		return;
+	}
 
 	hostport = put_host_port(host, ssh_port);
+	lowercase(hostport);
+	if (hash_hosts && (hashed = host_hash(host, NULL, 0)) == NULL)
+		fatal("host_hash failed");
+	known_host = hash_hosts ? hashed : hostport;
 	if (!get_cert)
-		fprintf(stdout, "%s ", hostport);
+		fprintf(stdout, "%s ", known_host);
 	sshkey_write(key, stdout);
 	fputs("\n", stdout);
 	free(hostport);
@@ -421,7 +390,7 @@
 	fdcon[s].c_len = 4;
 	fdcon[s].c_off = 0;
 	fdcon[s].c_keytype = keytype;
-	gettimeofday(&fdcon[s].c_tv, NULL);
+	monotime_tv(&fdcon[s].c_tv);
 	fdcon[s].c_tv.tv_sec += timeout;
 	TAILQ_INSERT_TAIL(&tq, &fdcon[s], c_link);
 	FD_SET(s, read_wait);
@@ -434,7 +403,6 @@
 {
 	if (s >= maxfd || fdcon[s].c_status == CS_UNUSED)
 		fatal("confree: attempt to free bad fdno %d", s);
-	close(s);
 	free(fdcon[s].c_namebase);
 	free(fdcon[s].c_output_name);
 	if (fdcon[s].c_status == CS_KEYS)
@@ -445,7 +413,8 @@
 		ssh_packet_close(fdcon[s].c_ssh);
 		free(fdcon[s].c_ssh);
 		fdcon[s].c_ssh = NULL;
-	}
+	} else
+		close(s);
 	TAILQ_REMOVE(&tq, &fdcon[s], c_link);
 	FD_CLR(s, read_wait);
 	ncon--;
@@ -455,7 +424,7 @@
 contouch(int s)
 {
 	TAILQ_REMOVE(&tq, &fdcon[s], c_link);
-	gettimeofday(&fdcon[s].c_tv, NULL);
+	monotime_tv(&fdcon[s].c_tv);
 	fdcon[s].c_tv.tv_sec += timeout;
 	TAILQ_INSERT_TAIL(&tq, &fdcon[s], c_link);
 }
@@ -480,6 +449,20 @@
 	size_t bufsiz;
 	con *c = &fdcon[s];
 
+	/* send client banner */
+	n = snprintf(buf, sizeof buf, "SSH-%d.%d-OpenSSH-keyscan\r\n",
+	    PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2);
+	if (n < 0 || (size_t)n >= sizeof(buf)) {
+		error("snprintf: buffer too small");
+		confree(s);
+		return;
+	}
+	if (atomicio(vwrite, s, buf, n) != (size_t)n) {
+		error("write (%s): %s", c->c_name, strerror(errno));
+		confree(s);
+		return;
+	}
+
 	for (;;) {
 		memset(buf, '\0', sizeof(buf));
 		bufsiz = sizeof(buf);
@@ -522,38 +505,15 @@
 		c->c_ssh->compat = compat_datafellows(remote_version);
 	else
 		c->c_ssh->compat = 0;
-	if (c->c_keytype != KT_RSA1) {
-		if (!ssh2_capable(remote_major, remote_minor)) {
-			debug("%s doesn't support ssh2", c->c_name);
-			confree(s);
-			return;
-		}
-	} else if (remote_major != 1) {
-		debug("%s doesn't support ssh1", c->c_name);
+	if (!ssh2_capable(remote_major, remote_minor)) {
+		debug("%s doesn't support ssh2", c->c_name);
 		confree(s);
 		return;
 	}
-	fprintf(stderr, "# %s:%d %s\n", c->c_name, ssh_port, chop(buf));
-	n = snprintf(buf, sizeof buf, "SSH-%d.%d-OpenSSH-keyscan\r\n",
-	    c->c_keytype == KT_RSA1? PROTOCOL_MAJOR_1 : PROTOCOL_MAJOR_2,
-	    c->c_keytype == KT_RSA1? PROTOCOL_MINOR_1 : PROTOCOL_MINOR_2);
-	if (n < 0 || (size_t)n >= sizeof(buf)) {
-		error("snprintf: buffer too small");
-		confree(s);
-		return;
-	}
-	if (atomicio(vwrite, s, buf, n) != (size_t)n) {
-		error("write (%s): %s", c->c_name, strerror(errno));
-		confree(s);
-		return;
-	}
-	if (c->c_keytype != KT_RSA1) {
-		keygrab_ssh2(c);
-		confree(s);
-		return;
-	}
-	c->c_status = CS_SIZE;
-	contouch(s);
+	fprintf(stderr, "%c %s:%d %s\n", print_sshfp ? ';' : '#',
+	    c->c_name, ssh_port, chop(buf));
+	keygrab_ssh2(c);
+	confree(s);
 }
 
 static void
@@ -583,12 +543,6 @@
 			c->c_data = xmalloc(c->c_len);
 			c->c_status = CS_KEYS;
 			break;
-#ifdef WITH_SSH1
-		case CS_KEYS:
-			keyprint(c, keygrab_ssh1(c));
-			confree(s);
-			return;
-#endif
 		default:
 			fatal("conread: invalid status %d", c->c_status);
 			break;
@@ -605,7 +559,7 @@
 	con *c;
 	int i;
 
-	gettimeofday(&now, NULL);
+	monotime_tv(&now);
 	c = TAILQ_FIRST(&tq);
 
 	if (c && (c->c_tv.tv_sec > now.tv_sec ||
@@ -657,7 +611,7 @@
 
 	if (name == NULL)
 		return;
-	for (j = KT_RSA1; j <= KT_ED25519; j *= 2) {
+	for (j = KT_MIN; j <= KT_MAX; j *= 2) {
 		if (get_keytypes & j) {
 			while (ncon >= MAXCON)
 				conloop();
@@ -681,8 +635,8 @@
 usage(void)
 {
 	fprintf(stderr,
-	    "usage: %s [-46cHv] [-f file] [-p port] [-T timeout] [-t type]\n"
-	    "\t\t   [host | addrlist namelist] ...\n",
+	    "usage: %s [-46cDHv] [-f file] [-p port] [-T timeout] [-t type]\n"
+	    "\t\t   [host | addrlist namelist]\n",
 	    __progname);
 	exit(1);
 }
@@ -692,9 +646,9 @@
 {
 	int debug_flag = 0, log_level = SYSLOG_LEVEL_INFO;
 	int opt, fopt_count = 0, j;
-	char *tname, *cp, line[NI_MAXHOST];
+	char *tname, *cp, *line = NULL;
+	size_t linesize = 0;
 	FILE *fp;
-	u_long linenum;
 
 	extern int optind;
 	extern char *optarg;
@@ -710,7 +664,7 @@
 	if (argc <= 1)
 		usage();
 
-	while ((opt = getopt(argc, argv, "cHv46p:T:t:f:")) != -1) {
+	while ((opt = getopt(argc, argv, "cDHv46p:T:t:f:")) != -1) {
 		switch (opt) {
 		case 'H':
 			hash_hosts = 1;
@@ -718,6 +672,9 @@
 		case 'c':
 			get_cert = 1;
 			break;
+		case 'D':
+			print_sshfp = 1;
+			break;
 		case 'p':
 			ssh_port = a2port(optarg);
 			if (ssh_port <= 0) {
@@ -754,11 +711,6 @@
 				int type = sshkey_type_from_name(tname);
 
 				switch (type) {
-#ifdef WITH_SSH1
-				case KEY_RSA1:
-					get_keytypes |= KT_RSA1;
-					break;
-#endif
 				case KEY_DSA:
 					get_keytypes |= KT_DSA;
 					break;
@@ -771,6 +723,9 @@
 				case KEY_ED25519:
 					get_keytypes |= KT_ED25519;
 					break;
+				case KEY_XMSS:
+					get_keytypes |= KT_XMSS;
+					break;
 				case KEY_UNSPEC:
 				default:
 					fatal("Unknown key type \"%s\"", tname);
@@ -814,11 +769,8 @@
 		else if ((fp = fopen(argv[j], "r")) == NULL)
 			fatal("%s: %s: %s", __progname, argv[j],
 			    strerror(errno));
-		linenum = 0;
 
-		while (read_keyfile_line(fp,
-		    argv[j] == NULL ? "(stdin)" : argv[j], line, sizeof(line),
-		    &linenum) != -1) {
+		while (getline(&line, &linesize, fp) != -1) {
 			/* Chomp off trailing whitespace and comments */
 			if ((cp = strchr(line, '#')) == NULL)
 				cp = line + strlen(line) - 1;
@@ -843,6 +795,7 @@
 
 		fclose(fp);
 	}
+	free(line);
 
 	while (optind < argc)
 		do_host(argv[optind++]);
diff --git a/ssh-keysign.c b/ssh-keysign.c
index ac5034d..744ecb4 100644
--- a/ssh-keysign.c
+++ b/ssh-keysign.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keysign.c,v 1.52 2016/02/15 09:47:49 dtucker Exp $ */
+/* $OpenBSD: ssh-keysign.c,v 1.55 2018/07/27 05:34:42 dtucker Exp $ */
 /*
  * Copyright (c) 2002 Markus Friedl.  All rights reserved.
  *
@@ -62,11 +62,6 @@
 
 extern char *__progname;
 
-/* XXX readconf.c needs these */
-uid_t original_real_uid;
-
-extern char *__progname;
-
 static int
 valid_request(struct passwd *pw, char *host, struct sshkey **ret,
     u_char *data, size_t datalen)
@@ -158,7 +153,7 @@
 
 	debug3("%s: fail %d", __func__, fail);
 
-	if (fail && key != NULL)
+	if (fail)
 		sshkey_free(key);
 	else if (ret != NULL)
 		*ret = key;
@@ -171,7 +166,7 @@
 {
 	struct sshbuf *b;
 	Options options;
-#define NUM_KEYTYPES 4
+#define NUM_KEYTYPES 5
 	struct sshkey *keys[NUM_KEYTYPES], *key = NULL;
 	struct passwd *pw;
 	int r, key_fd[NUM_KEYTYPES], i, found, version = 2, fd;
@@ -198,10 +193,10 @@
 	key_fd[i++] = open(_PATH_HOST_DSA_KEY_FILE, O_RDONLY);
 	key_fd[i++] = open(_PATH_HOST_ECDSA_KEY_FILE, O_RDONLY);
 	key_fd[i++] = open(_PATH_HOST_ED25519_KEY_FILE, O_RDONLY);
+	key_fd[i++] = open(_PATH_HOST_XMSS_KEY_FILE, O_RDONLY);
 	key_fd[i++] = open(_PATH_HOST_RSA_KEY_FILE, O_RDONLY);
 
-	original_real_uid = getuid();	/* XXX readconf.c needs this */
-	if ((pw = getpwuid(original_real_uid)) == NULL)
+	if ((pw = getpwuid(getuid())) == NULL)
 		fatal("getpwuid failed");
 	pw = pwcopy(pw);
 
diff --git a/ssh-pkcs11-client.c b/ssh-pkcs11-client.c
index fac0167..028b272 100644
--- a/ssh-pkcs11-client.c
+++ b/ssh-pkcs11-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11-client.c,v 1.6 2015/12/11 00:20:04 mmcc Exp $ */
+/* $OpenBSD: ssh-pkcs11-client.c,v 1.10 2018/07/09 21:59:10 markus Exp $ */
 /*
  * Copyright (c) 2010 Markus Friedl.  All rights reserved.
  *
@@ -34,13 +34,14 @@
 
 #include "pathnames.h"
 #include "xmalloc.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "log.h"
 #include "misc.h"
-#include "key.h"
+#include "sshkey.h"
 #include "authfd.h"
 #include "atomicio.h"
 #include "ssh-pkcs11.h"
+#include "ssherr.h"
 
 /* borrows code from sftp-server and ssh-agent */
 
@@ -48,34 +49,37 @@
 pid_t pid = -1;
 
 static void
-send_msg(Buffer *m)
+send_msg(struct sshbuf *m)
 {
 	u_char buf[4];
-	int mlen = buffer_len(m);
+	size_t mlen = sshbuf_len(m);
+	int r;
 
-	put_u32(buf, mlen);
+	POKE_U32(buf, mlen);
 	if (atomicio(vwrite, fd, buf, 4) != 4 ||
-	    atomicio(vwrite, fd, buffer_ptr(m),
-	    buffer_len(m)) != buffer_len(m))
+	    atomicio(vwrite, fd, sshbuf_mutable_ptr(m),
+	    sshbuf_len(m)) != sshbuf_len(m))
 		error("write to helper failed");
-	buffer_consume(m, mlen);
+	if ((r = sshbuf_consume(m, mlen)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 }
 
 static int
-recv_msg(Buffer *m)
+recv_msg(struct sshbuf *m)
 {
 	u_int l, len;
-	u_char buf[1024];
+	u_char c, buf[1024];
+	int r;
 
 	if ((len = atomicio(read, fd, buf, 4)) != 4) {
 		error("read from helper failed: %u", len);
 		return (0); /* XXX */
 	}
-	len = get_u32(buf);
+	len = PEEK_U32(buf);
 	if (len > 256 * 1024)
 		fatal("response too long: %u", len);
 	/* read len bytes into m */
-	buffer_clear(m);
+	sshbuf_reset(m);
 	while (len > 0) {
 		l = len;
 		if (l > sizeof(buf))
@@ -84,10 +88,13 @@
 			error("response from helper failed.");
 			return (0); /* XXX */
 		}
-		buffer_append(m, buf, l);
+		if ((r = sshbuf_put(m, buf, l)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		len -= l;
 	}
-	return (buffer_get_char(m));
+	if ((r = sshbuf_get_u8(m, &c)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	return c;
 }
 
 int
@@ -99,43 +106,49 @@
 void
 pkcs11_terminate(void)
 {
-	close(fd);
+	if (fd >= 0)
+		close(fd);
 }
 
 static int
 pkcs11_rsa_private_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa,
     int padding)
 {
-	Key key;
+	struct sshkey key;	/* XXX */
 	u_char *blob, *signature = NULL;
-	u_int blen, slen = 0;
-	int ret = -1;
-	Buffer msg;
+	size_t blen, slen = 0;
+	int r, ret = -1;
+	struct sshbuf *msg;
 
 	if (padding != RSA_PKCS1_PADDING)
 		return (-1);
 	key.type = KEY_RSA;
 	key.rsa = rsa;
-	if (key_to_blob(&key, &blob, &blen) == 0)
+	if ((r = sshkey_to_blob(&key, &blob, &blen)) != 0) {
+		error("%s: sshkey_to_blob: %s", __func__, ssh_err(r));
 		return -1;
-	buffer_init(&msg);
-	buffer_put_char(&msg, SSH2_AGENTC_SIGN_REQUEST);
-	buffer_put_string(&msg, blob, blen);
-	buffer_put_string(&msg, from, flen);
-	buffer_put_int(&msg, 0);
+	}
+	if ((msg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u8(msg, SSH2_AGENTC_SIGN_REQUEST)) != 0 ||
+	    (r = sshbuf_put_string(msg, blob, blen)) != 0 ||
+	    (r = sshbuf_put_string(msg, from, flen)) != 0 ||
+	    (r = sshbuf_put_u32(msg, 0)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	free(blob);
-	send_msg(&msg);
-	buffer_clear(&msg);
+	send_msg(msg);
+	sshbuf_reset(msg);
 
-	if (recv_msg(&msg) == SSH2_AGENT_SIGN_RESPONSE) {
-		signature = buffer_get_string(&msg, &slen);
-		if (slen <= (u_int)RSA_size(rsa)) {
+	if (recv_msg(msg) == SSH2_AGENT_SIGN_RESPONSE) {
+		if ((r = sshbuf_get_string(msg, &signature, &slen)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+		if (slen <= (size_t)RSA_size(rsa)) {
 			memcpy(to, signature, slen);
 			ret = slen;
 		}
 		free(signature);
 	}
-	buffer_free(&msg);
+	sshbuf_free(msg);
 	return (ret);
 }
 
@@ -184,31 +197,39 @@
 }
 
 int
-pkcs11_add_provider(char *name, char *pin, Key ***keysp)
+pkcs11_add_provider(char *name, char *pin, struct sshkey ***keysp)
 {
-	Key *k;
-	int i, nkeys;
+	struct sshkey *k;
+	int r;
 	u_char *blob;
-	u_int blen;
-	Buffer msg;
+	size_t blen;
+	u_int nkeys, i;
+	struct sshbuf *msg;
 
 	if (fd < 0 && pkcs11_start_helper() < 0)
 		return (-1);
 
-	buffer_init(&msg);
-	buffer_put_char(&msg, SSH_AGENTC_ADD_SMARTCARD_KEY);
-	buffer_put_cstring(&msg, name);
-	buffer_put_cstring(&msg, pin);
-	send_msg(&msg);
-	buffer_clear(&msg);
+	if ((msg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u8(msg, SSH_AGENTC_ADD_SMARTCARD_KEY)) != 0 ||
+	    (r = sshbuf_put_cstring(msg, name)) != 0 ||
+	    (r = sshbuf_put_cstring(msg, pin)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	send_msg(msg);
+	sshbuf_reset(msg);
 
-	if (recv_msg(&msg) == SSH2_AGENT_IDENTITIES_ANSWER) {
-		nkeys = buffer_get_int(&msg);
-		*keysp = xcalloc(nkeys, sizeof(Key *));
+	if (recv_msg(msg) == SSH2_AGENT_IDENTITIES_ANSWER) {
+		if ((r = sshbuf_get_u32(msg, &nkeys)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+		*keysp = xcalloc(nkeys, sizeof(struct sshkey *));
 		for (i = 0; i < nkeys; i++) {
-			blob = buffer_get_string(&msg, &blen);
-			free(buffer_get_string(&msg, NULL));
-			k = key_from_blob(blob, blen);
+			/* XXX clean up properly instead of fatal() */
+			if ((r = sshbuf_get_string(msg, &blob, &blen)) != 0 ||
+			    (r = sshbuf_skip_string(msg)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
+			if ((r = sshkey_from_blob(blob, blen, &k)) != 0)
+				fatal("%s: bad key: %s", __func__, ssh_err(r));
 			wrap_key(k->rsa);
 			(*keysp)[i] = k;
 			free(blob);
@@ -216,26 +237,28 @@
 	} else {
 		nkeys = -1;
 	}
-	buffer_free(&msg);
+	sshbuf_free(msg);
 	return (nkeys);
 }
 
 int
 pkcs11_del_provider(char *name)
 {
-	int ret = -1;
-	Buffer msg;
+	int r, ret = -1;
+	struct sshbuf *msg;
 
-	buffer_init(&msg);
-	buffer_put_char(&msg, SSH_AGENTC_REMOVE_SMARTCARD_KEY);
-	buffer_put_cstring(&msg, name);
-	buffer_put_cstring(&msg, "");
-	send_msg(&msg);
-	buffer_clear(&msg);
+	if ((msg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_put_u8(msg, SSH_AGENTC_REMOVE_SMARTCARD_KEY)) != 0 ||
+	    (r = sshbuf_put_cstring(msg, name)) != 0 ||
+	    (r = sshbuf_put_cstring(msg, "")) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	send_msg(msg);
+	sshbuf_reset(msg);
 
-	if (recv_msg(&msg) == SSH_AGENT_SUCCESS)
+	if (recv_msg(msg) == SSH_AGENT_SUCCESS)
 		ret = 0;
-	buffer_free(&msg);
+	sshbuf_free(msg);
 	return (ret);
 }
 
diff --git a/ssh-pkcs11-helper.c b/ssh-pkcs11-helper.c
index 3e6e078..80c3700 100644
--- a/ssh-pkcs11-helper.c
+++ b/ssh-pkcs11-helper.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11-helper.c,v 1.12 2016/02/15 09:47:49 dtucker Exp $ */
+/* $OpenBSD: ssh-pkcs11-helper.c,v 1.14 2018/01/08 15:18:46 markus Exp $ */
 /*
  * Copyright (c) 2010 Markus Friedl.  All rights reserved.
  *
@@ -30,19 +30,20 @@
 #include <errno.h>
 
 #include "xmalloc.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "log.h"
 #include "misc.h"
-#include "key.h"
+#include "sshkey.h"
 #include "authfd.h"
 #include "ssh-pkcs11.h"
+#include "ssherr.h"
 
 #ifdef ENABLE_PKCS11
 
 /* borrows code from sftp-server and ssh-agent */
 
 struct pkcs11_keyinfo {
-	Key		*key;
+	struct sshkey	*key;
 	char		*providername;
 	TAILQ_ENTRY(pkcs11_keyinfo) next;
 };
@@ -51,16 +52,12 @@
 
 #define MAX_MSG_LENGTH		10240 /*XXX*/
 
-/* helper */
-#define get_int()			buffer_get_int(&iqueue);
-#define get_string(lenp)		buffer_get_string(&iqueue, lenp);
-
 /* input and output queue */
-Buffer iqueue;
-Buffer oqueue;
+struct sshbuf *iqueue;
+struct sshbuf *oqueue;
 
 static void
-add_key(Key *k, char *name)
+add_key(struct sshkey *k, char *name)
 {
 	struct pkcs11_keyinfo *ki;
 
@@ -80,104 +77,119 @@
 		if (!strcmp(ki->providername, name)) {
 			TAILQ_REMOVE(&pkcs11_keylist, ki, next);
 			free(ki->providername);
-			key_free(ki->key);
+			sshkey_free(ki->key);
 			free(ki);
 		}
 	}
 }
 
 /* lookup matching 'private' key */
-static Key *
-lookup_key(Key *k)
+static struct sshkey *
+lookup_key(struct sshkey *k)
 {
 	struct pkcs11_keyinfo *ki;
 
 	TAILQ_FOREACH(ki, &pkcs11_keylist, next) {
 		debug("check %p %s", ki, ki->providername);
-		if (key_equal(k, ki->key))
+		if (sshkey_equal(k, ki->key))
 			return (ki->key);
 	}
 	return (NULL);
 }
 
 static void
-send_msg(Buffer *m)
+send_msg(struct sshbuf *m)
 {
-	int mlen = buffer_len(m);
+	int r;
 
-	buffer_put_int(&oqueue, mlen);
-	buffer_append(&oqueue, buffer_ptr(m), mlen);
-	buffer_consume(m, mlen);
+	if ((r = sshbuf_put_stringb(oqueue, m)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 }
 
 static void
 process_add(void)
 {
 	char *name, *pin;
-	Key **keys;
-	int i, nkeys;
+	struct sshkey **keys;
+	int r, i, nkeys;
 	u_char *blob;
-	u_int blen;
-	Buffer msg;
+	size_t blen;
+	struct sshbuf *msg;
 
-	buffer_init(&msg);
-	name = get_string(NULL);
-	pin = get_string(NULL);
+	if ((msg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_get_cstring(iqueue, &name, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(iqueue, &pin, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	if ((nkeys = pkcs11_add_provider(name, pin, &keys)) > 0) {
-		buffer_put_char(&msg, SSH2_AGENT_IDENTITIES_ANSWER);
-		buffer_put_int(&msg, nkeys);
+		if ((r = sshbuf_put_u8(msg,
+		    SSH2_AGENT_IDENTITIES_ANSWER)) != 0 ||
+		    (r = sshbuf_put_u32(msg, nkeys)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		for (i = 0; i < nkeys; i++) {
-			if (key_to_blob(keys[i], &blob, &blen) == 0)
+			if ((r = sshkey_to_blob(keys[i], &blob, &blen)) != 0) {
+				debug("%s: sshkey_to_blob: %s",
+				    __func__, ssh_err(r));
 				continue;
-			buffer_put_string(&msg, blob, blen);
-			buffer_put_cstring(&msg, name);
+			}
+			if ((r = sshbuf_put_string(msg, blob, blen)) != 0 ||
+			    (r = sshbuf_put_cstring(msg, name)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			free(blob);
 			add_key(keys[i], name);
 		}
 		free(keys);
 	} else {
-		buffer_put_char(&msg, SSH_AGENT_FAILURE);
+		if ((r = sshbuf_put_u8(msg, SSH_AGENT_FAILURE)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 	free(pin);
 	free(name);
-	send_msg(&msg);
-	buffer_free(&msg);
+	send_msg(msg);
+	sshbuf_free(msg);
 }
 
 static void
 process_del(void)
 {
 	char *name, *pin;
-	Buffer msg;
+	struct sshbuf *msg;
+	int r;
 
-	buffer_init(&msg);
-	name = get_string(NULL);
-	pin = get_string(NULL);
+	if ((msg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((r = sshbuf_get_cstring(iqueue, &name, NULL)) != 0 ||
+	    (r = sshbuf_get_cstring(iqueue, &pin, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	del_keys_by_name(name);
-	if (pkcs11_del_provider(name) == 0)
-		 buffer_put_char(&msg, SSH_AGENT_SUCCESS);
-	else
-		 buffer_put_char(&msg, SSH_AGENT_FAILURE);
+	if ((r = sshbuf_put_u8(msg, pkcs11_del_provider(name) == 0 ?
+	    SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	free(pin);
 	free(name);
-	send_msg(&msg);
-	buffer_free(&msg);
+	send_msg(msg);
+	sshbuf_free(msg);
 }
 
 static void
 process_sign(void)
 {
 	u_char *blob, *data, *signature = NULL;
-	u_int blen, dlen, slen = 0;
-	int ok = -1;
-	Key *key, *found;
-	Buffer msg;
+	size_t blen, dlen, slen = 0;
+	int r, ok = -1;
+	struct sshkey *key, *found;
+	struct sshbuf *msg;
 
-	blob = get_string(&blen);
-	data = get_string(&dlen);
-	(void)get_int(); /* XXX ignore flags */
+	/* XXX support SHA2 signature flags */
+	if ((r = sshbuf_get_string(iqueue, &blob, &blen)) != 0 ||
+	    (r = sshbuf_get_string(iqueue, &data, &dlen)) != 0 ||
+	    (r = sshbuf_get_u32(iqueue, NULL)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-	if ((key = key_from_blob(blob, blen)) != NULL) {
+	if ((r = sshkey_from_blob(blob, blen, &key)) != 0)
+		error("%s: sshkey_from_blob: %s", __func__, ssh_err(r));
+	else {
 		if ((found = lookup_key(key)) != NULL) {
 #ifdef WITH_OPENSSL
 			int ret;
@@ -191,20 +203,23 @@
 			}
 #endif /* WITH_OPENSSL */
 		}
-		key_free(key);
+		sshkey_free(key);
 	}
-	buffer_init(&msg);
+	if ((msg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	if (ok == 0) {
-		buffer_put_char(&msg, SSH2_AGENT_SIGN_RESPONSE);
-		buffer_put_string(&msg, signature, slen);
+		if ((r = sshbuf_put_u8(msg, SSH2_AGENT_SIGN_RESPONSE)) != 0 ||
+		    (r = sshbuf_put_string(msg, signature, slen)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	} else {
-		buffer_put_char(&msg, SSH_AGENT_FAILURE);
+		if ((r = sshbuf_put_u8(msg, SSH2_AGENT_FAILURE)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 	free(data);
 	free(blob);
 	free(signature);
-	send_msg(&msg);
-	buffer_free(&msg);
+	send_msg(msg);
+	sshbuf_free(msg);
 }
 
 static void
@@ -213,13 +228,14 @@
 	u_int msg_len;
 	u_int buf_len;
 	u_int consumed;
-	u_int type;
-	u_char *cp;
+	u_char type;
+	const u_char *cp;
+	int r;
 
-	buf_len = buffer_len(&iqueue);
+	buf_len = sshbuf_len(iqueue);
 	if (buf_len < 5)
 		return;		/* Incomplete message. */
-	cp = buffer_ptr(&iqueue);
+	cp = sshbuf_ptr(iqueue);
 	msg_len = get_u32(cp);
 	if (msg_len > MAX_MSG_LENGTH) {
 		error("bad message len %d", msg_len);
@@ -227,9 +243,10 @@
 	}
 	if (buf_len < msg_len + 4)
 		return;
-	buffer_consume(&iqueue, 4);
+	if ((r = sshbuf_consume(iqueue, 4)) != 0 ||
+	    (r = sshbuf_get_u8(iqueue, &type)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	buf_len -= 4;
-	type = buffer_get_char(&iqueue);
 	switch (type) {
 	case SSH_AGENTC_ADD_SMARTCARD_KEY:
 		debug("process_add");
@@ -248,17 +265,19 @@
 		break;
 	}
 	/* discard the remaining bytes from the current packet */
-	if (buf_len < buffer_len(&iqueue)) {
+	if (buf_len < sshbuf_len(iqueue)) {
 		error("iqueue grew unexpectedly");
 		cleanup_exit(255);
 	}
-	consumed = buf_len - buffer_len(&iqueue);
+	consumed = buf_len - sshbuf_len(iqueue);
 	if (msg_len < consumed) {
 		error("msg_len %d < consumed %d", msg_len, consumed);
 		cleanup_exit(255);
 	}
-	if (msg_len > consumed)
-		buffer_consume(&iqueue, msg_len - consumed);
+	if (msg_len > consumed) {
+		if ((r = sshbuf_consume(iqueue, msg_len - consumed)) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	}
 }
 
 void
@@ -272,7 +291,7 @@
 main(int argc, char **argv)
 {
 	fd_set *rset, *wset;
-	int in, out, max, log_stderr = 0;
+	int r, in, out, max, log_stderr = 0;
 	ssize_t len, olen, set_size;
 	SyslogFacility log_facility = SYSLOG_FACILITY_AUTH;
 	LogLevel log_level = SYSLOG_LEVEL_ERROR;
@@ -298,8 +317,10 @@
 	if (out > max)
 		max = out;
 
-	buffer_init(&iqueue);
-	buffer_init(&oqueue);
+	if ((iqueue = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if ((oqueue = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 
 	set_size = howmany(max + 1, NFDBITS) * sizeof(fd_mask);
 	rset = xmalloc(set_size);
@@ -314,11 +335,13 @@
 		 * the worst-case length packet it can generate,
 		 * otherwise apply backpressure by stopping reads.
 		 */
-		if (buffer_check_alloc(&iqueue, sizeof(buf)) &&
-		    buffer_check_alloc(&oqueue, MAX_MSG_LENGTH))
+		if ((r = sshbuf_check_reserve(iqueue, sizeof(buf))) == 0 &&
+		    (r = sshbuf_check_reserve(oqueue, MAX_MSG_LENGTH)) == 0)
 			FD_SET(in, rset);
+		else if (r != SSH_ERR_NO_BUFFER_SPACE)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
-		olen = buffer_len(&oqueue);
+		olen = sshbuf_len(oqueue);
 		if (olen > 0)
 			FD_SET(out, wset);
 
@@ -342,18 +365,20 @@
 			} else if (len < 0) {
 				error("read: %s", strerror(errno));
 				cleanup_exit(1);
-			} else {
-				buffer_append(&iqueue, buf, len);
+			} else if ((r = sshbuf_put(iqueue, buf, len)) != 0) {
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			}
 		}
 		/* send oqueue to stdout */
 		if (FD_ISSET(out, wset)) {
-			len = write(out, buffer_ptr(&oqueue), olen);
+			len = write(out, sshbuf_ptr(oqueue), olen);
 			if (len < 0) {
 				error("write: %s", strerror(errno));
 				cleanup_exit(1);
-			} else {
-				buffer_consume(&oqueue, len);
+			} else if ((r = sshbuf_consume(oqueue, len)) != 0) {
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 			}
 		}
 
@@ -362,8 +387,10 @@
 		 * into the output buffer, otherwise stop processing input
 		 * and let the output queue drain.
 		 */
-		if (buffer_check_alloc(&oqueue, MAX_MSG_LENGTH))
+		if ((r = sshbuf_check_reserve(oqueue, MAX_MSG_LENGTH)) == 0)
 			process();
+		else if (r != SSH_ERR_NO_BUFFER_SPACE)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 }
 #else /* ENABLE_PKCS11 */
diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c
index aaf712d..65a7b58 100644
--- a/ssh-pkcs11.c
+++ b/ssh-pkcs11.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11.c,v 1.23 2016/10/28 03:33:52 djm Exp $ */
+/* $OpenBSD: ssh-pkcs11.c,v 1.26 2018/02/07 02:06:51 jsing Exp $ */
 /*
  * Copyright (c) 2010 Markus Friedl.  All rights reserved.
  *
@@ -532,12 +532,12 @@
 			    == NULL) {
 				error("RSAPublicKey_dup");
 			}
-			if (x509)
-				X509_free(x509);
+			X509_free(x509);
 		}
 		if (rsa && rsa->n && rsa->e &&
 		    pkcs11_rsa_wrap(p, slotidx, &attribs[0], rsa) == 0) {
-			key = sshkey_new(KEY_UNSPEC);
+			if ((key = sshkey_new(KEY_UNSPEC)) == NULL)
+				fatal("sshkey_new failed");
 			key->rsa = rsa;
 			key->type = KEY_RSA;
 			key->flags |= SSHKEY_FLAG_EXT;
@@ -545,8 +545,8 @@
 				sshkey_free(key);
 			} else {
 				/* expand key array and add key */
-				*keysp = xreallocarray(*keysp, *nkeys + 1,
-				    sizeof(struct sshkey *));
+				*keysp = xrecallocarray(*keysp, *nkeys,
+				    *nkeys + 1, sizeof(struct sshkey *));
 				(*keysp)[*nkeys] = key;
 				*nkeys = *nkeys + 1;
 				debug("have %d keys", *nkeys);
diff --git a/ssh-rsa.c b/ssh-rsa.c
index cde05df..3905bd4 100644
--- a/ssh-rsa.c
+++ b/ssh-rsa.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-rsa.c,v 1.60 2016/09/12 23:39:34 djm Exp $ */
+/* $OpenBSD: ssh-rsa.c,v 1.67 2018/07/03 11:39:54 djm Exp $ */
 /*
  * Copyright (c) 2000, 2003 Markus Friedl <markus@openbsd.org>
  *
@@ -33,6 +33,7 @@
 #define SSHKEY_INTERNAL
 #include "sshkey.h"
 #include "digest.h"
+#include "log.h"
 
 static int openssh_RSA_verify(int, u_char *, size_t, u_char *, size_t, RSA *);
 
@@ -50,11 +51,14 @@
 	return NULL;
 }
 
+/*
+ * Returns the hash algorithm ID for a given algorithm identifier as used
+ * inside the signature blob,
+ */
 static int
-rsa_hash_alg_from_ident(const char *ident)
+rsa_hash_id_from_ident(const char *ident)
 {
-	if (strcmp(ident, "ssh-rsa") == 0 ||
-	    strcmp(ident, "ssh-rsa-cert-v01@openssh.com") == 0)
+	if (strcmp(ident, "ssh-rsa") == 0)
 		return SSH_DIGEST_SHA1;
 	if (strcmp(ident, "rsa-sha2-256") == 0)
 		return SSH_DIGEST_SHA256;
@@ -63,6 +67,27 @@
 	return -1;
 }
 
+/*
+ * Return the hash algorithm ID for the specified key name. This includes
+ * all the cases of rsa_hash_id_from_ident() but also the certificate key
+ * types.
+ */
+static int
+rsa_hash_id_from_keyname(const char *alg)
+{
+	int r;
+
+	if ((r = rsa_hash_id_from_ident(alg)) != -1)
+		return r;
+	if (strcmp(alg, "ssh-rsa-cert-v01@openssh.com") == 0)
+		return SSH_DIGEST_SHA1;
+	if (strcmp(alg, "rsa-sha2-256-cert-v01@openssh.com") == 0)
+		return SSH_DIGEST_SHA256;
+	if (strcmp(alg, "rsa-sha2-512-cert-v01@openssh.com") == 0)
+		return SSH_DIGEST_SHA512;
+	return -1;
+}
+
 static int
 rsa_hash_alg_nid(int type)
 {
@@ -78,13 +103,58 @@
 	}
 }
 
+int
+ssh_rsa_generate_additional_parameters(struct sshkey *key)
+{
+	BIGNUM *aux = NULL;
+	BN_CTX *ctx = NULL;
+	BIGNUM d;
+        BIGNUM *dptr;
+	int r;
+
+	if (key == NULL || key->rsa == NULL ||
+	    sshkey_type_plain(key->type) != KEY_RSA)
+		return SSH_ERR_INVALID_ARGUMENT;
+
+	if ((ctx = BN_CTX_new()) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	if ((aux = BN_new()) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+#ifdef BN_FLG_CONSTTIME
+	BN_set_flags(aux, BN_FLG_CONSTTIME);
+#endif
+
+	BN_init(&d);
+#ifdef BN_FLG_CONSTTIME
+	BN_with_flags(&d, key->rsa->d, BN_FLG_CONSTTIME);
+        dptr = &d;
+#else
+        dptr = key->rsa->d;
+#endif
+
+	if ((BN_sub(aux, key->rsa->q, BN_value_one()) == 0) ||
+	    (BN_mod(key->rsa->dmq1, dptr, aux, ctx) == 0) ||
+	    (BN_sub(aux, key->rsa->p, BN_value_one()) == 0) ||
+	    (BN_mod(key->rsa->dmp1, dptr, aux, ctx) == 0)) {
+		r = SSH_ERR_LIBCRYPTO_ERROR;
+		goto out;
+	}
+	r = 0;
+ out:
+	BN_clear_free(aux);
+	BN_CTX_free(ctx);
+	return r;
+}
+
 /* RSASSA-PKCS1-v1_5 (PKCS #1 v2.0 signature) with SHA1 */
 int
 ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
     const u_char *data, size_t datalen, const char *alg_ident)
 {
 	u_char digest[SSH_DIGEST_MAX_LENGTH], *sig = NULL;
-	size_t slen;
+	size_t slen = 0;
 	u_int dlen, len;
 	int nid, hash_alg, ret = SSH_ERR_INTERNAL_ERROR;
 	struct sshbuf *b = NULL;
@@ -97,11 +167,12 @@
 	if (alg_ident == NULL || strlen(alg_ident) == 0)
 		hash_alg = SSH_DIGEST_SHA1;
 	else
-		hash_alg = rsa_hash_alg_from_ident(alg_ident);
+		hash_alg = rsa_hash_id_from_keyname(alg_ident);
 	if (key == NULL || key->rsa == NULL || hash_alg == -1 ||
-	    sshkey_type_plain(key->type) != KEY_RSA ||
-	    BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
+	    sshkey_type_plain(key->type) != KEY_RSA)
 		return SSH_ERR_INVALID_ARGUMENT;
+	if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
+		return SSH_ERR_KEY_LENGTH;
 	slen = RSA_size(key->rsa);
 	if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM)
 		return SSH_ERR_INVALID_ARGUMENT;
@@ -152,40 +223,53 @@
 	ret = 0;
  out:
 	explicit_bzero(digest, sizeof(digest));
-	if (sig != NULL) {
-		explicit_bzero(sig, slen);
-		free(sig);
-	}
+	freezero(sig, slen);
 	sshbuf_free(b);
 	return ret;
 }
 
 int
 ssh_rsa_verify(const struct sshkey *key,
-    const u_char *sig, size_t siglen, const u_char *data, size_t datalen)
+    const u_char *sig, size_t siglen, const u_char *data, size_t datalen,
+    const char *alg)
 {
-	char *ktype = NULL;
-	int hash_alg, ret = SSH_ERR_INTERNAL_ERROR;
-	size_t len, diff, modlen, dlen;
+	char *sigtype = NULL;
+	int hash_alg, want_alg, ret = SSH_ERR_INTERNAL_ERROR;
+	size_t len = 0, diff, modlen, dlen;
 	struct sshbuf *b = NULL;
 	u_char digest[SSH_DIGEST_MAX_LENGTH], *osigblob, *sigblob = NULL;
 
 	if (key == NULL || key->rsa == NULL ||
 	    sshkey_type_plain(key->type) != KEY_RSA ||
-	    BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE ||
 	    sig == NULL || siglen == 0)
 		return SSH_ERR_INVALID_ARGUMENT;
+	if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
+		return SSH_ERR_KEY_LENGTH;
 
 	if ((b = sshbuf_from(sig, siglen)) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
-	if (sshbuf_get_cstring(b, &ktype, NULL) != 0) {
+	if (sshbuf_get_cstring(b, &sigtype, NULL) != 0) {
 		ret = SSH_ERR_INVALID_FORMAT;
 		goto out;
 	}
-	if ((hash_alg = rsa_hash_alg_from_ident(ktype)) == -1) {
+	if ((hash_alg = rsa_hash_id_from_ident(sigtype)) == -1) {
 		ret = SSH_ERR_KEY_TYPE_MISMATCH;
 		goto out;
 	}
+	/*
+	 * Allow ssh-rsa-cert-v01 certs to generate SHA2 signatures for
+	 * legacy reasons, but otherwise the signature type should match.
+	 */
+	if (alg != NULL && strcmp(alg, "ssh-rsa-cert-v01@openssh.com") != 0) {
+		if ((want_alg = rsa_hash_id_from_keyname(alg)) == -1) {
+			ret = SSH_ERR_INVALID_ARGUMENT;
+			goto out;
+		}
+		if (hash_alg != want_alg) {
+			ret = SSH_ERR_SIGNATURE_INVALID;
+			goto out;
+		}
+	}
 	if (sshbuf_get_string(b, &sigblob, &len) != 0) {
 		ret = SSH_ERR_INVALID_FORMAT;
 		goto out;
@@ -222,11 +306,8 @@
 	ret = openssh_RSA_verify(hash_alg, digest, dlen, sigblob, len,
 	    key->rsa);
  out:
-	if (sigblob != NULL) {
-		explicit_bzero(sigblob, len);
-		free(sigblob);
-	}
-	free(ktype);
+	freezero(sigblob, len);
+	free(sigtype);
 	sshbuf_free(b);
 	explicit_bzero(digest, sizeof(digest));
 	return ret;
@@ -347,10 +428,7 @@
 	}
 	ret = 0;
 done:
-	if (decrypted) {
-		explicit_bzero(decrypted, rsasize);
-		free(decrypted);
-	}
+	freezero(decrypted, rsasize);
 	return ret;
 }
 #endif /* WITH_OPENSSL */
diff --git a/ssh-xmss.c b/ssh-xmss.c
new file mode 100644
index 0000000..4c734fd
--- /dev/null
+++ b/ssh-xmss.c
@@ -0,0 +1,192 @@
+/* $OpenBSD: ssh-xmss.c,v 1.1 2018/02/23 15:58:38 markus Exp $*/
+/*
+ * Copyright (c) 2017 Stefan-Lukas Gazdag.
+ * Copyright (c) 2017 Markus Friedl.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#include "includes.h"
+#ifdef WITH_XMSS
+
+#define SSHKEY_INTERNAL
+#include <sys/types.h>
+#include <limits.h>
+
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+
+#include "log.h"
+#include "sshbuf.h"
+#include "sshkey.h"
+#include "sshkey-xmss.h"
+#include "ssherr.h"
+#include "ssh.h"
+
+#include "xmss_fast.h"
+
+int
+ssh_xmss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
+    const u_char *data, size_t datalen, u_int compat)
+{
+	u_char *sig = NULL;
+	size_t slen = 0, len = 0, required_siglen;
+	unsigned long long smlen;
+	int r, ret;
+	struct sshbuf *b = NULL;
+
+	if (lenp != NULL)
+		*lenp = 0;
+	if (sigp != NULL)
+		*sigp = NULL;
+
+	if (key == NULL ||
+	    sshkey_type_plain(key->type) != KEY_XMSS ||
+	    key->xmss_sk == NULL ||
+	    sshkey_xmss_params(key) == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = sshkey_xmss_siglen(key, &required_siglen)) != 0)
+		return r;
+	if (datalen >= INT_MAX - required_siglen)
+		return SSH_ERR_INVALID_ARGUMENT;
+	smlen = slen = datalen + required_siglen;
+	if ((sig = malloc(slen)) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	if ((r = sshkey_xmss_get_state(key, error)) != 0)
+		goto out;
+	if ((ret = xmss_sign(key->xmss_sk, sshkey_xmss_bds_state(key), sig, &smlen,
+	    data, datalen, sshkey_xmss_params(key))) != 0 || smlen <= datalen) {
+		r = SSH_ERR_INVALID_ARGUMENT; /* XXX better error? */
+		goto out;
+	}
+	/* encode signature */
+	if ((b = sshbuf_new()) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+	if ((r = sshbuf_put_cstring(b, "ssh-xmss@openssh.com")) != 0 ||
+	    (r = sshbuf_put_string(b, sig, smlen - datalen)) != 0)
+		goto out;
+	len = sshbuf_len(b);
+	if (sigp != NULL) {
+		if ((*sigp = malloc(len)) == NULL) {
+			r = SSH_ERR_ALLOC_FAIL;
+			goto out;
+		}
+		memcpy(*sigp, sshbuf_ptr(b), len);
+	}
+	if (lenp != NULL)
+		*lenp = len;
+	/* success */
+	r = 0;
+ out:
+	if ((ret = sshkey_xmss_update_state(key, error)) != 0) {
+		/* discard signature since we cannot update the state */
+		if (r == 0 && sigp != NULL && *sigp != NULL) {
+			explicit_bzero(*sigp, len);
+			free(*sigp);
+		}
+		if (sigp != NULL)
+			*sigp = NULL;
+		if (lenp != NULL)
+			*lenp = 0;
+		r = ret;
+	}
+	sshbuf_free(b);
+	if (sig != NULL) {
+		explicit_bzero(sig, slen);
+		free(sig);
+	}
+
+	return r;
+}
+
+int
+ssh_xmss_verify(const struct sshkey *key,
+    const u_char *signature, size_t signaturelen,
+    const u_char *data, size_t datalen, u_int compat)
+{
+	struct sshbuf *b = NULL;
+	char *ktype = NULL;
+	const u_char *sigblob;
+	u_char *sm = NULL, *m = NULL;
+	size_t len, required_siglen;
+	unsigned long long smlen = 0, mlen = 0;
+	int r, ret;
+
+	if (key == NULL ||
+	    sshkey_type_plain(key->type) != KEY_XMSS ||
+	    key->xmss_pk == NULL ||
+	    sshkey_xmss_params(key) == NULL ||
+	    signature == NULL || signaturelen == 0)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = sshkey_xmss_siglen(key, &required_siglen)) != 0)
+		return r;
+	if (datalen >= INT_MAX - required_siglen)
+		return SSH_ERR_INVALID_ARGUMENT;
+
+	if ((b = sshbuf_from(signature, signaturelen)) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	if ((r = sshbuf_get_cstring(b, &ktype, NULL)) != 0 ||
+	    (r = sshbuf_get_string_direct(b, &sigblob, &len)) != 0)
+		goto out;
+	if (strcmp("ssh-xmss@openssh.com", ktype) != 0) {
+		r = SSH_ERR_KEY_TYPE_MISMATCH;
+		goto out;
+	}
+	if (sshbuf_len(b) != 0) {
+		r = SSH_ERR_UNEXPECTED_TRAILING_DATA;
+		goto out;
+	}
+	if (len != required_siglen) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+	if (datalen >= SIZE_MAX - len) {
+		r = SSH_ERR_INVALID_ARGUMENT;
+		goto out;
+	}
+	smlen = len + datalen;
+	mlen = smlen;
+	if ((sm = malloc(smlen)) == NULL || (m = malloc(mlen)) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+	memcpy(sm, sigblob, len);
+	memcpy(sm+len, data, datalen);
+	if ((ret = xmss_sign_open(m, &mlen, sm, smlen,
+	    key->xmss_pk, sshkey_xmss_params(key))) != 0) {
+		debug2("%s: crypto_sign_xmss_open failed: %d",
+		    __func__, ret);
+	}
+	if (ret != 0 || mlen != datalen) {
+		r = SSH_ERR_SIGNATURE_INVALID;
+		goto out;
+	}
+	/* XXX compare 'm' and 'data' ? */
+	/* success */
+	r = 0;
+ out:
+	if (sm != NULL) {
+		explicit_bzero(sm, smlen);
+		free(sm);
+	}
+	if (m != NULL) {
+		explicit_bzero(m, smlen); /* NB mlen may be invalid if r != 0 */
+		free(m);
+	}
+	sshbuf_free(b);
+	free(ktype);
+	return r;
+}
+#endif /* WITH_XMSS */
diff --git a/ssh.1 b/ssh.1
index 4011c65..b20908a 100644
--- a/ssh.1
+++ b/ssh.1
@@ -33,8 +33,8 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $OpenBSD: ssh.1,v 1.376 2016/07/16 06:57:55 jmc Exp $
-.Dd $Mdocdate: July 16 2016 $
+.\" $OpenBSD: ssh.1,v 1.396 2018/07/19 10:28:47 dtucker Exp $
+.Dd $Mdocdate: July 19 2018 $
 .Dt SSH 1
 .Os
 .Sh NAME
@@ -42,8 +42,8 @@
 .Nd OpenSSH SSH client (remote login program)
 .Sh SYNOPSIS
 .Nm ssh
-.Bk -words
-.Op Fl 1246AaCfGgKkMNnqsTtVvXxYy
+.Op Fl 46AaCfGgKkMNnqsTtVvXxYy
+.Op Fl B Ar bind_interface
 .Op Fl b Ar bind_address
 .Op Fl c Ar cipher_spec
 .Op Fl D Oo Ar bind_address : Oc Ns Ar port
@@ -52,7 +52,7 @@
 .Op Fl F Ar configfile
 .Op Fl I Ar pkcs11
 .Op Fl i Ar identity_file
-.Op Fl J Oo Ar user Ns @ Oc Ns Ar host Ns Op : Ns Ar port
+.Op Fl J Ar destination
 .Op Fl L Ar address
 .Op Fl l Ar login_name
 .Op Fl m Ar mac_spec
@@ -64,9 +64,8 @@
 .Op Fl S Ar ctl_path
 .Op Fl W Ar host : Ns Ar port
 .Op Fl w Ar local_tun Ns Op : Ns Ar remote_tun
-.Oo Ar user Ns @ Oc Ns Ar hostname
+.Ar destination
 .Op Ar command
-.Ek
 .Sh DESCRIPTION
 .Nm
 (SSH client) is a program for logging into a remote machine and for
@@ -79,15 +78,20 @@
 .Pp
 .Nm
 connects and logs into the specified
-.Ar hostname
-(with optional
-.Ar user
-name).
+.Ar destination ,
+which may be specified as either
+.Sm off
+.Oo user @ Oc hostname
+.Sm on
+or a URI of the form
+.Sm off
+.No ssh:// Oo user @ Oc hostname Op : port .
+.Sm on
 The user must prove
 his/her identity to the remote machine using one of several methods
 (see below).
 .Pp
-If
+If a
 .Ar command
 is specified,
 it is executed on the remote host instead of a login shell.
@@ -95,16 +99,6 @@
 The options are as follows:
 .Pp
 .Bl -tag -width Ds -compact
-.It Fl 1
-Forces
-.Nm
-to try protocol version 1 only.
-.Pp
-.It Fl 2
-Forces
-.Nm
-to try protocol version 2 only.
-.Pp
 .It Fl 4
 Forces
 .Nm
@@ -131,6 +125,12 @@
 .It Fl a
 Disables forwarding of the authentication agent connection.
 .Pp
+.It Fl B Ar bind_interface
+Bind to the address of
+.Ar bind_interface
+before attempting to connect to the destination host.
+This is only useful on systems with more than one address.
+.Pp
 .It Fl b Ar bind_address
 Use
 .Ar bind_address
@@ -144,12 +144,7 @@
 .Ux Ns -domain
 connections).
 The compression algorithm is the same used by
-.Xr gzip 1 ,
-and the
-.Dq level
-can be controlled by the
-.Cm CompressionLevel
-option for protocol version 1.
+.Xr gzip 1 .
 Compression is desirable on modem lines and other
 slow connections, but will only slow down things on fast networks.
 The default value can be set on a host-by-host basis in the
@@ -159,14 +154,6 @@
 .Pp
 .It Fl c Ar cipher_spec
 Selects the cipher specification for encrypting the session.
-.Pp
-Protocol version 1 allows specification of a single cipher.
-The supported values are
-.Dq 3des ,
-.Dq blowfish ,
-and
-.Dq des .
-For protocol version 2,
 .Ar cipher_spec
 is a comma-separated list of ciphers
 listed in order of preference.
@@ -290,14 +277,11 @@
 Selects a file from which the identity (private key) for
 public key authentication is read.
 The default is
-.Pa ~/.ssh/identity
-for protocol version 1, and
 .Pa ~/.ssh/id_dsa ,
 .Pa ~/.ssh/id_ecdsa ,
 .Pa ~/.ssh/id_ed25519
 and
-.Pa ~/.ssh/id_rsa
-for protocol version 2.
+.Pa ~/.ssh/id_rsa .
 Identity files may also be specified on
 a per-host basis in the configuration file.
 It is possible to have multiple
@@ -313,17 +297,11 @@
 .Pa -cert.pub
 to identity filenames.
 .Pp
-.It Fl J Xo
-.Sm off
-.Op Ar user No @
-.Ar host
-.Op : Ar port
-.Sm on
-.Xc
+.It Fl J Ar destination
 Connect to the target host by first making a
 .Nm
-connection to the jump
-.Ar host
+connection to the jump host described by
+.Ar destination
 and then establishing a TCP forwarding to the ultimate destination from
 there.
 Multiple jump hops may be specified separated by comma characters.
@@ -491,11 +469,9 @@
 .It CertificateFile
 .It ChallengeResponseAuthentication
 .It CheckHostIP
-.It Cipher
 .It Ciphers
 .It ClearAllForwardings
 .It Compression
-.It CompressionLevel
 .It ConnectionAttempts
 .It ConnectTimeout
 .It ControlMaster
@@ -523,7 +499,6 @@
 .It IdentitiesOnly
 .It IdentityAgent
 .It IdentityFile
-.It Include
 .It IPQoS
 .It KbdInteractiveAuthentication
 .It KbdInteractiveDevices
@@ -540,20 +515,19 @@
 .It PKCS11Provider
 .It Port
 .It PreferredAuthentications
-.It Protocol
 .It ProxyCommand
 .It ProxyJump
 .It ProxyUseFdpass
 .It PubkeyAcceptedKeyTypes
 .It PubkeyAuthentication
 .It RekeyLimit
+.It RemoteCommand
 .It RemoteForward
 .It RequestTTY
-.It RhostsRSAAuthentication
-.It RSAAuthentication
 .It SendEnv
 .It ServerAliveInterval
 .It ServerAliveCountMax
+.It SetEnv
 .It StreamLocalBindMask
 .It StreamLocalBindUnlink
 .It StrictHostKeyChecking
@@ -561,7 +535,6 @@
 .It Tunnel
 .It TunnelDevice
 .It UpdateHostKeys
-.It UsePrivilegedPort
 .It User
 .It UserKnownHostsFile
 .It VerifyHostKeyDNS
@@ -622,21 +595,30 @@
 .Ar remote_socket : local_socket
 .Sm on
 .Xc
+.It Fl R Xo
+.Sm off
+.Oo Ar bind_address : Oc
+.Ar port
+.Sm on
+.Xc
 Specifies that connections to the given TCP port or Unix socket on the remote
-(server) host are to be forwarded to the given host and port, or Unix socket,
-on the local side.
+(server) host are to be forwarded to the local side.
+.Pp
 This works by allocating a socket to listen to either a TCP
 .Ar port
 or to a Unix socket on the remote side.
 Whenever a connection is made to this port or Unix socket, the
 connection is forwarded over the secure channel, and a connection
-is made to either
+is made from the local machine to either an explicit destination specified by
 .Ar host
 port
 .Ar hostport ,
 or
 .Ar local_socket ,
-from the local machine.
+or, if no explicit destination was specified,
+.Nm
+will act as a SOCKS 4/5 proxy and forward connections to the destinations
+requested by the remote SOCKS client.
 .Pp
 Port forwardings can also be specified in the configuration file.
 Privileged ports can be forwarded only when
@@ -759,10 +741,15 @@
 .Cm TunnelDevice
 directives in
 .Xr ssh_config 5 .
+.Pp
 If the
 .Cm Tunnel
-directive is unset, it is set to the default tunnel mode, which is
+directive is unset, it will be set to the default tunnel mode, which is
 .Dq point-to-point .
+If a different
+.Cm Tunnel
+forwarding mode it desired, then it should be specified before
+.Fl w .
 .Pp
 .It Fl X
 Enables X11 forwarding.
@@ -806,21 +793,7 @@
 The file format and configuration options are described in
 .Xr ssh_config 5 .
 .Sh AUTHENTICATION
-The OpenSSH SSH client supports SSH protocols 1 and 2.
-The default is to use protocol 2 only,
-though this can be changed via the
-.Cm Protocol
-option in
-.Xr ssh_config 5
-or the
-.Fl 1
-and
-.Fl 2
-options (see above).
-Protocol 1 should not be used
-and is only offered to support legacy devices.
-It suffers from a number of cryptographic weaknesses
-and doesn't support many of the advanced features available for protocol 2.
+The OpenSSH SSH client supports SSH protocol 2.
 .Pp
 The methods available for authentication are:
 GSSAPI-based authentication,
@@ -890,11 +863,20 @@
 and the server checks that the corresponding public key
 is authorized to accept the account.
 .Pp
+The server may inform the client of errors that prevented public key
+authentication from succeeding after authentication completes using a
+different method.
+These may be viewed by increasing the
+.Cm LogLevel
+to
+.Cm DEBUG
+or higher (e.g. by using the
+.Fl v
+flag).
+.Pp
 The user creates his/her key pair by running
 .Xr ssh-keygen 1 .
 This stores the private key in
-.Pa ~/.ssh/identity
-(protocol 1),
 .Pa ~/.ssh/id_dsa
 (DSA),
 .Pa ~/.ssh/id_ecdsa
@@ -905,8 +887,6 @@
 .Pa ~/.ssh/id_rsa
 (RSA)
 and stores the public key in
-.Pa ~/.ssh/identity.pub
-(protocol 1),
 .Pa ~/.ssh/id_dsa.pub
 (DSA),
 .Pa ~/.ssh/id_ecdsa.pub
@@ -1421,6 +1401,17 @@
 with the current shell or command.
 If the current session has no tty,
 this variable is not set.
+.It Ev SSH_TUNNEL
+Optionally set by
+.Xr sshd 8
+to contain the interface names assigned if tunnel forwarding was
+requested by the client.
+.It Ev SSH_USER_AUTH
+Optionally set by
+.Xr sshd 8 ,
+this variable may contain a pathname to a file that lists the authentication
+methods successfully used when the session was established, including any
+public keys that were used.
 .It Ev TZ
 This variable is set to indicate the present time zone if it
 was set when the daemon was started (i.e. the daemon passes the value
@@ -1490,7 +1481,6 @@
 .Sx ENVIRONMENT ,
 above.
 .Pp
-.It Pa ~/.ssh/identity
 .It Pa ~/.ssh/id_dsa
 .It Pa ~/.ssh/id_ecdsa
 .It Pa ~/.ssh/id_ed25519
@@ -1503,9 +1493,8 @@
 will simply ignore a private key file if it is accessible by others.
 It is possible to specify a passphrase when
 generating the key which will be used to encrypt the
-sensitive part of this file using 3DES.
+sensitive part of this file using AES-128.
 .Pp
-.It Pa ~/.ssh/identity.pub
 .It Pa ~/.ssh/id_dsa.pub
 .It Pa ~/.ssh/id_ecdsa.pub
 .It Pa ~/.ssh/id_ed25519.pub
diff --git a/ssh.c b/ssh.c
index d21f688..9cab7a8 100644
--- a/ssh.c
+++ b/ssh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh.c,v 1.449 2017/02/17 02:04:15 djm Exp $ */
+/* $OpenBSD: ssh.c,v 1.490 2018/07/27 05:34:42 dtucker Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -83,16 +83,15 @@
 
 #include "xmalloc.h"
 #include "ssh.h"
-#include "ssh1.h"
 #include "ssh2.h"
 #include "canohost.h"
 #include "compat.h"
 #include "cipher.h"
 #include "digest.h"
 #include "packet.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "channels.h"
-#include "key.h"
+#include "sshkey.h"
 #include "authfd.h"
 #include "authfile.h"
 #include "pathnames.h"
@@ -107,7 +106,6 @@
 #include "sshpty.h"
 #include "match.h"
 #include "msg.h"
-#include "uidswap.h"
 #include "version.h"
 #include "ssherr.h"
 #include "myproposal.h"
@@ -171,18 +169,18 @@
  */
 char *host;
 
+/* Various strings used to to percent_expand() arguments */
+static char thishost[NI_MAXHOST], shorthost[NI_MAXHOST], portstr[NI_MAXSERV];
+static char uidstr[32], *host_arg, *conn_hash_hex;
+
 /* socket address the host resolves to */
 struct sockaddr_storage hostaddr;
 
 /* Private host keys. */
 Sensitive sensitive_data;
 
-/* Original real UID. */
-uid_t original_real_uid;
-uid_t original_effective_uid;
-
 /* command to be executed */
-Buffer command;
+struct sshbuf *command;
 
 /* Should we execute a command or invoke a subsystem? */
 int subsystem_flag = 0;
@@ -200,20 +198,19 @@
 usage(void)
 {
 	fprintf(stderr,
-"usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]\n"
-"           [-D [bind_address:]port] [-E log_file] [-e escape_char]\n"
-"           [-F configfile] [-I pkcs11] [-i identity_file]\n"
-"           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]\n"
-"           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]\n"
-"           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]\n"
-"           [user@]hostname [command]\n"
+"usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]\n"
+"           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]\n"
+"           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]\n"
+"           [-i identity_file] [-J [user@]host[:port]] [-L address]\n"
+"           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]\n"
+"           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]\n"
+"           [-w local_tun[:remote_tun]] destination [command]\n"
 	);
 	exit(255);
 }
 
-static int ssh_session(void);
-static int ssh_session2(void);
-static void load_public_identity_files(void);
+static int ssh_session2(struct ssh *, struct passwd *);
+static void load_public_identity_files(struct passwd *);
 static void main_sigchld_handler(int);
 
 /* ~/ expand a list of paths. NB. assumes path[n] is heap-allocated. */
@@ -224,7 +221,7 @@
 	char *cp;
 
 	for (i = 0; i < num_paths; i++) {
-		cp = tilde_expand_filename(paths[i], original_real_uid);
+		cp = tilde_expand_filename(paths[i], getuid());
 		free(paths[i]);
 		paths[i] = cp;
 	}
@@ -271,6 +268,40 @@
 	return res;
 }
 
+/* Returns non-zero if name can only be an address and not a hostname */
+static int
+is_addr_fast(const char *name)
+{
+	return (strchr(name, '%') != NULL || strchr(name, ':') != NULL ||
+	    strspn(name, "0123456789.") == strlen(name));
+}
+
+/* Returns non-zero if name represents a valid, single address */
+static int
+is_addr(const char *name)
+{
+	char strport[NI_MAXSERV];
+	struct addrinfo hints, *res;
+
+	if (is_addr_fast(name))
+		return 1;
+
+	snprintf(strport, sizeof strport, "%u", default_ssh_port());
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = options.address_family == -1 ?
+	    AF_UNSPEC : options.address_family;
+	hints.ai_socktype = SOCK_STREAM;
+	hints.ai_flags = AI_NUMERICHOST|AI_NUMERICSERV;
+	if (getaddrinfo(name, strport, &hints, &res) != 0)
+		return 0;
+	if (res == NULL || res->ai_next != NULL) {
+		freeaddrinfo(res);
+		return 0;
+	}
+	freeaddrinfo(res);
+	return 1;
+}
+
 /*
  * Attempt to resolve a numeric host address / port to a single address.
  * Returns a canonical address string.
@@ -376,6 +407,33 @@
 	char *cp, *fullhost, newname[NI_MAXHOST];
 	struct addrinfo *addrs;
 
+	/*
+	 * Attempt to canonicalise addresses, regardless of
+	 * whether hostname canonicalisation was requested
+	 */
+	if ((addrs = resolve_addr(*hostp, port,
+	    newname, sizeof(newname))) != NULL) {
+		debug2("%s: hostname %.100s is address", __func__, *hostp);
+		if (strcasecmp(*hostp, newname) != 0) {
+			debug2("%s: canonicalised address \"%s\" => \"%s\"",
+			    __func__, *hostp, newname);
+			free(*hostp);
+			*hostp = xstrdup(newname);
+		}
+		return addrs;
+	}
+
+	/*
+	 * If this looks like an address but didn't parse as one, it might
+	 * be an address with an invalid interface scope. Skip further
+	 * attempts at canonicalisation.
+	 */
+	if (is_addr_fast(*hostp)) {
+		debug("%s: hostname %.100s is an unrecognised address",
+		    __func__, *hostp);
+		return NULL;
+	}
+
 	if (options.canonicalize_hostname == SSH_CANONICALISE_NO)
 		return NULL;
 
@@ -389,19 +447,6 @@
 	    options.canonicalize_hostname != SSH_CANONICALISE_ALWAYS)
 		return NULL;
 
-	/* Try numeric hostnames first */
-	if ((addrs = resolve_addr(*hostp, port,
-	    newname, sizeof(newname))) != NULL) {
-		debug2("%s: hostname %.100s is address", __func__, *hostp);
-		if (strcasecmp(*hostp, newname) != 0) {
-			debug2("%s: canonicalised address \"%s\" => \"%s\"",
-			    __func__, *hostp, newname);
-			free(*hostp);
-			*hostp = xstrdup(newname);
-		}
-		return addrs;
-	}
-
 	/* If domain name is anchored, then resolve it now */
 	if ((*hostp)[strlen(*hostp) - 1] == '.') {
 		debug3("%s: name is fully qualified", __func__);
@@ -456,18 +501,42 @@
 }
 
 /*
+ * Check the result of hostkey loading, ignoring some errors and
+ * fatal()ing for others.
+ */
+static void
+check_load(int r, const char *path, const char *message)
+{
+	switch (r) {
+	case 0:
+		break;
+	case SSH_ERR_INTERNAL_ERROR:
+	case SSH_ERR_ALLOC_FAIL:
+		fatal("load %s \"%s\": %s", message, path, ssh_err(r));
+	case SSH_ERR_SYSTEM_ERROR:
+		/* Ignore missing files */
+		if (errno == ENOENT)
+			break;
+		/* FALLTHROUGH */
+	default:
+		error("load %s \"%s\": %s", message, path, ssh_err(r));
+		break;
+	}
+}
+
+/*
  * Read per-user configuration file.  Ignore the system wide config
  * file if the user specifies a config file on the command line.
  */
 static void
-process_config_files(const char *host_arg, struct passwd *pw, int post_canon)
+process_config_files(const char *host_name, struct passwd *pw, int post_canon)
 {
 	char buf[PATH_MAX];
 	int r;
 
 	if (config != NULL) {
 		if (strcasecmp(config, "none") != 0 &&
-		    !read_config_file(config, pw, host, host_arg, &options,
+		    !read_config_file(config, pw, host, host_name, &options,
 		    SSHCONF_USERCONF | (post_canon ? SSHCONF_POSTCANON : 0)))
 			fatal("Can't open user config file %.100s: "
 			    "%.100s", config, strerror(errno));
@@ -475,13 +544,13 @@
 		r = snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir,
 		    _PATH_SSH_USER_CONFFILE);
 		if (r > 0 && (size_t)r < sizeof(buf))
-			(void)read_config_file(buf, pw, host, host_arg,
+			(void)read_config_file(buf, pw, host, host_name,
 			    &options, SSHCONF_CHECKPERM | SSHCONF_USERCONF |
 			    (post_canon ? SSHCONF_POSTCANON : 0));
 
 		/* Read systemwide configuration file after user config. */
 		(void)read_config_file(_PATH_HOST_CONFIG_FILE, pw,
-		    host, host_arg, &options,
+		    host, host_name, &options,
 		    post_canon ? SSHCONF_POSTCANON : 0);
 	}
 }
@@ -513,13 +582,12 @@
 main(int ac, char **av)
 {
 	struct ssh *ssh = NULL;
-	int i, r, opt, exit_status, use_syslog, direct, config_test = 0;
-	char *p, *cp, *line, *argv0, buf[PATH_MAX], *host_arg, *logfile;
-	char thishost[NI_MAXHOST], shorthost[NI_MAXHOST], portstr[NI_MAXSERV];
-	char cname[NI_MAXHOST], uidstr[32], *conn_hash_hex;
+	int i, r, opt, exit_status, use_syslog, direct, timeout_ms;
+	int was_addr, config_test = 0, opt_terminated = 0;
+	char *p, *cp, *line, *argv0, buf[PATH_MAX], *logfile;
+	char cname[NI_MAXHOST];
 	struct stat st;
 	struct passwd *pw;
-	int timeout_ms;
 	extern int optind, optreset;
 	extern char *optarg;
 	struct Forward fwd;
@@ -550,35 +618,10 @@
 	 */
 	closefrom(STDERR_FILENO + 1);
 
-	/*
-	 * Save the original real uid.  It will be needed later (uid-swapping
-	 * may clobber the real uid).
-	 */
-	original_real_uid = getuid();
-	original_effective_uid = geteuid();
-
-	/*
-	 * Use uid-swapping to give up root privileges for the duration of
-	 * option processing.  We will re-instantiate the rights when we are
-	 * ready to create the privileged port, and will permanently drop
-	 * them when the port has been created (actually, when the connection
-	 * has been made, as we may need to create the port several times).
-	 */
-	PRIV_END;
-
-#ifdef HAVE_SETRLIMIT
-	/* If we are installed setuid root be careful to not drop core. */
-	if (original_real_uid != original_effective_uid) {
-		struct rlimit rlim;
-		rlim.rlim_cur = rlim.rlim_max = 0;
-		if (setrlimit(RLIMIT_CORE, &rlim) < 0)
-			fatal("setrlimit failed: %.100s", strerror(errno));
-	}
-#endif
 	/* Get user data. */
-	pw = getpwuid(original_real_uid);
+	pw = getpwuid(getuid());
 	if (!pw) {
-		logit("No user exists for uid %lu", (u_long)original_real_uid);
+		logit("No user exists for uid %lu", (u_long)getuid());
 		exit(255);
 	}
 	/* Take a copy of the returned structure. */
@@ -600,6 +643,14 @@
 	 */
 	initialize_options(&options);
 
+	/*
+	 * Prepare main ssh transport/connection structures
+	 */
+	if ((ssh = ssh_alloc_session_state()) == NULL)
+		fatal("Couldn't allocate session state");
+	channel_init_channels(ssh);
+	active_state = ssh; /* XXX legacy API compat */
+
 	/* Parse command-line arguments. */
 	host = NULL;
 	use_syslog = 0;
@@ -608,13 +659,13 @@
 
  again:
 	while ((opt = getopt(ac, av, "1246ab:c:e:fgi:kl:m:no:p:qstvx"
-	    "ACD:E:F:GI:J:KL:MNO:PQ:R:S:TVw:W:XYy")) != -1) {
+	    "AB:CD:E:F:GI:J:KL:MNO:PQ:R:S:TVw:W:XYy")) != -1) {
 		switch (opt) {
 		case '1':
-			options.protocol = SSH_PROTO_1;
+			fatal("SSH protocol v.1 is no longer supported");
 			break;
 		case '2':
-			options.protocol = SSH_PROTO_2;
+			/* Ignored */
 			break;
 		case '4':
 			options.address_family = AF_INET;
@@ -673,7 +724,6 @@
 				fatal("Invalid multiplex command.");
 			break;
 		case 'P':	/* deprecated */
-			options.use_privileged_port = 0;
 			break;
 		case 'Q':
 			cp = NULL;
@@ -686,17 +736,13 @@
 			else if (strcmp(optarg, "kex") == 0)
 				cp = kex_alg_list('\n');
 			else if (strcmp(optarg, "key") == 0)
-				cp = sshkey_alg_list(0, 0, '\n');
+				cp = sshkey_alg_list(0, 0, 0, '\n');
 			else if (strcmp(optarg, "key-cert") == 0)
-				cp = sshkey_alg_list(1, 0, '\n');
+				cp = sshkey_alg_list(1, 0, 0, '\n');
 			else if (strcmp(optarg, "key-plain") == 0)
-				cp = sshkey_alg_list(0, 1, '\n');
+				cp = sshkey_alg_list(0, 1, 0, '\n');
 			else if (strcmp(optarg, "protocol-version") == 0) {
-#ifdef WITH_SSH1
-				cp = xstrdup("1\n2");
-#else
 				cp = xstrdup("2");
-#endif
 			}
 			if (cp == NULL)
 				fatal("Unsupported query \"%s\"", optarg);
@@ -718,7 +764,7 @@
 			options.gss_deleg_creds = 1;
 			break;
 		case 'i':
-			p = tilde_expand_filename(optarg, original_real_uid);
+			p = tilde_expand_filename(optarg, getuid());
 			if (stat(p, &st) < 0)
 				fprintf(stderr, "Warning: Identity file %s "
 				    "not accessible: %s.\n", p,
@@ -820,27 +866,14 @@
 			}
 			break;
 		case 'c':
-			if (ciphers_valid(*optarg == '+' ?
+			if (!ciphers_valid(*optarg == '+' ?
 			    optarg + 1 : optarg)) {
-				/* SSH2 only */
-				free(options.ciphers);
-				options.ciphers = xstrdup(optarg);
-				options.cipher = SSH_CIPHER_INVALID;
-				break;
-			}
-			/* SSH1 only */
-			options.cipher = cipher_number(optarg);
-			if (options.cipher == -1) {
 				fprintf(stderr, "Unknown cipher type '%s'\n",
 				    optarg);
 				exit(255);
 			}
-			if (options.cipher == SSH_CIPHER_3DES)
-				options.ciphers = xstrdup("3des-cbc");
-			else if (options.cipher == SSH_CIPHER_BLOWFISH)
-				options.ciphers = xstrdup("blowfish-cbc");
-			else
-				options.ciphers = xstrdup(KEX_CLIENT_ENCRYPT);
+			free(options.ciphers);
+			options.ciphers = xstrdup(optarg);
 			break;
 		case 'm':
 			if (mac_valid(optarg)) {
@@ -859,14 +892,18 @@
 				options.control_master = SSHCTL_MASTER_YES;
 			break;
 		case 'p':
-			options.port = a2port(optarg);
-			if (options.port <= 0) {
-				fprintf(stderr, "Bad port '%s'\n", optarg);
-				exit(255);
+			if (options.port == -1) {
+				options.port = a2port(optarg);
+				if (options.port <= 0) {
+					fprintf(stderr, "Bad port '%s'\n",
+					    optarg);
+					exit(255);
+				}
 			}
 			break;
 		case 'l':
-			options.user = optarg;
+			if (options.user == NULL)
+				options.user = optarg;
 			break;
 
 		case 'L':
@@ -881,7 +918,8 @@
 			break;
 
 		case 'R':
-			if (parse_forward(&fwd, optarg, 0, 1)) {
+			if (parse_forward(&fwd, optarg, 0, 1) ||
+			    parse_forward(&fwd, optarg, 1, 1)) {
 				add_remote_forward(&options, &fwd);
 			} else {
 				fprintf(stderr,
@@ -930,6 +968,9 @@
 		case 'b':
 			options.bind_address = optarg;
 			break;
+		case 'B':
+			options.bind_interface = optarg;
+			break;
 		case 'F':
 			config = optarg;
 			break;
@@ -938,21 +979,46 @@
 		}
 	}
 
+	if (optind > 1 && strcmp(av[optind - 1], "--") == 0)
+		opt_terminated = 1;
+
 	ac -= optind;
 	av += optind;
 
 	if (ac > 0 && !host) {
-		if (strrchr(*av, '@')) {
+		int tport;
+		char *tuser;
+		switch (parse_ssh_uri(*av, &tuser, &host, &tport)) {
+		case -1:
+			usage();
+			break;
+		case 0:
+			if (options.user == NULL) {
+				options.user = tuser;
+				tuser = NULL;
+			}
+			free(tuser);
+			if (options.port == -1 && tport != -1)
+				options.port = tport;
+			break;
+		default:
 			p = xstrdup(*av);
 			cp = strrchr(p, '@');
-			if (cp == NULL || cp == p)
-				usage();
-			options.user = p;
-			*cp = '\0';
-			host = xstrdup(++cp);
-		} else
-			host = xstrdup(*av);
-		if (ac > 1) {
+			if (cp != NULL) {
+				if (cp == p)
+					usage();
+				if (options.user == NULL) {
+					options.user = p;
+					p = NULL;
+				}
+				*cp++ = '\0';
+				host = xstrdup(cp);
+				free(p);
+			} else
+				host = p;
+			break;
+		}
+		if (ac > 1 && !opt_terminated) {
 			optind = optreset = 1;
 			goto again;
 		}
@@ -971,7 +1037,8 @@
 #endif
 
 	/* Initialize the command to execute on remote host. */
-	buffer_init(&command);
+	if ((command = sshbuf_new()) == NULL)
+		fatal("sshbuf_new failed");
 
 	/*
 	 * Save the command to execute on the remote host in a buffer. There
@@ -988,18 +1055,13 @@
 	} else {
 		/* A command has been specified.  Store it into the buffer. */
 		for (i = 0; i < ac; i++) {
-			if (i)
-				buffer_append(&command, " ", 1);
-			buffer_append(&command, av[i], strlen(av[i]));
+			if ((r = sshbuf_putf(command, "%s%s",
+			    i ? " " : "", av[i])) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 		}
 	}
 
-	/* Cannot fork to background if no command. */
-	if (fork_after_authentication_flag && buffer_len(&command) == 0 &&
-	    !no_shell_flag)
-		fatal("Cannot fork into background without a command "
-		    "to execute.");
-
 	/*
 	 * Initialize "log" output.  Since we are the client all output
 	 * goes to stderr unless otherwise specified by -y or -E.
@@ -1009,8 +1071,11 @@
 	if (logfile != NULL)
 		log_redirect_stderr_to(logfile);
 	log_init(argv0,
-	    options.log_level == -1 ? SYSLOG_LEVEL_INFO : options.log_level,
-	    SYSLOG_FACILITY_USER, !use_syslog);
+	    options.log_level == SYSLOG_LEVEL_NOT_SET ?
+	    SYSLOG_LEVEL_INFO : options.log_level,
+	    options.log_facility == SYSLOG_FACILITY_NOT_SET ?
+	    SYSLOG_FACILITY_USER : options.log_facility,
+	    !use_syslog);
 
 	if (debug_flag)
 		logit("%s, %s", SSH_RELEASE,
@@ -1038,16 +1103,22 @@
 		options.hostname = xstrdup(host);
 	}
 
-	/* If canonicalization requested then try to apply it */
-	lowercase(host);
-	if (options.canonicalize_hostname != SSH_CANONICALISE_NO)
+	/* Don't lowercase addresses, they will be explicitly canonicalised */
+	if ((was_addr = is_addr(host)) == 0)
+		lowercase(host);
+
+	/*
+	 * Try to canonicalize if requested by configuration or the
+	 * hostname is an address.
+	 */
+	if (options.canonicalize_hostname != SSH_CANONICALISE_NO || was_addr)
 		addrs = resolve_canonicalize(&host, options.port);
 
 	/*
 	 * If CanonicalizePermittedCNAMEs have been specified but
 	 * other canonicalization did not happen (by not being requested
 	 * or by failing with fallback) then the hostname may still be changed
-	 * as a result of CNAME following. 
+	 * as a result of CNAME following.
 	 *
 	 * Try to resolve the bare hostname name using the system resolver's
 	 * usual search rules and then apply the CNAME follow rules.
@@ -1097,6 +1168,14 @@
 	 */
 	if (options.jump_host != NULL) {
 		char port_s[8];
+		const char *sshbin = argv0;
+
+		/*
+		 * Try to use SSH indicated by argv[0], but fall back to
+		 * "ssh" if it appears unavailable.
+		 */
+		if (strchr(argv0, '/') != NULL && access(argv0, X_OK) != 0)
+			sshbin = "ssh";
 
 		/* Consistency check */
 		if (options.proxy_command != NULL)
@@ -1105,7 +1184,8 @@
 		options.proxy_use_fdpass = 0;
 		snprintf(port_s, sizeof(port_s), "%d", options.jump_port);
 		xasprintf(&options.proxy_command,
-		    "ssh%s%s%s%s%s%s%s%s%s%.*s -W [%%h]:%%p %s",
+		    "%s%s%s%s%s%s%s%s%s%s%.*s -W '[%%h]:%%p' %s",
+		    sshbin,
 		    /* Optional "-l user" argument if jump_user set */
 		    options.jump_user == NULL ? "" : " -l ",
 		    options.jump_user == NULL ? "" : options.jump_user,
@@ -1129,7 +1209,7 @@
 
 	if (options.port == 0)
 		options.port = default_ssh_port();
-	channel_set_af(options.address_family);
+	channel_set_af(ssh, options.address_family);
 
 	/* Tidy and check options */
 	if (options.host_key_alias != NULL)
@@ -1146,20 +1226,25 @@
 	}
 	if (options.connection_attempts <= 0)
 		fatal("Invalid number of ConnectionAttempts");
-#ifndef HAVE_CYGWIN
-	if (original_effective_uid != 0)
-		options.use_privileged_port = 0;
-#endif
+
+	if (sshbuf_len(command) != 0 && options.remote_command != NULL)
+		fatal("Cannot execute command-line and remote command.");
+
+	/* Cannot fork to background if no command. */
+	if (fork_after_authentication_flag && sshbuf_len(command) == 0 &&
+	    options.remote_command == NULL && !no_shell_flag)
+		fatal("Cannot fork into background without a command "
+		    "to execute.");
 
 	/* reinit */
-	log_init(argv0, options.log_level, SYSLOG_FACILITY_USER, !use_syslog);
+	log_init(argv0, options.log_level, options.log_facility, !use_syslog);
 
 	if (options.request_tty == REQUEST_TTY_YES ||
 	    options.request_tty == REQUEST_TTY_FORCE)
 		tty_flag = 1;
 
 	/* Allocate a tty by default if no command specified. */
-	if (buffer_len(&command) == 0)
+	if (sshbuf_len(command) == 0 && options.remote_command == NULL)
 		tty_flag = options.request_tty != REQUEST_TTY_NO;
 
 	/* Force no tty */
@@ -1180,12 +1265,14 @@
 	if (options.user == NULL)
 		options.user = xstrdup(pw->pw_name);
 
+	/* Set up strings used to percent_expand() arguments */
 	if (gethostname(thishost, sizeof(thishost)) == -1)
 		fatal("gethostname: %s", strerror(errno));
 	strlcpy(shorthost, thishost, sizeof(shorthost));
 	shorthost[strcspn(thishost, ".")] = '\0';
 	snprintf(portstr, sizeof(portstr), "%d", options.port);
-	snprintf(uidstr, sizeof(uidstr), "%d", pw->pw_uid);
+	snprintf(uidstr, sizeof(uidstr), "%llu",
+	    (unsigned long long)pw->pw_uid);
 
 	if ((md = ssh_digest_start(SSH_DIGEST_SHA1)) == NULL ||
 	    ssh_digest_update(md, thishost, strlen(thishost)) < 0 ||
@@ -1197,32 +1284,41 @@
 	ssh_digest_free(md);
 	conn_hash_hex = tohex(conn_hash, ssh_digest_bytes(SSH_DIGEST_SHA1));
 
-	if (options.local_command != NULL) {
-		debug3("expanding LocalCommand: %s", options.local_command);
-		cp = options.local_command;
-		options.local_command = percent_expand(cp,
+	/*
+	 * Expand tokens in arguments. NB. LocalCommand is expanded later,
+	 * after port-forwarding is set up, so it may pick up any local
+	 * tunnel interface name allocated.
+	 */
+	if (options.remote_command != NULL) {
+		debug3("expanding RemoteCommand: %s", options.remote_command);
+		cp = options.remote_command;
+		options.remote_command = percent_expand(cp,
 		    "C", conn_hash_hex,
 		    "L", shorthost,
 		    "d", pw->pw_dir,
 		    "h", host,
+		    "i", uidstr,
 		    "l", thishost,
 		    "n", host_arg,
 		    "p", portstr,
 		    "r", options.user,
 		    "u", pw->pw_name,
 		    (char *)NULL);
-		debug3("expanded LocalCommand: %s", options.local_command);
+		debug3("expanded RemoteCommand: %s", options.remote_command);
 		free(cp);
+		if ((r = sshbuf_put(command, options.remote_command,
+		    strlen(options.remote_command))) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 
 	if (options.control_path != NULL) {
-		cp = tilde_expand_filename(options.control_path,
-		    original_real_uid);
+		cp = tilde_expand_filename(options.control_path, getuid());
 		free(options.control_path);
 		options.control_path = percent_expand(cp,
 		    "C", conn_hash_hex,
 		    "L", shorthost,
 		    "h", host,
+		    "i", uidstr,
 		    "l", thishost,
 		    "n", host_arg,
 		    "p", portstr,
@@ -1232,7 +1328,6 @@
 		    (char *)NULL);
 		free(cp);
 	}
-	free(conn_hash_hex);
 
 	if (config_test) {
 		dump_client_config(&options, host);
@@ -1244,9 +1339,7 @@
 	if (options.control_path != NULL) {
 		int sock;
 		if ((sock = muxclient(options.control_path)) >= 0) {
-			packet_set_connection(sock, sock);
-			ssh = active_state; /* XXX */
-			enable_compat20();	/* XXX */
+			ssh_packet_set_connection(ssh, sock, sock);
 			packet_set_mux();
 			goto skip_connect;
 		}
@@ -1266,10 +1359,9 @@
 	timeout_ms = options.connection_timeout * 1000;
 
 	/* Open a connection to the remote host. */
-	if (ssh_connect(host, addrs, &hostaddr, options.port,
+	if (ssh_connect(ssh, host, addrs, &hostaddr, options.port,
 	    options.address_family, options.connection_attempts,
-	    &timeout_ms, options.tcp_keep_alive,
-	    options.use_privileged_port) != 0)
+	    &timeout_ms, options.tcp_keep_alive) != 0)
  		exit(255);
 
 	if (addrs != NULL)
@@ -1284,96 +1376,45 @@
 		debug3("timeout: %d ms remain after connect", timeout_ms);
 
 	/*
-	 * If we successfully made the connection, load the host private key
-	 * in case we will need it later for combined rsa-rhosts
-	 * authentication. This must be done before releasing extra
-	 * privileges, because the file is only readable by root.
-	 * If we cannot access the private keys, load the public keys
-	 * instead and try to execute the ssh-keysign helper instead.
+	 * If we successfully made the connection and we have hostbased auth
+	 * enabled, load the public keys so we can later use the ssh-keysign
+	 * helper to sign challenges.
 	 */
 	sensitive_data.nkeys = 0;
 	sensitive_data.keys = NULL;
-	sensitive_data.external_keysign = 0;
-	if (options.rhosts_rsa_authentication ||
-	    options.hostbased_authentication) {
-		sensitive_data.nkeys = 9;
+	if (options.hostbased_authentication) {
+		sensitive_data.nkeys = 10;
 		sensitive_data.keys = xcalloc(sensitive_data.nkeys,
-		    sizeof(Key));
-		for (i = 0; i < sensitive_data.nkeys; i++)
-			sensitive_data.keys[i] = NULL;
+		    sizeof(struct sshkey));
 
-		PRIV_START;
-#if WITH_SSH1
-		sensitive_data.keys[0] = key_load_private_type(KEY_RSA1,
-		    _PATH_HOST_KEY_FILE, "", NULL, NULL);
-#endif
-#ifdef OPENSSL_HAS_ECC
-		sensitive_data.keys[1] = key_load_private_cert(KEY_ECDSA,
-		    _PATH_HOST_ECDSA_KEY_FILE, "", NULL);
-#endif
-		sensitive_data.keys[2] = key_load_private_cert(KEY_ED25519,
-		    _PATH_HOST_ED25519_KEY_FILE, "", NULL);
-		sensitive_data.keys[3] = key_load_private_cert(KEY_RSA,
-		    _PATH_HOST_RSA_KEY_FILE, "", NULL);
-		sensitive_data.keys[4] = key_load_private_cert(KEY_DSA,
-		    _PATH_HOST_DSA_KEY_FILE, "", NULL);
-#ifdef OPENSSL_HAS_ECC
-		sensitive_data.keys[5] = key_load_private_type(KEY_ECDSA,
-		    _PATH_HOST_ECDSA_KEY_FILE, "", NULL, NULL);
-#endif
-		sensitive_data.keys[6] = key_load_private_type(KEY_ED25519,
-		    _PATH_HOST_ED25519_KEY_FILE, "", NULL, NULL);
-		sensitive_data.keys[7] = key_load_private_type(KEY_RSA,
-		    _PATH_HOST_RSA_KEY_FILE, "", NULL, NULL);
-		sensitive_data.keys[8] = key_load_private_type(KEY_DSA,
-		    _PATH_HOST_DSA_KEY_FILE, "", NULL, NULL);
-		PRIV_END;
+		/* XXX check errors? */
+#define L_PUBKEY(p,o) do { \
+	if ((o) >= sensitive_data.nkeys) \
+		fatal("%s pubkey out of array bounds", __func__); \
+	check_load(sshkey_load_public(p, &(sensitive_data.keys[o]), NULL), \
+	    p, "pubkey"); \
+} while (0)
+#define L_CERT(p,o) do { \
+	if ((o) >= sensitive_data.nkeys) \
+		fatal("%s cert out of array bounds", __func__); \
+	check_load(sshkey_load_cert(p, &(sensitive_data.keys[o])), p, "cert"); \
+} while (0)
 
-		if (options.hostbased_authentication == 1 &&
-		    sensitive_data.keys[0] == NULL &&
-		    sensitive_data.keys[5] == NULL &&
-		    sensitive_data.keys[6] == NULL &&
-		    sensitive_data.keys[7] == NULL &&
-		    sensitive_data.keys[8] == NULL) {
-#ifdef OPENSSL_HAS_ECC
-			sensitive_data.keys[1] = key_load_cert(
-			    _PATH_HOST_ECDSA_KEY_FILE);
-#endif
-			sensitive_data.keys[2] = key_load_cert(
-			    _PATH_HOST_ED25519_KEY_FILE);
-			sensitive_data.keys[3] = key_load_cert(
-			    _PATH_HOST_RSA_KEY_FILE);
-			sensitive_data.keys[4] = key_load_cert(
-			    _PATH_HOST_DSA_KEY_FILE);
-#ifdef OPENSSL_HAS_ECC
-			sensitive_data.keys[5] = key_load_public(
-			    _PATH_HOST_ECDSA_KEY_FILE, NULL);
-#endif
-			sensitive_data.keys[6] = key_load_public(
-			    _PATH_HOST_ED25519_KEY_FILE, NULL);
-			sensitive_data.keys[7] = key_load_public(
-			    _PATH_HOST_RSA_KEY_FILE, NULL);
-			sensitive_data.keys[8] = key_load_public(
-			    _PATH_HOST_DSA_KEY_FILE, NULL);
-			sensitive_data.external_keysign = 1;
+		if (options.hostbased_authentication == 1) {
+			L_CERT(_PATH_HOST_ECDSA_KEY_FILE, 0);
+			L_CERT(_PATH_HOST_ED25519_KEY_FILE, 1);
+			L_CERT(_PATH_HOST_RSA_KEY_FILE, 2);
+			L_CERT(_PATH_HOST_DSA_KEY_FILE, 3);
+			L_PUBKEY(_PATH_HOST_ECDSA_KEY_FILE, 4);
+			L_PUBKEY(_PATH_HOST_ED25519_KEY_FILE, 5);
+			L_PUBKEY(_PATH_HOST_RSA_KEY_FILE, 6);
+			L_PUBKEY(_PATH_HOST_DSA_KEY_FILE, 7);
+			L_CERT(_PATH_HOST_XMSS_KEY_FILE, 8);
+			L_PUBKEY(_PATH_HOST_XMSS_KEY_FILE, 9);
 		}
 	}
-	/*
-	 * Get rid of any extra privileges that we may have.  We will no
-	 * longer need them.  Also, extra privileges could make it very hard
-	 * to read identity files and other non-world-readable files from the
-	 * user's home directory if it happens to be on a NFS volume where
-	 * root is mapped to nobody.
-	 */
-	if (original_effective_uid == 0) {
-		PRIV_START;
-		permanently_set_uid(pw);
-	}
 
-	/*
-	 * Now that we are back to our own permissions, create ~/.ssh
-	 * directory if it doesn't already exist.
-	 */
+	/* Create ~/.ssh * directory if it doesn't already exist. */
 	if (config == NULL) {
 		r = snprintf(buf, sizeof buf, "%s%s%s", pw->pw_dir,
 		    strcmp(pw->pw_dir, "/") ? "/" : "", _PATH_SSH_USER_DIR);
@@ -1390,19 +1431,24 @@
 		}
 	}
 	/* load options.identity_files */
-	load_public_identity_files();
+	load_public_identity_files(pw);
 
-	/* optionally set the SSH_AUTHSOCKET_ENV_NAME varibale */
+	/* optionally set the SSH_AUTHSOCKET_ENV_NAME variable */
 	if (options.identity_agent &&
 	    strcmp(options.identity_agent, SSH_AUTHSOCKET_ENV_NAME) != 0) {
 		if (strcmp(options.identity_agent, "none") == 0) {
 			unsetenv(SSH_AUTHSOCKET_ENV_NAME);
 		} else {
 			p = tilde_expand_filename(options.identity_agent,
-			    original_real_uid);
-			cp = percent_expand(p, "d", pw->pw_dir,
-			    "u", pw->pw_name, "l", thishost, "h", host,
-			    "r", options.user, (char *)NULL);
+			    getuid());
+			cp = percent_expand(p,
+			    "d", pw->pw_dir,
+			    "h", host,
+			    "i", uidstr,
+			    "l", thishost,
+			    "r", options.user,
+			    "u", pw->pw_name,
+			    (char *)NULL);
 			setenv(SSH_AUTHSOCKET_ENV_NAME, cp, 1);
 			free(cp);
 			free(p);
@@ -1434,7 +1480,7 @@
 			if (sensitive_data.keys[i] != NULL) {
 				/* Destroys contents safely */
 				debug3("clear hostkey %d", i);
-				key_free(sensitive_data.keys[i]);
+				sshkey_free(sensitive_data.keys[i]);
 				sensitive_data.keys[i] = NULL;
 			}
 		}
@@ -1444,7 +1490,7 @@
 		free(options.identity_files[i]);
 		options.identity_files[i] = NULL;
 		if (options.identity_keys[i]) {
-			key_free(options.identity_keys[i]);
+			sshkey_free(options.identity_keys[i]);
 			options.identity_keys[i] = NULL;
 		}
 	}
@@ -1454,7 +1500,7 @@
 	}
 
  skip_connect:
-	exit_status = compat20 ? ssh_session2() : ssh_session();
+	exit_status = ssh_session2(ssh, pw);
 	packet_close();
 
 	if (options.control_path != NULL && muxserver_sock != -1)
@@ -1474,29 +1520,29 @@
 
 	debug("%s: backgrounding master process", __func__);
 
- 	/*
- 	 * master (current process) into the background, and make the
- 	 * foreground process a client of the backgrounded master.
- 	 */
+	/*
+	 * master (current process) into the background, and make the
+	 * foreground process a client of the backgrounded master.
+	 */
 	switch ((pid = fork())) {
 	case -1:
 		fatal("%s: fork: %s", __func__, strerror(errno));
 	case 0:
 		/* Child: master process continues mainloop */
- 		break;
- 	default:
+		break;
+	default:
 		/* Parent: set up mux slave to connect to backgrounded master */
 		debug2("%s: background process is %ld", __func__, (long)pid);
 		stdin_null_flag = ostdin_null_flag;
 		options.request_tty = orequest_tty;
 		tty_flag = otty_flag;
- 		close(muxserver_sock);
- 		muxserver_sock = -1;
+		close(muxserver_sock);
+		muxserver_sock = -1;
 		options.control_master = SSHCTL_MASTER_NO;
- 		muxclient(options.control_path);
+		muxclient(options.control_path);
 		/* muxclient() doesn't return on success. */
- 		fatal("Failed to connect to new control master");
- 	}
+		fatal("Failed to connect to new control master");
+	}
 	if ((devnull = open(_PATH_DEVNULL, O_RDWR)) == -1) {
 		error("%s: open(\"/dev/null\"): %s", __func__,
 		    strerror(errno));
@@ -1533,7 +1579,7 @@
 
 /* Callback for remote forward global requests */
 static void
-ssh_confirm_remote_forward(int type, u_int32_t seq, void *ctxt)
+ssh_confirm_remote_forward(struct ssh *ssh, int type, u_int32_t seq, void *ctxt)
 {
 	struct Forward *rfwd = (struct Forward *)ctxt;
 
@@ -1551,13 +1597,13 @@
 			logit("Allocated port %u for remote forward to %s:%d",
 			    rfwd->allocated_port,
 			    rfwd->connect_host, rfwd->connect_port);
-			channel_update_permitted_opens(rfwd->handle,
-			    rfwd->allocated_port);
+			channel_update_permission(ssh,
+			    rfwd->handle, rfwd->allocated_port);
 		} else {
-			channel_update_permitted_opens(rfwd->handle, -1);
+			channel_update_permission(ssh, rfwd->handle, -1);
 		}
 	}
-	
+
 	if (type == SSH2_MSG_REQUEST_FAILURE) {
 		if (options.exit_on_forward_failure) {
 			if (rfwd->listen_path != NULL)
@@ -1583,29 +1629,27 @@
 }
 
 static void
-client_cleanup_stdio_fwd(int id, void *arg)
+client_cleanup_stdio_fwd(struct ssh *ssh, int id, void *arg)
 {
 	debug("stdio forwarding: done");
 	cleanup_exit(0);
 }
 
 static void
-ssh_stdio_confirm(int id, int success, void *arg)
+ssh_stdio_confirm(struct ssh *ssh, int id, int success, void *arg)
 {
 	if (!success)
 		fatal("stdio forwarding failed");
 }
 
 static void
-ssh_init_stdio_forwarding(void)
+ssh_init_stdio_forwarding(struct ssh *ssh)
 {
 	Channel *c;
 	int in, out;
 
 	if (options.stdio_forward_host == NULL)
 		return;
-	if (!compat20)
-		fatal("stdio forwarding require Protocol 2");
 
 	debug3("%s: %s:%d", __func__, options.stdio_forward_host,
 	    options.stdio_forward_port);
@@ -1613,15 +1657,15 @@
 	if ((in = dup(STDIN_FILENO)) < 0 ||
 	    (out = dup(STDOUT_FILENO)) < 0)
 		fatal("channel_connect_stdio_fwd: dup() in/out failed");
-	if ((c = channel_connect_stdio_fwd(options.stdio_forward_host,
+	if ((c = channel_connect_stdio_fwd(ssh, options.stdio_forward_host,
 	    options.stdio_forward_port, in, out)) == NULL)
 		fatal("%s: channel_connect_stdio_fwd failed", __func__);
-	channel_register_cleanup(c->self, client_cleanup_stdio_fwd, 0);
-	channel_register_open_confirm(c->self, ssh_stdio_confirm, NULL);
+	channel_register_cleanup(ssh, c->self, client_cleanup_stdio_fwd, 0);
+	channel_register_open_confirm(ssh, c->self, ssh_stdio_confirm, NULL);
 }
 
 static void
-ssh_init_forwarding(void)
+ssh_init_forwarding(struct ssh *ssh, char **ifname)
 {
 	int success = 0;
 	int i;
@@ -1640,7 +1684,7 @@
 		    options.local_forwards[i].connect_path :
 		    options.local_forwards[i].connect_host,
 		    options.local_forwards[i].connect_port);
-		success += channel_setup_local_fwd_listener(
+		success += channel_setup_local_fwd_listener(ssh,
 		    &options.local_forwards[i], &options.fwd_opts);
 	}
 	if (i > 0 && success != i && options.exit_on_forward_failure)
@@ -1662,7 +1706,7 @@
 		    options.remote_forwards[i].connect_host,
 		    options.remote_forwards[i].connect_port);
 		options.remote_forwards[i].handle =
-		    channel_request_remote_forwarding(
+		    channel_request_remote_forwarding(ssh,
 		    &options.remote_forwards[i]);
 		if (options.remote_forwards[i].handle < 0) {
 			if (options.exit_on_forward_failure)
@@ -1671,21 +1715,23 @@
 				logit("Warning: Could not request remote "
 				    "forwarding.");
 		} else {
-			client_register_global_confirm(ssh_confirm_remote_forward,
+			client_register_global_confirm(
+			    ssh_confirm_remote_forward,
 			    &options.remote_forwards[i]);
 		}
 	}
 
 	/* Initiate tunnel forwarding. */
 	if (options.tun_open != SSH_TUNMODE_NO) {
-		if (client_request_tun_fwd(options.tun_open,
-		    options.tun_local, options.tun_remote) == -1) {
+		if ((*ifname = client_request_tun_fwd(ssh,
+		    options.tun_open, options.tun_local,
+		    options.tun_remote)) == NULL) {
 			if (options.exit_on_forward_failure)
 				fatal("Could not request tunnel forwarding.");
 			else
 				error("Could not request tunnel forwarding.");
 		}
-	}			
+	}
 }
 
 static void
@@ -1704,174 +1750,8 @@
 	}
 }
 
-static int
-ssh_session(void)
-{
-	int type;
-	int interactive = 0;
-	int have_tty = 0;
-	struct winsize ws;
-	char *cp;
-	const char *display;
-	char *proto = NULL, *data = NULL;
-
-	/* Enable compression if requested. */
-	if (options.compression) {
-		debug("Requesting compression at level %d.",
-		    options.compression_level);
-
-		if (options.compression_level < 1 ||
-		    options.compression_level > 9)
-			fatal("Compression level must be from 1 (fast) to "
-			    "9 (slow, best).");
-
-		/* Send the request. */
-		packet_start(SSH_CMSG_REQUEST_COMPRESSION);
-		packet_put_int(options.compression_level);
-		packet_send();
-		packet_write_wait();
-		type = packet_read();
-		if (type == SSH_SMSG_SUCCESS)
-			packet_start_compression(options.compression_level);
-		else if (type == SSH_SMSG_FAILURE)
-			logit("Warning: Remote host refused compression.");
-		else
-			packet_disconnect("Protocol error waiting for "
-			    "compression response.");
-	}
-	/* Allocate a pseudo tty if appropriate. */
-	if (tty_flag) {
-		debug("Requesting pty.");
-
-		/* Start the packet. */
-		packet_start(SSH_CMSG_REQUEST_PTY);
-
-		/* Store TERM in the packet.  There is no limit on the
-		   length of the string. */
-		cp = getenv("TERM");
-		if (!cp)
-			cp = "";
-		packet_put_cstring(cp);
-
-		/* Store window size in the packet. */
-		if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) < 0)
-			memset(&ws, 0, sizeof(ws));
-		packet_put_int((u_int)ws.ws_row);
-		packet_put_int((u_int)ws.ws_col);
-		packet_put_int((u_int)ws.ws_xpixel);
-		packet_put_int((u_int)ws.ws_ypixel);
-
-		/* Store tty modes in the packet. */
-		tty_make_modes(fileno(stdin), NULL);
-
-		/* Send the packet, and wait for it to leave. */
-		packet_send();
-		packet_write_wait();
-
-		/* Read response from the server. */
-		type = packet_read();
-		if (type == SSH_SMSG_SUCCESS) {
-			interactive = 1;
-			have_tty = 1;
-		} else if (type == SSH_SMSG_FAILURE)
-			logit("Warning: Remote host failed or refused to "
-			    "allocate a pseudo tty.");
-		else
-			packet_disconnect("Protocol error waiting for pty "
-			    "request response.");
-	}
-	/* Request X11 forwarding if enabled and DISPLAY is set. */
-	display = getenv("DISPLAY");
-	if (display == NULL && options.forward_x11)
-		debug("X11 forwarding requested but DISPLAY not set");
-	if (options.forward_x11 && client_x11_get_proto(display,
-	    options.xauth_location, options.forward_x11_trusted,
-	    options.forward_x11_timeout, &proto, &data) == 0) {
-		/* Request forwarding with authentication spoofing. */
-		debug("Requesting X11 forwarding with authentication "
-		    "spoofing.");
-		x11_request_forwarding_with_spoofing(0, display, proto,
-		    data, 0);
-		/* Read response from the server. */
-		type = packet_read();
-		if (type == SSH_SMSG_SUCCESS) {
-			interactive = 1;
-		} else if (type == SSH_SMSG_FAILURE) {
-			logit("Warning: Remote host denied X11 forwarding.");
-		} else {
-			packet_disconnect("Protocol error waiting for X11 "
-			    "forwarding");
-		}
-	}
-	/* Tell the packet module whether this is an interactive session. */
-	packet_set_interactive(interactive,
-	    options.ip_qos_interactive, options.ip_qos_bulk);
-
-	/* Request authentication agent forwarding if appropriate. */
-	check_agent_present();
-
-	if (options.forward_agent) {
-		debug("Requesting authentication agent forwarding.");
-		auth_request_forwarding();
-
-		/* Read response from the server. */
-		type = packet_read();
-		packet_check_eom();
-		if (type != SSH_SMSG_SUCCESS)
-			logit("Warning: Remote host denied authentication agent forwarding.");
-	}
-
-	/* Initiate port forwardings. */
-	ssh_init_stdio_forwarding();
-	ssh_init_forwarding();
-
-	/* Execute a local command */
-	if (options.local_command != NULL &&
-	    options.permit_local_command)
-		ssh_local_cmd(options.local_command);
-
-	/*
-	 * If requested and we are not interested in replies to remote
-	 * forwarding requests, then let ssh continue in the background.
-	 */
-	if (fork_after_authentication_flag) {
-		if (options.exit_on_forward_failure &&
-		    options.num_remote_forwards > 0) {
-			debug("deferring postauth fork until remote forward "
-			    "confirmation received");
-		} else
-			fork_postauth();
-	}
-
-	/*
-	 * If a command was specified on the command line, execute the
-	 * command now. Otherwise request the server to start a shell.
-	 */
-	if (buffer_len(&command) > 0) {
-		int len = buffer_len(&command);
-		if (len > 900)
-			len = 900;
-		debug("Sending command: %.*s", len,
-		    (u_char *)buffer_ptr(&command));
-		packet_start(SSH_CMSG_EXEC_CMD);
-		packet_put_string(buffer_ptr(&command), buffer_len(&command));
-		packet_send();
-		packet_write_wait();
-	} else {
-		debug("Requesting shell.");
-		packet_start(SSH_CMSG_EXEC_SHELL);
-		packet_send();
-		packet_write_wait();
-	}
-
-	/* Enter the interactive session. */
-	return client_loop(have_tty, tty_flag ?
-	    options.escape_char : SSH_ESCAPECHAR_NONE, 0);
-}
-
-/* request pty/x11/agent/tcpfwd/shell for channel */
 static void
-ssh_session2_setup(int id, int success, void *arg)
+ssh_session2_setup(struct ssh *ssh, int id, int success, void *arg)
 {
 	extern char **environ;
 	const char *display;
@@ -1884,15 +1764,15 @@
 	display = getenv("DISPLAY");
 	if (display == NULL && options.forward_x11)
 		debug("X11 forwarding requested but DISPLAY not set");
-	if (options.forward_x11 && client_x11_get_proto(display,
+	if (options.forward_x11 && client_x11_get_proto(ssh, display,
 	    options.xauth_location, options.forward_x11_trusted,
 	    options.forward_x11_timeout, &proto, &data) == 0) {
 		/* Request forwarding with authentication spoofing. */
 		debug("Requesting X11 forwarding with authentication "
 		    "spoofing.");
-		x11_request_forwarding_with_spoofing(id, display, proto,
+		x11_request_forwarding_with_spoofing(ssh, id, display, proto,
 		    data, 1);
-		client_expect_confirm(id, "X11 forwarding", CONFIRM_WARN);
+		client_expect_confirm(ssh, id, "X11 forwarding", CONFIRM_WARN);
 		/* XXX exit_on_forward_failure */
 		interactive = 1;
 	}
@@ -1900,7 +1780,7 @@
 	check_agent_present();
 	if (options.forward_agent) {
 		debug("Requesting authentication agent forwarding.");
-		channel_request_start(id, "auth-agent-req@openssh.com", 0);
+		channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
 		packet_send();
 	}
 
@@ -1908,13 +1788,13 @@
 	packet_set_interactive(interactive,
 	    options.ip_qos_interactive, options.ip_qos_bulk);
 
-	client_session2_setup(id, tty_flag, subsystem_flag, getenv("TERM"),
-	    NULL, fileno(stdin), &command, environ);
+	client_session2_setup(ssh, id, tty_flag, subsystem_flag, getenv("TERM"),
+	    NULL, fileno(stdin), command, environ);
 }
 
 /* open new channel for a session */
 static int
-ssh_session2_open(void)
+ssh_session2_open(struct ssh *ssh)
 {
 	Channel *c;
 	int window, packetmax, in, out, err;
@@ -1944,36 +1824,58 @@
 		window >>= 1;
 		packetmax >>= 1;
 	}
-	c = channel_new(
+	c = channel_new(ssh,
 	    "session", SSH_CHANNEL_OPENING, in, out, err,
 	    window, packetmax, CHAN_EXTENDED_WRITE,
 	    "client-session", /*nonblock*/0);
 
-	debug3("ssh_session2_open: channel_new: %d", c->self);
+	debug3("%s: channel_new: %d", __func__, c->self);
 
-	channel_send_open(c->self);
+	channel_send_open(ssh, c->self);
 	if (!no_shell_flag)
-		channel_register_open_confirm(c->self,
+		channel_register_open_confirm(ssh, c->self,
 		    ssh_session2_setup, NULL);
 
 	return c->self;
 }
 
 static int
-ssh_session2(void)
+ssh_session2(struct ssh *ssh, struct passwd *pw)
 {
-	int id = -1;
+	int devnull, id = -1;
+	char *cp, *tun_fwd_ifname = NULL;
 
 	/* XXX should be pre-session */
 	if (!options.control_persist)
-		ssh_init_stdio_forwarding();
-	ssh_init_forwarding();
+		ssh_init_stdio_forwarding(ssh);
+
+	ssh_init_forwarding(ssh, &tun_fwd_ifname);
+
+	if (options.local_command != NULL) {
+		debug3("expanding LocalCommand: %s", options.local_command);
+		cp = options.local_command;
+		options.local_command = percent_expand(cp,
+		    "C", conn_hash_hex,
+		    "L", shorthost,
+		    "d", pw->pw_dir,
+		    "h", host,
+		    "i", uidstr,
+		    "l", thishost,
+		    "n", host_arg,
+		    "p", portstr,
+		    "r", options.user,
+		    "u", pw->pw_name,
+		    "T", tun_fwd_ifname == NULL ? "NONE" : tun_fwd_ifname,
+		    (char *)NULL);
+		debug3("expanded LocalCommand: %s", options.local_command);
+		free(cp);
+	}
 
 	/* Start listening for multiplex clients */
 	if (!packet_get_mux())
-		muxserver_listen();
+		muxserver_listen(ssh);
 
- 	/*
+	/*
 	 * If we are in control persist mode and have a working mux listen
 	 * socket, then prepare to background ourselves and have a foreground
 	 * client attach as a control slave.
@@ -1982,27 +1884,27 @@
 	 * after the connection is fully established (in particular,
 	 * async rfwd replies have been received for ExitOnForwardFailure).
 	 */
- 	if (options.control_persist && muxserver_sock != -1) {
+	if (options.control_persist && muxserver_sock != -1) {
 		ostdin_null_flag = stdin_null_flag;
 		ono_shell_flag = no_shell_flag;
 		orequest_tty = options.request_tty;
 		otty_flag = tty_flag;
- 		stdin_null_flag = 1;
- 		no_shell_flag = 1;
- 		tty_flag = 0;
+		stdin_null_flag = 1;
+		no_shell_flag = 1;
+		tty_flag = 0;
 		if (!fork_after_authentication_flag)
 			need_controlpersist_detach = 1;
 		fork_after_authentication_flag = 1;
- 	}
+	}
 	/*
 	 * ControlPersist mux listen socket setup failed, attempt the
 	 * stdio forward setup that we skipped earlier.
 	 */
 	if (options.control_persist && muxserver_sock == -1)
-		ssh_init_stdio_forwarding();
+		ssh_init_stdio_forwarding(ssh);
 
-	if (!no_shell_flag || (datafellows & SSH_BUG_DUMMYCHAN))
-		id = ssh_session2_open();
+	if (!no_shell_flag)
+		id = ssh_session2_open(ssh);
 	else {
 		packet_set_interactive(
 		    options.control_master == SSHCTL_MASTER_NO,
@@ -2025,6 +1927,22 @@
 		ssh_local_cmd(options.local_command);
 
 	/*
+	 * stdout is now owned by the session channel; clobber it here
+	 * so future channel closes are propagated to the local fd.
+	 * NB. this can only happen after LocalCommand has completed,
+	 * as it may want to write to stdout.
+	 */
+	if (!need_controlpersist_detach) {
+		if ((devnull = open(_PATH_DEVNULL, O_WRONLY)) == -1)
+			error("%s: open %s: %s", __func__,
+			    _PATH_DEVNULL, strerror(errno));
+		if (dup2(devnull, STDOUT_FILENO) < 0)
+			fatal("%s: dup2() stdout failed", __func__);
+		if (devnull > STDERR_FILENO)
+			close(devnull);
+	}
+
+	/*
 	 * If requested and we are not interested in replies to remote
 	 * forwarding requests, then let ssh continue in the background.
 	 */
@@ -2037,34 +1955,38 @@
 			fork_postauth();
 	}
 
-	return client_loop(tty_flag, tty_flag ?
+	return client_loop(ssh, tty_flag, tty_flag ?
 	    options.escape_char : SSH_ESCAPECHAR_NONE, id);
 }
 
 /* Loads all IdentityFile and CertificateFile keys */
 static void
-load_public_identity_files(void)
+load_public_identity_files(struct passwd *pw)
 {
-	char *filename, *cp, thishost[NI_MAXHOST];
-	char *pwdir = NULL, *pwname = NULL;
-	Key *public;
-	struct passwd *pw;
+	char *filename, *cp;
+	struct sshkey *public;
 	int i;
 	u_int n_ids, n_certs;
 	char *identity_files[SSH_MAX_IDENTITY_FILES];
-	Key *identity_keys[SSH_MAX_IDENTITY_FILES];
+	struct sshkey *identity_keys[SSH_MAX_IDENTITY_FILES];
+	int identity_file_userprovided[SSH_MAX_IDENTITY_FILES];
 	char *certificate_files[SSH_MAX_CERTIFICATE_FILES];
 	struct sshkey *certificates[SSH_MAX_CERTIFICATE_FILES];
+	int certificate_file_userprovided[SSH_MAX_CERTIFICATE_FILES];
 #ifdef ENABLE_PKCS11
-	Key **keys;
+	struct sshkey **keys;
 	int nkeys;
 #endif /* PKCS11 */
 
 	n_ids = n_certs = 0;
 	memset(identity_files, 0, sizeof(identity_files));
 	memset(identity_keys, 0, sizeof(identity_keys));
+	memset(identity_file_userprovided, 0,
+	    sizeof(identity_file_userprovided));
 	memset(certificate_files, 0, sizeof(certificate_files));
 	memset(certificates, 0, sizeof(certificates));
+	memset(certificate_file_userprovided, 0,
+	    sizeof(certificate_file_userprovided));
 
 #ifdef ENABLE_PKCS11
 	if (options.pkcs11_provider != NULL &&
@@ -2074,7 +1996,7 @@
 	    &keys)) > 0) {
 		for (i = 0; i < nkeys; i++) {
 			if (n_ids >= SSH_MAX_IDENTITY_FILES) {
-				key_free(keys[i]);
+				sshkey_free(keys[i]);
 				continue;
 			}
 			identity_keys[n_ids] = keys[i];
@@ -2085,13 +2007,6 @@
 		free(keys);
 	}
 #endif /* ENABLE_PKCS11 */
-	if ((pw = getpwuid(original_real_uid)) == NULL)
-		fatal("load_public_identity_files: getpwuid failed");
-	pwname = xstrdup(pw->pw_name);
-	pwdir = xstrdup(pw->pw_dir);
-	if (gethostname(thishost, sizeof(thishost)) == -1)
-		fatal("load_public_identity_files: gethostname: %s",
-		    strerror(errno));
 	for (i = 0; i < options.num_identity_files; i++) {
 		if (n_ids >= SSH_MAX_IDENTITY_FILES ||
 		    strcasecmp(options.identity_files[i], "none") == 0) {
@@ -2099,19 +2014,20 @@
 			options.identity_files[i] = NULL;
 			continue;
 		}
-		cp = tilde_expand_filename(options.identity_files[i],
-		    original_real_uid);
-		filename = percent_expand(cp, "d", pwdir,
-		    "u", pwname, "l", thishost, "h", host,
+		cp = tilde_expand_filename(options.identity_files[i], getuid());
+		filename = percent_expand(cp, "d", pw->pw_dir,
+		    "u", pw->pw_name, "l", thishost, "h", host,
 		    "r", options.user, (char *)NULL);
 		free(cp);
-		public = key_load_public(filename, NULL);
+		check_load(sshkey_load_public(filename, &public, NULL),
+		    filename, "pubkey");
 		debug("identity file %s type %d", filename,
 		    public ? public->type : -1);
 		free(options.identity_files[i]);
 		identity_files[n_ids] = filename;
 		identity_keys[n_ids] = public;
-
+		identity_file_userprovided[n_ids] =
+		    options.identity_file_userprovided[i];
 		if (++n_ids >= SSH_MAX_IDENTITY_FILES)
 			continue;
 
@@ -2122,23 +2038,26 @@
 		if (options.num_certificate_files != 0)
 			continue;
 		xasprintf(&cp, "%s-cert", filename);
-		public = key_load_public(cp, NULL);
+		check_load(sshkey_load_public(cp, &public, NULL),
+		    filename, "pubkey");
 		debug("identity file %s type %d", cp,
 		    public ? public->type : -1);
 		if (public == NULL) {
 			free(cp);
 			continue;
 		}
-		if (!key_is_cert(public)) {
+		if (!sshkey_is_cert(public)) {
 			debug("%s: key %s type %s is not a certificate",
-			    __func__, cp, key_type(public));
-			key_free(public);
+			    __func__, cp, sshkey_type(public));
+			sshkey_free(public);
 			free(cp);
 			continue;
 		}
 		/* NB. leave filename pointing to private key */
 		identity_files[n_ids] = xstrdup(filename);
 		identity_keys[n_ids] = public;
+		identity_file_userprovided[n_ids] =
+		    options.identity_file_userprovided[i];
 		n_ids++;
 	}
 
@@ -2146,13 +2065,19 @@
 		fatal("%s: too many certificates", __func__);
 	for (i = 0; i < options.num_certificate_files; i++) {
 		cp = tilde_expand_filename(options.certificate_files[i],
-		    original_real_uid);
-		filename = percent_expand(cp, "d", pwdir,
-		    "u", pwname, "l", thishost, "h", host,
-		    "r", options.user, (char *)NULL);
+		    getuid());
+		filename = percent_expand(cp,
+		    "d", pw->pw_dir,
+		    "h", host,
+		    "i", uidstr,
+		    "l", thishost,
+		    "r", options.user,
+		    "u", pw->pw_name,
+		    (char *)NULL);
 		free(cp);
 
-		public = key_load_public(filename, NULL);
+		check_load(sshkey_load_public(filename, &public, NULL),
+		    filename, "certificate");
 		debug("certificate file %s type %d", filename,
 		    public ? public->type : -1);
 		free(options.certificate_files[i]);
@@ -2161,31 +2086,33 @@
 			free(filename);
 			continue;
 		}
-		if (!key_is_cert(public)) {
+		if (!sshkey_is_cert(public)) {
 			debug("%s: key %s type %s is not a certificate",
-			    __func__, filename, key_type(public));
-			key_free(public);
+			    __func__, filename, sshkey_type(public));
+			sshkey_free(public);
 			free(filename);
 			continue;
 		}
 		certificate_files[n_certs] = filename;
 		certificates[n_certs] = public;
+		certificate_file_userprovided[n_certs] =
+		    options.certificate_file_userprovided[i];
 		++n_certs;
 	}
 
 	options.num_identity_files = n_ids;
 	memcpy(options.identity_files, identity_files, sizeof(identity_files));
 	memcpy(options.identity_keys, identity_keys, sizeof(identity_keys));
+	memcpy(options.identity_file_userprovided,
+	    identity_file_userprovided, sizeof(identity_file_userprovided));
 
 	options.num_certificate_files = n_certs;
 	memcpy(options.certificate_files,
 	    certificate_files, sizeof(certificate_files));
 	memcpy(options.certificates, certificates, sizeof(certificates));
-
-	explicit_bzero(pwname, strlen(pwname));
-	free(pwname);
-	explicit_bzero(pwdir, strlen(pwdir));
-	free(pwdir);
+	memcpy(options.certificate_file_userprovided,
+	    certificate_file_userprovided,
+	    sizeof(certificate_file_userprovided));
 }
 
 static void
@@ -2198,7 +2125,5 @@
 	while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
 	    (pid < 0 && errno == EINTR))
 		;
-
-	signal(sig, main_sigchld_handler);
 	errno = save_errno;
 }
diff --git a/ssh.h b/ssh.h
index 50467a7..5abfd7a 100644
--- a/ssh.h
+++ b/ssh.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh.h,v 1.83 2015/12/11 03:19:09 djm Exp $ */
+/* $OpenBSD: ssh.h,v 1.88 2018/06/06 18:29:18 markus Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -31,13 +31,6 @@
 #define SSH_MAX_IDENTITY_FILES		100
 
 /*
- * Maximum length of lines in authorized_keys file.
- * Current value permits 16kbit RSA and RSA1 keys and 8kbit DSA keys, with
- * some room for options and comments.
- */
-#define SSH_MAX_PUBKEY_BYTES		16384
-
-/*
  * Major protocol version.  Different version indicates major incompatibility
  * that prevents communication.
  *
@@ -47,7 +40,7 @@
 #define PROTOCOL_MAJOR_1	1
 #define PROTOCOL_MINOR_1	5
 
-/* We support both SSH1 and SSH2 */
+/* We support only SSH2 */
 #define PROTOCOL_MAJOR_2	2
 #define PROTOCOL_MINOR_2	0
 
@@ -98,8 +91,5 @@
 #define SSH_PRIVSEP_USER		"sshd"
 #endif
 
-/* Minimum modulus size (n) for RSA keys. */
-#define SSH_RSA_MINIMUM_MODULUS_SIZE	768
-
 /* Listen backlog for sshd, ssh-agent and forwarding sockets */
 #define SSH_LISTEN_BACKLOG		128
diff --git a/ssh1.h b/ssh1.h
deleted file mode 100644
index 6a05c47..0000000
--- a/ssh1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $OpenBSD: ssh1.h,v 1.7 2016/05/04 14:22:33 markus Exp $ */
-
-/*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- *                    All rights reserved
- *
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose.  Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
- */
-
-/*
- * Definition of message types.  New values can be added, but old values
- * should not be removed or without careful consideration of the consequences
- * for compatibility.  The maximum value is 254; value 255 is reserved for
- * future extension.
- */
-/* Ranges */
-#define SSH_MSG_MIN				1
-#define SSH_MSG_MAX				254
-/* Message name */			/* msg code */	/* arguments */
-#define SSH_MSG_DISCONNECT			1	/* cause (string) */
-#define SSH_SMSG_PUBLIC_KEY			2	/* ck,msk,srvk,hostk */
-#define SSH_CMSG_SESSION_KEY			3	/* key (BIGNUM) */
-#define SSH_CMSG_USER				4	/* user (string) */
-#define SSH_CMSG_AUTH_RHOSTS			5	/* user (string) */
-#define SSH_CMSG_AUTH_RSA			6	/* modulus (BIGNUM) */
-#define SSH_SMSG_AUTH_RSA_CHALLENGE		7	/* int (BIGNUM) */
-#define SSH_CMSG_AUTH_RSA_RESPONSE		8	/* int (BIGNUM) */
-#define SSH_CMSG_AUTH_PASSWORD			9	/* pass (string) */
-#define SSH_CMSG_REQUEST_PTY			10	/* TERM, tty modes */
-#define SSH_CMSG_WINDOW_SIZE			11	/* row,col,xpix,ypix */
-#define SSH_CMSG_EXEC_SHELL			12	/* */
-#define SSH_CMSG_EXEC_CMD			13	/* cmd (string) */
-#define SSH_SMSG_SUCCESS			14	/* */
-#define SSH_SMSG_FAILURE			15	/* */
-#define SSH_CMSG_STDIN_DATA			16	/* data (string) */
-#define SSH_SMSG_STDOUT_DATA			17	/* data (string) */
-#define SSH_SMSG_STDERR_DATA			18	/* data (string) */
-#define SSH_CMSG_EOF				19	/* */
-#define SSH_SMSG_EXITSTATUS			20	/* status (int) */
-#define SSH_MSG_CHANNEL_OPEN_CONFIRMATION	21	/* channel (int) */
-#define SSH_MSG_CHANNEL_OPEN_FAILURE		22	/* channel (int) */
-#define SSH_MSG_CHANNEL_DATA			23	/* ch,data (int,str) */
-#define SSH_MSG_CHANNEL_CLOSE			24	/* channel (int) */
-#define SSH_MSG_CHANNEL_CLOSE_CONFIRMATION	25	/* channel (int) */
-/*      SSH_CMSG_X11_REQUEST_FORWARDING		26	   OBSOLETE */
-#define SSH_SMSG_X11_OPEN			27	/* channel (int) */
-#define SSH_CMSG_PORT_FORWARD_REQUEST		28	/* p,host,hp (i,s,i) */
-#define SSH_MSG_PORT_OPEN			29	/* ch,h,p (i,s,i) */
-#define SSH_CMSG_AGENT_REQUEST_FORWARDING	30	/* */
-#define SSH_SMSG_AGENT_OPEN			31	/* port (int) */
-#define SSH_MSG_IGNORE				32	/* string */
-#define SSH_CMSG_EXIT_CONFIRMATION		33	/* */
-#define SSH_CMSG_X11_REQUEST_FORWARDING		34	/* proto,data (s,s) */
-#define SSH_CMSG_AUTH_RHOSTS_RSA		35	/* user,mod (s,mpi) */
-#define SSH_MSG_DEBUG				36	/* string */
-#define SSH_CMSG_REQUEST_COMPRESSION		37	/* level 1-9 (int) */
-#define SSH_CMSG_MAX_PACKET_SIZE		38	/* size 4k-1024k (int) */
-#define SSH_CMSG_AUTH_TIS			39	/* we use this for s/key */
-#define SSH_SMSG_AUTH_TIS_CHALLENGE		40	/* challenge (string) */
-#define SSH_CMSG_AUTH_TIS_RESPONSE		41	/* response (string) */
-#define SSH_CMSG_AUTH_KERBEROS			42	/* (KTEXT) */
-#define SSH_SMSG_AUTH_KERBEROS_RESPONSE		43	/* (KTEXT) */
-#define SSH_CMSG_HAVE_KERBEROS_TGT		44	/* credentials (s) */
-#define SSH_CMSG_HAVE_AFS_TOKEN			65	/* token (s) */
-
-/* protocol version 1.5 overloads some version 1.3 message types */
-#define SSH_MSG_CHANNEL_INPUT_EOF	SSH_MSG_CHANNEL_CLOSE
-#define SSH_MSG_CHANNEL_OUTPUT_CLOSE	SSH_MSG_CHANNEL_CLOSE_CONFIRMATION
-
-/*
- * Authentication methods.  New types can be added, but old types should not
- * be removed for compatibility.  The maximum allowed value is 31.
- */
-#define SSH_AUTH_RHOSTS		1
-#define SSH_AUTH_RSA		2
-#define SSH_AUTH_PASSWORD	3
-#define SSH_AUTH_RHOSTS_RSA	4
-#define SSH_AUTH_TIS		5
-#define SSH_AUTH_KERBEROS	6
-#define SSH_PASS_KERBEROS_TGT	7
-				/* 8 to 15 are reserved */
-#define SSH_PASS_AFS_TOKEN	21
-
-/* Protocol flags.  These are bit masks. */
-#define SSH_PROTOFLAG_SCREEN_NUMBER	1	/* X11 forwarding includes screen */
-#define SSH_PROTOFLAG_HOST_IN_FWD_OPEN	2	/* forwarding opens contain host */
diff --git a/ssh_api.c b/ssh_api.c
index 2a9f149..c84b4e7 100644
--- a/ssh_api.c
+++ b/ssh_api.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh_api.c,v 1.7 2016/05/04 14:22:33 markus Exp $ */
+/* $OpenBSD: ssh_api.c,v 1.8 2017/04/30 23:13:25 djm Exp $ */
 /*
  * Copyright (c) 2012 Markus Friedl.  All rights reserved.
  *
@@ -371,7 +371,6 @@
 	}
 	if (remote_major != 2)
 		return SSH_ERR_PROTOCOL_MISMATCH;
-	enable_compat20();
 	chop(buf);
 	debug("Remote version string %.100s", buf);
 	if ((*bannerp = strdup(buf)) == NULL)
diff --git a/ssh_api.h b/ssh_api.h
index 642acd5..584f896 100644
--- a/ssh_api.h
+++ b/ssh_api.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh_api.h,v 1.1 2015/01/19 20:30:23 markus Exp $ */
+/* $OpenBSD: ssh_api.h,v 1.2 2018/04/10 00:10:49 djm Exp $ */
 /*
  * Copyright (c) 2012 Markus Friedl.  All rights reserved.
  *
@@ -81,7 +81,7 @@
  * ssh_packet_next() sets typep if there is no new packet available.
  * in this case the caller must fill the input byte-stream by passing
  * the data received over network to ssh_input_append().
- * additinally, the caller needs to send the resulting output
+ * additionally, the caller needs to send the resulting output
  * byte-stream back over the network. otherwise the key exchange
  * would not proceed. the output byte-stream is accessed through
  * ssh_output_ptr().
diff --git a/ssh_config b/ssh_config
index 90fb63f..c12f5ef 100644
--- a/ssh_config
+++ b/ssh_config
@@ -1,4 +1,4 @@
-#	$OpenBSD: ssh_config,v 1.30 2016/02/20 23:06:23 sobrado Exp $
+#	$OpenBSD: ssh_config,v 1.33 2017/05/07 23:12:57 djm Exp $
 
 # This is the ssh client system-wide configuration file.  See
 # ssh_config(5) for more information.  This file provides defaults for
@@ -20,8 +20,6 @@
 # Host *
 #   ForwardAgent no
 #   ForwardX11 no
-#   RhostsRSAAuthentication no
-#   RSAAuthentication yes
 #   PasswordAuthentication yes
 #   HostbasedAuthentication no
 #   GSSAPIAuthentication no
@@ -31,16 +29,14 @@
 #   AddressFamily any
 #   ConnectTimeout 0
 #   StrictHostKeyChecking ask
-#   IdentityFile ~/.ssh/identity
 #   IdentityFile ~/.ssh/id_rsa
 #   IdentityFile ~/.ssh/id_dsa
 #   IdentityFile ~/.ssh/id_ecdsa
 #   IdentityFile ~/.ssh/id_ed25519
 #   Port 22
 #   Protocol 2
-#   Cipher 3des
-#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
-#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
+#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
+#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com
 #   EscapeChar ~
 #   Tunnel no
 #   TunnelDevice any:any
diff --git a/ssh_config.5 b/ssh_config.5
index 532745b..f499396 100644
--- a/ssh_config.5
+++ b/ssh_config.5
@@ -33,16 +33,13 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $OpenBSD: ssh_config.5,v 1.242 2017/02/27 14:30:33 jmc Exp $
-.Dd $Mdocdate: February 27 2017 $
+.\" $OpenBSD: ssh_config.5,v 1.281 2018/07/23 19:02:49 kn Exp $
+.Dd $Mdocdate: July 23 2018 $
 .Dt SSH_CONFIG 5
 .Os
 .Sh NAME
 .Nm ssh_config
 .Nd OpenSSH SSH client configuration files
-.Sh SYNOPSIS
-.Nm ~/.ssh/config
-.Nm /etc/ssh/ssh_config
 .Sh DESCRIPTION
 .Xr ssh 1
 obtains configuration data from the following sources in
@@ -261,10 +258,9 @@
 Use the specified address on the local machine as the source address of
 the connection.
 Only useful on systems with more than one address.
-Note that this option does not work if
-.Cm UsePrivilegedPort
-is set to
-.Cm yes .
+.It Cm BindInterface
+Use the address of the specified interface on the local machine as the
+source address of the connection.
 .It Cm CanonicalDomains
 When
 .Cm CanonicalizeHostname
@@ -391,25 +387,8 @@
 If the option is set to
 .Cm no ,
 the check will not be executed.
-.It Cm Cipher
-Specifies the cipher to use for encrypting the session
-in protocol version 1.
-Currently,
-.Cm blowfish ,
-.Cm 3des
-(the default),
-and
-.Cm des
-are supported,
-though
-.Cm des
-is only supported in the
-.Xr ssh 1
-client for interoperability with legacy protocol 1 implementations;
-its use is strongly discouraged due to cryptographic weaknesses.
 .It Cm Ciphers
-Specifies the ciphers allowed for protocol version 2
-in order of preference.
+Specifies the ciphers allowed and their order of preference.
 Multiple ciphers must be comma-separated.
 If the specified value begins with a
 .Sq +
@@ -431,11 +410,6 @@
 aes256-ctr
 aes128-gcm@openssh.com
 aes256-gcm@openssh.com
-arcfour
-arcfour128
-arcfour256
-blowfish-cbc
-cast128-cbc
 chacha20-poly1305@openssh.com
 .Ed
 .Pp
@@ -443,8 +417,7 @@
 .Bd -literal -offset indent
 chacha20-poly1305@openssh.com,
 aes128-ctr,aes192-ctr,aes256-ctr,
-aes128-gcm@openssh.com,aes256-gcm@openssh.com,
-aes128-cbc,aes192-cbc,aes256-cbc
+aes128-gcm@openssh.com,aes256-gcm@openssh.com
 .Ed
 .Pp
 The list of available ciphers may also be obtained using
@@ -472,13 +445,6 @@
 or
 .Cm no
 (the default).
-.It Cm CompressionLevel
-Specifies the compression level to use if compression is enabled.
-The argument must be an integer from 1 (fast) to 9 (slow, best).
-The default level is 6, which is good for most applications.
-The meaning of the values is the same as in
-.Xr gzip 1 .
-Note that this option applies to protocol version 1 only.
 .It Cm ConnectionAttempts
 Specifies the number of tries (one per second) to make before exiting.
 The argument must be an integer.
@@ -783,7 +749,7 @@
 (the default).
 .It Cm HostbasedKeyTypes
 Specifies the key types that will be used for hostbased authentication
-as a comma-separated pattern list.
+as a comma-separated list of patterns.
 Alternately if the specified value begins with a
 .Sq +
 character, then the specified key types will be appended to the default set
@@ -798,9 +764,10 @@
 ecdsa-sha2-nistp384-cert-v01@openssh.com,
 ecdsa-sha2-nistp521-cert-v01@openssh.com,
 ssh-ed25519-cert-v01@openssh.com,
+rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,
 ssh-rsa-cert-v01@openssh.com,
 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
-ssh-ed25519,ssh-rsa
+ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
 .Ed
 .Pp
 The
@@ -825,9 +792,10 @@
 ecdsa-sha2-nistp384-cert-v01@openssh.com,
 ecdsa-sha2-nistp521-cert-v01@openssh.com,
 ssh-ed25519-cert-v01@openssh.com,
+rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,
 ssh-rsa-cert-v01@openssh.com,
 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
-ssh-ed25519,ssh-rsa
+ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
 .Ed
 .Pp
 If hostkeys are known for the destination host then this default is modified
@@ -838,7 +806,7 @@
 .It Cm HostKeyAlias
 Specifies an alias that should be used instead of the
 real host name when looking up or saving the host key
-in the host key database files.
+in the host key database files and when validating host certificates.
 This option is useful for tunneling SSH connections
 or for multiple servers running on a single host.
 .It Cm HostName
@@ -902,14 +870,11 @@
 Specifies a file from which the user's DSA, ECDSA, Ed25519 or RSA authentication
 identity is read.
 The default is
-.Pa ~/.ssh/identity
-for protocol version 1, and
 .Pa ~/.ssh/id_dsa ,
 .Pa ~/.ssh/id_ecdsa ,
 .Pa ~/.ssh/id_ed25519
 and
-.Pa ~/.ssh/id_rsa
-for protocol version 2.
+.Pa ~/.ssh/id_rsa .
 Additionally, any identities represented by the authentication agent
 will be used for authentication unless
 .Cm IdentitiesOnly
@@ -961,7 +926,7 @@
 .It Cm Include
 Include the specified configuration file(s).
 Multiple pathnames may be specified and each pathname may contain
-.Xr glob 3
+.Xr glob 7
 wildcards and, for user configurations, shell-like
 .Sq ~
 references to user home directories.
@@ -1004,15 +969,19 @@
 .Cm lowdelay ,
 .Cm throughput ,
 .Cm reliability ,
-or a numeric value.
+a numeric value, or
+.Cm none
+to use the operating system default.
 This option may take one or two arguments, separated by whitespace.
 If one argument is specified, it is used as the packet class unconditionally.
 If two values are specified, the first is automatically selected for
 interactive sessions and the second for non-interactive sessions.
 The default is
-.Cm lowdelay
+.Cm af21
+(Low-Latency Data)
 for interactive sessions and
-.Cm throughput
+.Cm cs1
+(Lower Effort)
 for non-interactive sessions.
 .It Cm KbdInteractiveAuthentication
 Specifies whether to use keyboard-interactive authentication.
@@ -1028,10 +997,9 @@
 The methods available vary depending on what the server supports.
 For an OpenSSH server,
 it may be zero or more of:
-.Cm bsdauth ,
-.Cm pam ,
+.Cm bsdauth
 and
-.Cm skey .
+.Cm pam .
 .It Cm KexAlgorithms
 Specifies the available KEX (Key Exchange) algorithms.
 Multiple algorithms must be comma-separated.
@@ -1048,7 +1016,10 @@
 curve25519-sha256,curve25519-sha256@libssh.org,
 ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,
 diffie-hellman-group-exchange-sha256,
+diffie-hellman-group16-sha512,
+diffie-hellman-group18-sha512,
 diffie-hellman-group-exchange-sha1,
+diffie-hellman-group14-sha256,
 diffie-hellman-group14-sha1
 .Ed
 .Pp
@@ -1140,10 +1111,7 @@
 The list of available MAC algorithms may also be obtained using
 .Qq ssh -Q mac .
 .It Cm NoHostAuthenticationForLocalhost
-This option can be used if the home directory is shared across machines.
-In this case localhost will refer to a different machine on each of
-the machines and the user will get many warnings about changed host keys.
-However, this option disables host authentication for localhost.
+Disable host authentication for localhost (loopback addresses).
 The argument to this keyword must be
 .Cm yes
 or
@@ -1192,21 +1160,6 @@
 gssapi-with-mic,hostbased,publickey,
 keyboard-interactive,password
 .Ed
-.It Cm Protocol
-Specifies the protocol versions
-.Xr ssh 1
-should support in order of preference.
-The possible values are 1 and 2.
-Multiple versions must be comma-separated.
-When this option is set to
-.Cm 2,1
-.Nm ssh
-will try version 2 and fall back to version 1
-if version 2 is not available.
-The default is version 2.
-Protocol 1 suffers from a number of cryptographic weaknesses and should
-not be used.
-It is only offered to support legacy devices.
 .It Cm ProxyCommand
 Specifies the command to use to connect to the server.
 The command
@@ -1246,13 +1199,14 @@
 ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p
 .Ed
 .It Cm ProxyJump
-Specifies one or more jump proxies as
+Specifies one or more jump proxies as either
 .Xo
 .Sm off
 .Op Ar user No @
 .Ar host
 .Op : Ns Ar port
 .Sm on
+or an ssh URI
 .Xc .
 Multiple proxies may be separated by comma characters and will be visited
 sequentially.
@@ -1279,7 +1233,7 @@
 .Cm no .
 .It Cm PubkeyAcceptedKeyTypes
 Specifies the key types that will be used for public key authentication
-as a comma-separated pattern list.
+as a comma-separated list of patterns.
 Alternately if the specified value begins with a
 .Sq +
 character, then the key types after it will be appended to the default
@@ -1294,9 +1248,10 @@
 ecdsa-sha2-nistp384-cert-v01@openssh.com,
 ecdsa-sha2-nistp521-cert-v01@openssh.com,
 ssh-ed25519-cert-v01@openssh.com,
+rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,
 ssh-rsa-cert-v01@openssh.com,
 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
-ssh-ed25519,ssh-rsa
+ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
 .Ed
 .Pp
 The list of available key types may also be obtained using
@@ -1334,15 +1289,31 @@
 .Cm default none ,
 which means that rekeying is performed after the cipher's default amount
 of data has been sent or received and no time based rekeying is done.
+.It Cm RemoteCommand
+Specifies a command to execute on the remote machine after successfully
+connecting to the server.
+The command string extends to the end of the line, and is executed with
+the user's shell.
+Arguments to
+.Cm RemoteCommand
+accept the tokens described in the
+.Sx TOKENS
+section.
 .It Cm RemoteForward
 Specifies that a TCP port on the remote machine be forwarded over
-the secure channel to the specified host and port from the local machine.
+the secure channel.
+The remote port may either be forwarded to a specified host and port
+from the local machine, or may act as a SOCKS 4/5 proxy that allows a remote
+client to connect to arbitrary destinations from the local machine.
 The first argument must be
 .Sm off
 .Oo Ar bind_address : Oc Ar port
 .Sm on
-and the second argument must be
-.Ar host : Ns Ar hostport .
+If forwarding to a specific destination then the second argument must be
+.Ar host : Ns Ar hostport ,
+otherwise if no destination argument is specified then the remote forwarding
+will be established as a SOCKS proxy.
+.Pp
 IPv6 addresses can be specified by enclosing addresses in square brackets.
 Multiple forwardings may be specified, and additional
 forwardings can be given on the command line.
@@ -1397,28 +1368,6 @@
 .Xr ssh-keygen 1 .
 For more information on KRLs, see the KEY REVOCATION LISTS section in
 .Xr ssh-keygen 1 .
-.It Cm RhostsRSAAuthentication
-Specifies whether to try rhosts based authentication with RSA host
-authentication.
-The argument must be
-.Cm yes
-or
-.Cm no
-(the default).
-This option applies to protocol version 1 only and requires
-.Xr ssh 1
-to be setuid root.
-.It Cm RSAAuthentication
-Specifies whether to try RSA authentication.
-The argument to this keyword must be
-.Cm yes
-(the default)
-or
-.Cm no .
-RSA authentication will only be
-attempted if the identity file exists, or an authentication agent is
-running.
-Note that this option applies to protocol version 1 only.
 .It Cm SendEnv
 Specifies what variables from the local
 .Xr environ 7
@@ -1439,11 +1388,16 @@
 across multiple
 .Cm SendEnv
 directives.
-The default is not to send any environment variables.
 .Pp
 See
 .Sx PATTERNS
 for more information on patterns.
+.Pp
+It is possible to clear previously set
+.Cm SendEnv
+variable names by prefixing patterns with
+.Pa - .
+The default is not to send any environment variables.
 .It Cm ServerAliveCountMax
 Sets the number of server alive messages (see below) which may be
 sent without
@@ -1478,6 +1432,12 @@
 channel to request a response from the server.
 The default
 is 0, indicating that these messages will not be sent to the server.
+.It Cm SetEnv
+Directly specify one or more environment variables and their contents to
+be sent to the server.
+Similarly to
+.Cm SendEnv ,
+the server must be prepared to accept the environment variable.
 .It Cm StreamLocalBindMask
 Sets the octal file creation mode mask
 .Pq umask
@@ -1511,17 +1471,26 @@
 will never automatically add host keys to the
 .Pa ~/.ssh/known_hosts
 file, and refuses to connect to hosts whose host key has changed.
-This provides maximum protection against trojan horse attacks,
+This provides maximum protection against man-in-the-middle (MITM) attacks,
 though it can be annoying when the
 .Pa /etc/ssh/ssh_known_hosts
 file is poorly maintained or when connections to new hosts are
 frequently made.
 This option forces the user to manually
 add all new hosts.
+.Pp
 If this flag is set to
-.Cm no ,
-ssh will automatically add new host keys to the
-user known hosts files.
+.Dq accept-new
+then ssh will automatically add new host keys to the user
+known hosts files, but will not permit connections to hosts with
+changed host keys.
+If this flag is set to
+.Dq no
+or
+.Dq off ,
+ssh will automatically add new host keys to the user known hosts files
+and allow connections to hosts with changed hostkeys to proceed,
+subject to some restrictions.
 If this flag is set to
 .Cm ask
 (the default),
@@ -1531,6 +1500,12 @@
 ssh will refuse to connect to hosts whose host key has changed.
 The host keys of
 known hosts will be verified automatically in all cases.
+.It Cm SyslogFacility
+Gives the facility code that is used when logging messages from
+.Xr ssh 1 .
+The possible values are: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2,
+LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.
+The default is USER.
 .It Cm TCPKeepAlive
 Specifies whether the system should send TCP keepalive messages to the
 other side.
@@ -1548,6 +1523,9 @@
 .Pp
 To disable TCP keepalive messages, the value should be set to
 .Cm no .
+See also
+.Cm ServerAliveInterval
+for protocol-level keepalives.
 .It Cm Tunnel
 Request
 .Xr tun 4
@@ -1616,22 +1594,6 @@
 from OpenSSH 6.8 and greater support the
 .Qq hostkeys@openssh.com
 protocol extension used to inform the client of all the server's hostkeys.
-.It Cm UsePrivilegedPort
-Specifies whether to use a privileged port for outgoing connections.
-The argument must be
-.Cm yes
-or
-.Cm no
-(the default).
-If set to
-.Cm yes ,
-.Xr ssh 1
-must be setuid root.
-Note that this option must be set to
-.Cm yes
-for
-.Cm RhostsRSAAuthentication
-with older servers.
 .It Cm User
 Specifies the user to log in as.
 This can be useful when a different user name is used on different machines.
@@ -1718,6 +1680,18 @@
 the following entry (in authorized_keys) could be used:
 .Pp
 .Dl from=\&"!*.dialup.example.com,*.example.com\&"
+.Pp
+Note that a negated match will never produce a positive result by itself.
+For example, attempting to match
+.Qq host3
+against the following pattern-list will fail:
+.Pp
+.Dl from=\&"!host1,!host2\&"
+.Pp
+The solution here is to include a term that will yield a positive match,
+such as a wildcard:
+.Pp
+.Dl from=\&"!host1,!host2,*\&"
 .Sh TOKENS
 Arguments to some keywords can make use of tokens,
 which are expanded at runtime:
@@ -1727,7 +1701,7 @@
 A literal
 .Sq % .
 .It \&%C
-Shorthand for %l%h%p%r.
+Hash of %l%h%p%r.
 .It %d
 Local user's home directory.
 .It %h
@@ -1744,15 +1718,24 @@
 The remote port.
 .It %r
 The remote username.
+.It \&%T
+The local
+.Xr tun 4
+or
+.Xr tap 4
+network interface assigned if
+tunnel forwarding was requested, or
+.Qq NONE
+otherwise.
 .It %u
 The local username.
 .El
 .Pp
 .Cm Match exec
-accepts the tokens %%, %h, %L, %l, %n, %p, %r, and %u.
+accepts the tokens %%, %h, %i, %L, %l, %n, %p, %r, and %u.
 .Pp
 .Cm CertificateFile
-accepts the tokens %%, %d, %h, %l, %r, and %u.
+accepts the tokens %%, %d, %h, %i, %l, %r, and %u.
 .Pp
 .Cm ControlPath
 accepts the tokens %%, %C, %h, %i, %L, %l, %n, %p, %r, and %u.
@@ -1763,13 +1746,16 @@
 .Cm IdentityAgent
 and
 .Cm IdentityFile
-accept the tokens %%, %d, %h, %l, %r, and %u.
+accept the tokens %%, %d, %h, %i, %l, %r, and %u.
 .Pp
 .Cm LocalCommand
-accepts the tokens %%, %C, %d, %h, %l, %n, %p, %r, and %u.
+accepts the tokens %%, %C, %d, %h, %i, %l, %n, %p, %r, %T, and %u.
 .Pp
 .Cm ProxyCommand
 accepts the tokens %%, %h, %p, and %r.
+.Pp
+.Cm RemoteCommand
+accepts the tokens %%, %C, %d, %h, %i, %l, %n, %p, %r, and %u.
 .Sh FILES
 .Bl -tag -width Ds
 .It Pa ~/.ssh/config
diff --git a/sshbuf-getput-basic.c b/sshbuf-getput-basic.c
index 74c49be..5064825 100644
--- a/sshbuf-getput-basic.c
+++ b/sshbuf-getput-basic.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: sshbuf-getput-basic.c,v 1.6 2016/06/16 11:00:17 dtucker Exp $	*/
+/*	$OpenBSD: sshbuf-getput-basic.c,v 1.7 2017/06/01 04:51:58 djm Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller
  *
@@ -365,7 +365,7 @@
 int
 sshbuf_put_cstring(struct sshbuf *buf, const char *v)
 {
-	return sshbuf_put_string(buf, (u_char *)v, v == NULL ? 0 : strlen(v));
+	return sshbuf_put_string(buf, v, v == NULL ? 0 : strlen(v));
 }
 
 int
diff --git a/sshbuf.c b/sshbuf.c
index cbf7ed4..20ddf9e 100644
--- a/sshbuf.c
+++ b/sshbuf.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: sshbuf.c,v 1.8 2016/11/25 23:22:04 djm Exp $	*/
+/*	$OpenBSD: sshbuf.c,v 1.12 2018/07/09 21:56:06 markus Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller
  *
@@ -36,7 +36,6 @@
 	    (!buf->readonly && buf->d != buf->cd) ||
 	    buf->refcount < 1 || buf->refcount > SSHBUF_REFS_MAX ||
 	    buf->cd == NULL ||
-	    (buf->dont_free && (buf->readonly || buf->parent != NULL)) ||
 	    buf->max_size > SSHBUF_SIZE_MAX ||
 	    buf->alloc > buf->max_size ||
 	    buf->size > buf->alloc ||
@@ -132,23 +131,8 @@
 }
 
 void
-sshbuf_init(struct sshbuf *ret)
-{
-	explicit_bzero(ret, sizeof(*ret));
-	ret->alloc = SSHBUF_SIZE_INIT;
-	ret->max_size = SSHBUF_SIZE_MAX;
-	ret->readonly = 0;
-	ret->dont_free = 1;
-	ret->refcount = 1;
-	if ((ret->cd = ret->d = calloc(1, ret->alloc)) == NULL)
-		ret->alloc = 0;
-}
-
-void
 sshbuf_free(struct sshbuf *buf)
 {
-	int dont_free = 0;
-
 	if (buf == NULL)
 		return;
 	/*
@@ -173,14 +157,12 @@
 	buf->refcount--;
 	if (buf->refcount > 0)
 		return;
-	dont_free = buf->dont_free;
 	if (!buf->readonly) {
 		explicit_bzero(buf->d, buf->alloc);
 		free(buf->d);
 	}
 	explicit_bzero(buf, sizeof(*buf));
-	if (!dont_free)
-		free(buf);
+	free(buf);
 }
 
 void
@@ -193,15 +175,16 @@
 		buf->off = buf->size;
 		return;
 	}
-	if (sshbuf_check_sanity(buf) == 0)
-		explicit_bzero(buf->d, buf->alloc);
+	(void) sshbuf_check_sanity(buf);
 	buf->off = buf->size = 0;
 	if (buf->alloc != SSHBUF_SIZE_INIT) {
-		if ((d = realloc(buf->d, SSHBUF_SIZE_INIT)) != NULL) {
+		if ((d = recallocarray(buf->d, buf->alloc, SSHBUF_SIZE_INIT,
+		    1)) != NULL) {
 			buf->cd = buf->d = d;
 			buf->alloc = SSHBUF_SIZE_INIT;
 		}
 	}
+	explicit_bzero(buf->d, SSHBUF_SIZE_INIT);
 }
 
 size_t
@@ -253,9 +236,8 @@
 			rlen = ROUNDUP(buf->size, SSHBUF_SIZE_INC);
 		if (rlen > max_size)
 			rlen = max_size;
-		explicit_bzero(buf->d + buf->size, buf->alloc - buf->size);
 		SSHBUF_DBG(("new alloc = %zu", rlen));
-		if ((dp = realloc(buf->d, rlen)) == NULL)
+		if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL)
 			return SSH_ERR_ALLOC_FAIL;
 		buf->cd = buf->d = dp;
 		buf->alloc = rlen;
@@ -344,7 +326,7 @@
 	if (rlen > buf->max_size)
 		rlen = buf->alloc + need;
 	SSHBUF_DBG(("adjusted rlen %zu", rlen));
-	if ((dp = realloc(buf->d, rlen)) == NULL) {
+	if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL) {
 		SSHBUF_DBG(("realloc fail"));
 		return SSH_ERR_ALLOC_FAIL;
 	}
@@ -391,6 +373,9 @@
 	if (len > sshbuf_len(buf))
 		return SSH_ERR_MESSAGE_INCOMPLETE;
 	buf->off += len;
+	/* deal with empty buffer */
+	if (buf->off == buf->size)
+		buf->off = buf->size = 0;
 	SSHBUF_TELL("done");
 	return 0;
 }
diff --git a/sshbuf.h b/sshbuf.h
index 1ac4b8c..a43598c 100644
--- a/sshbuf.h
+++ b/sshbuf.h
@@ -1,4 +1,4 @@
-/*	$OpenBSD: sshbuf.h,v 1.8 2016/11/25 23:22:04 djm Exp $	*/
+/*	$OpenBSD: sshbuf.h,v 1.11 2018/07/09 21:56:06 markus Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller
  *
@@ -50,15 +50,6 @@
 	struct sshbuf *parent;	/* If child, pointer to parent */
 };
 
-#ifndef SSHBUF_NO_DEPREACTED
-/*
- * NB. Please do not use sshbuf_init() in new code. Please use sshbuf_new()
- * instead. sshbuf_init() is deprectated and will go away soon (it is
- * only included to allow compat with buffer_* in OpenSSH)
- */
-void sshbuf_init(struct sshbuf *buf);
-#endif
-
 /*
  * Create a new sshbuf buffer.
  * Returns pointer to buffer on success, or NULL on allocation failure.
@@ -211,6 +202,7 @@
 /* Another variant: "peeks" into the buffer without modifying it */
 int	sshbuf_peek_string_direct(const struct sshbuf *buf, const u_char **valp,
 	    size_t *lenp);
+/* XXX peek_u8 / peek_u32 */
 
 /*
  * Functions to extract or store SSH wire encoded bignums and elliptic
diff --git a/sshconnect.c b/sshconnect.c
index 0d8e763..78813c1 100644
--- a/sshconnect.c
+++ b/sshconnect.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect.c,v 1.272 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: sshconnect.c,v 1.304 2018/07/27 05:34:42 dtucker Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -23,6 +23,7 @@
 # include <sys/time.h>
 #endif
 
+#include <net/if.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
@@ -34,23 +35,26 @@
 #include <paths.h>
 #endif
 #include <pwd.h>
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
 #include <signal.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#ifdef HAVE_IFADDRS_H
+# include <ifaddrs.h>
+#endif
 
 #include "xmalloc.h"
-#include "key.h"
 #include "hostfile.h"
 #include "ssh.h"
-#include "rsa.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "packet.h"
-#include "uidswap.h"
 #include "compat.h"
-#include "key.h"
+#include "sshkey.h"
 #include "sshconnect.h"
 #include "hostfile.h"
 #include "log.h"
@@ -67,7 +71,7 @@
 
 char *client_version_string = NULL;
 char *server_version_string = NULL;
-Key *previous_host_key = NULL;
+struct sshkey *previous_host_key = NULL;
 
 static int matching_host_key_dns = 0;
 
@@ -76,11 +80,9 @@
 /* import */
 extern Options options;
 extern char *__progname;
-extern uid_t original_real_uid;
-extern uid_t original_effective_uid;
 
-static int show_other_keys(struct hostkeys *, Key *);
-static void warn_changed_key(Key *);
+static int show_other_keys(struct hostkeys *, struct sshkey *);
+static void warn_changed_key(struct sshkey *);
 
 /* Expand a proxy command */
 static char *
@@ -102,7 +104,7 @@
  * a connected fd back to us.
  */
 static int
-ssh_proxy_fdpass_connect(const char *host, u_short port,
+ssh_proxy_fdpass_connect(struct ssh *ssh, const char *host, u_short port,
     const char *proxy_command)
 {
 	char *command_string;
@@ -125,9 +127,6 @@
 	if ((pid = fork()) == 0) {
 		char *argv[10];
 
-		/* Child.  Permanently give up superuser privileges. */
-		permanently_drop_suid(original_real_uid);
-
 		close(sp[1]);
 		/* Redirect stdin and stdout. */
 		if (sp[0] != 0) {
@@ -173,7 +172,8 @@
 			fatal("Couldn't wait for child: %s", strerror(errno));
 
 	/* Set the connection file descriptors. */
-	packet_set_connection(sock, sock);
+	if (ssh_packet_set_connection(ssh, sock, sock) == NULL)
+		return -1; /* ssh_packet_set_connection logs error */
 
 	return 0;
 }
@@ -182,7 +182,8 @@
  * Connect to the given ssh server using a proxy command.
  */
 static int
-ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
+ssh_proxy_connect(struct ssh *ssh, const char *host, u_short port,
+    const char *proxy_command)
 {
 	char *command_string;
 	int pin[2], pout[2];
@@ -205,9 +206,6 @@
 	if ((pid = fork()) == 0) {
 		char *argv[10];
 
-		/* Child.  Permanently give up superuser privileges. */
-		permanently_drop_suid(original_real_uid);
-
 		/* Redirect stdin and stdout. */
 		close(pin[1]);
 		if (pin[0] != 0) {
@@ -249,9 +247,9 @@
 	free(command_string);
 
 	/* Set the connection file descriptors. */
-	packet_set_connection(pout[0], pin[1]);
+	if (ssh_packet_set_connection(ssh, pout[0], pin[1]) == NULL)
+		return -1; /* ssh_packet_set_connection logs error */
 
-	/* Indicate OK return */
 	return 0;
 }
 
@@ -266,14 +264,83 @@
 		kill(proxy_command_pid, SIGHUP);
 }
 
+#ifdef HAVE_IFADDRS_H
 /*
- * Creates a (possibly privileged) socket for use as the ssh connection.
+ * Search a interface address list (returned from getifaddrs(3)) for an
+ * address that matches the desired address family on the specified interface.
+ * Returns 0 and fills in *resultp and *rlenp on success. Returns -1 on failure.
  */
 static int
-ssh_create_socket(int privileged, struct addrinfo *ai)
+check_ifaddrs(const char *ifname, int af, const struct ifaddrs *ifaddrs,
+    struct sockaddr_storage *resultp, socklen_t *rlenp)
 {
-	int sock, r, gaierr;
+	struct sockaddr_in6 *sa6;
+	struct sockaddr_in *sa;
+	struct in6_addr *v6addr;
+	const struct ifaddrs *ifa;
+	int allow_local;
+
+	/*
+	 * Prefer addresses that are not loopback or linklocal, but use them
+	 * if nothing else matches.
+	 */
+	for (allow_local = 0; allow_local < 2; allow_local++) {
+		for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
+			if (ifa->ifa_addr == NULL || ifa->ifa_name == NULL ||
+			    (ifa->ifa_flags & IFF_UP) == 0 ||
+			    ifa->ifa_addr->sa_family != af ||
+			    strcmp(ifa->ifa_name, options.bind_interface) != 0)
+				continue;
+			switch (ifa->ifa_addr->sa_family) {
+			case AF_INET:
+				sa = (struct sockaddr_in *)ifa->ifa_addr;
+				if (!allow_local && sa->sin_addr.s_addr ==
+				    htonl(INADDR_LOOPBACK))
+					continue;
+				if (*rlenp < sizeof(struct sockaddr_in)) {
+					error("%s: v4 addr doesn't fit",
+					    __func__);
+					return -1;
+				}
+				*rlenp = sizeof(struct sockaddr_in);
+				memcpy(resultp, sa, *rlenp);
+				return 0;
+			case AF_INET6:
+				sa6 = (struct sockaddr_in6 *)ifa->ifa_addr;
+				v6addr = &sa6->sin6_addr;
+				if (!allow_local &&
+				    (IN6_IS_ADDR_LINKLOCAL(v6addr) ||
+				    IN6_IS_ADDR_LOOPBACK(v6addr)))
+					continue;
+				if (*rlenp < sizeof(struct sockaddr_in6)) {
+					error("%s: v6 addr doesn't fit",
+					    __func__);
+					return -1;
+				}
+				*rlenp = sizeof(struct sockaddr_in6);
+				memcpy(resultp, sa6, *rlenp);
+				return 0;
+			}
+		}
+	}
+	return -1;
+}
+#endif
+
+/*
+ * Creates a socket for use as the ssh connection.
+ */
+static int
+ssh_create_socket(struct addrinfo *ai)
+{
+	int sock, r;
+	struct sockaddr_storage bindaddr;
+	socklen_t bindaddrlen = 0;
 	struct addrinfo hints, *res = NULL;
+#ifdef HAVE_IFADDRS_H
+	struct ifaddrs *ifaddrs = NULL;
+#endif
+	char ntop[NI_MAXHOST];
 
 	sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
 	if (sock < 0) {
@@ -283,160 +350,162 @@
 	fcntl(sock, F_SETFD, FD_CLOEXEC);
 
 	/* Bind the socket to an alternative local IP address */
-	if (options.bind_address == NULL && !privileged)
+	if (options.bind_address == NULL && options.bind_interface == NULL)
 		return sock;
 
-	if (options.bind_address) {
+	if (options.bind_address != NULL) {
 		memset(&hints, 0, sizeof(hints));
 		hints.ai_family = ai->ai_family;
 		hints.ai_socktype = ai->ai_socktype;
 		hints.ai_protocol = ai->ai_protocol;
 		hints.ai_flags = AI_PASSIVE;
-		gaierr = getaddrinfo(options.bind_address, NULL, &hints, &res);
-		if (gaierr) {
+		if ((r = getaddrinfo(options.bind_address, NULL,
+		    &hints, &res)) != 0) {
 			error("getaddrinfo: %s: %s", options.bind_address,
-			    ssh_gai_strerror(gaierr));
-			close(sock);
-			return -1;
-		}
-	}
-	/*
-	 * If we are running as root and want to connect to a privileged
-	 * port, bind our own socket to a privileged port.
-	 */
-	if (privileged) {
-		PRIV_START;
-		r = bindresvport_sa(sock, res ? res->ai_addr : NULL);
-		PRIV_END;
-		if (r < 0) {
-			error("bindresvport_sa: af=%d %s", ai->ai_family,
-			    strerror(errno));
+			    ssh_gai_strerror(r));
 			goto fail;
 		}
-	} else {
-		if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) {
-			error("bind: %s: %s", options.bind_address,
-			    strerror(errno));
- fail:
-			close(sock);
-			freeaddrinfo(res);
-			return -1;
+		if (res == NULL) {
+			error("getaddrinfo: no addrs");
+			goto fail;
 		}
+		if (res->ai_addrlen > sizeof(bindaddr)) {
+			error("%s: addr doesn't fit", __func__);
+			goto fail;
+		}
+		memcpy(&bindaddr, res->ai_addr, res->ai_addrlen);
+		bindaddrlen = res->ai_addrlen;
+	} else if (options.bind_interface != NULL) {
+#ifdef HAVE_IFADDRS_H
+		if ((r = getifaddrs(&ifaddrs)) != 0) {
+			error("getifaddrs: %s: %s", options.bind_interface,
+			      strerror(errno));
+			goto fail;
+		}
+		bindaddrlen = sizeof(bindaddr);
+		if (check_ifaddrs(options.bind_interface, ai->ai_family,
+		    ifaddrs, &bindaddr, &bindaddrlen) != 0) {
+			logit("getifaddrs: %s: no suitable addresses",
+			      options.bind_interface);
+			goto fail;
+		}
+#else
+		error("BindInterface not supported on this platform.");
+#endif
 	}
+	if ((r = getnameinfo((struct sockaddr *)&bindaddr, bindaddrlen,
+	    ntop, sizeof(ntop), NULL, 0, NI_NUMERICHOST)) != 0) {
+		error("%s: getnameinfo failed: %s", __func__,
+		    ssh_gai_strerror(r));
+		goto fail;
+	}
+	if (bind(sock, (struct sockaddr *)&bindaddr, bindaddrlen) != 0) {
+		error("bind %s: %s", ntop, strerror(errno));
+		goto fail;
+	}
+	debug("%s: bound to %s", __func__, ntop);
+	/* success */
+	goto out;
+fail:
+	close(sock);
+	sock = -1;
+ out:
 	if (res != NULL)
 		freeaddrinfo(res);
+#ifdef HAVE_IFADDRS_H
+	if (ifaddrs != NULL)
+		freeifaddrs(ifaddrs);
+#endif
 	return sock;
 }
 
+/*
+ * Wait up to *timeoutp milliseconds for fd to be readable. Updates
+ * *timeoutp with time remaining.
+ * Returns 0 if fd ready or -1 on timeout or error (see errno).
+ */
+static int
+waitrfd(int fd, int *timeoutp)
+{
+	struct pollfd pfd;
+	struct timeval t_start;
+	int oerrno, r;
+
+	monotime_tv(&t_start);
+	pfd.fd = fd;
+	pfd.events = POLLIN;
+	for (; *timeoutp >= 0;) {
+		r = poll(&pfd, 1, *timeoutp);
+		oerrno = errno;
+		ms_subtract_diff(&t_start, timeoutp);
+		errno = oerrno;
+		if (r > 0)
+			return 0;
+		else if (r == -1 && errno != EAGAIN)
+			return -1;
+		else if (r == 0)
+			break;
+	}
+	/* timeout */
+	errno = ETIMEDOUT;
+	return -1;
+}
+
 static int
 timeout_connect(int sockfd, const struct sockaddr *serv_addr,
     socklen_t addrlen, int *timeoutp)
 {
-	fd_set *fdset;
-	struct timeval tv, t_start;
-	socklen_t optlen;
-	int optval, rc, result = -1;
+	int optval = 0;
+	socklen_t optlen = sizeof(optval);
 
-	gettimeofday(&t_start, NULL);
-
-	if (*timeoutp <= 0) {
-		result = connect(sockfd, serv_addr, addrlen);
-		goto done;
-	}
+	/* No timeout: just do a blocking connect() */
+	if (*timeoutp <= 0)
+		return connect(sockfd, serv_addr, addrlen);
 
 	set_nonblock(sockfd);
-	rc = connect(sockfd, serv_addr, addrlen);
-	if (rc == 0) {
+	if (connect(sockfd, serv_addr, addrlen) == 0) {
+		/* Succeeded already? */
 		unset_nonblock(sockfd);
-		result = 0;
-		goto done;
+		return 0;
+	} else if (errno != EINPROGRESS)
+		return -1;
+
+	if (waitrfd(sockfd, timeoutp) == -1)
+		return -1;
+
+	/* Completed or failed */
+	if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &optval, &optlen) == -1) {
+		debug("getsockopt: %s", strerror(errno));
+		return -1;
 	}
-	if (errno != EINPROGRESS) {
-		result = -1;
-		goto done;
+	if (optval != 0) {
+		errno = optval;
+		return -1;
 	}
-
-	fdset = xcalloc(howmany(sockfd + 1, NFDBITS),
-	    sizeof(fd_mask));
-	FD_SET(sockfd, fdset);
-	ms_to_timeval(&tv, *timeoutp);
-
-	for (;;) {
-#ifdef __Fuchsia__
-		rc = fuchsia_select(sockfd + 1, NULL, fdset, &tv);
-#else
-		rc = select(sockfd + 1, NULL, fdset, NULL, &tv);
-#endif
-		if (rc != -1 || errno != EINTR)
-			break;
-	}
-
-	switch (rc) {
-	case 0:
-		/* Timed out */
-		errno = ETIMEDOUT;
-		break;
-	case -1:
-		/* Select error */
-		debug("select: %s", strerror(errno));
-		break;
-	case 1:
-		/* Completed or failed */
-		optval = 0;
-		optlen = sizeof(optval);
-		if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &optval,
-		    &optlen) == -1) {
-			debug("getsockopt: %s", strerror(errno));
-			break;
-		}
-		if (optval != 0) {
-			errno = optval;
-			break;
-		}
-		result = 0;
-		unset_nonblock(sockfd);
-		break;
-	default:
-		/* Should not occur */
-		fatal("Bogus return (%d) from select()", rc);
-	}
-
-	free(fdset);
-
- done:
- 	if (result == 0 && *timeoutp > 0) {
-		ms_subtract_diff(&t_start, timeoutp);
-		if (*timeoutp <= 0) {
-			errno = ETIMEDOUT;
-			result = -1;
-		}
-	}
-
-	return (result);
+	unset_nonblock(sockfd);
+	return 0;
 }
 
 /*
  * Opens a TCP/IP connection to the remote server on the given host.
  * The address of the remote host will be returned in hostaddr.
- * If port is 0, the default port will be used.  If needpriv is true,
- * a privileged port will be allocated to make the connection.
- * This requires super-user privileges if needpriv is true.
+ * If port is 0, the default port will be used.
  * Connection_attempts specifies the maximum number of tries (one per
  * second).  If proxy_command is non-NULL, it specifies the command (with %h
  * and %p substituted for host and port, respectively) to use to contact
  * the daemon.
  */
 static int
-ssh_connect_direct(const char *host, struct addrinfo *aitop,
+ssh_connect_direct(struct ssh *ssh, const char *host, struct addrinfo *aitop,
     struct sockaddr_storage *hostaddr, u_short port, int family,
-    int connection_attempts, int *timeout_ms, int want_keepalive, int needpriv)
+    int connection_attempts, int *timeout_ms, int want_keepalive)
 {
 	int on = 1;
-	int sock = -1, attempt;
+	int oerrno, sock = -1, attempt;
 	char ntop[NI_MAXHOST], strport[NI_MAXSERV];
 	struct addrinfo *ai;
 
-	debug2("%s: needpriv %d", __func__, needpriv);
+	debug2("%s", __func__);
 	memset(ntop, 0, sizeof(ntop));
 	memset(strport, 0, sizeof(strport));
 
@@ -452,22 +521,28 @@
 		 */
 		for (ai = aitop; ai; ai = ai->ai_next) {
 			if (ai->ai_family != AF_INET &&
-			    ai->ai_family != AF_INET6)
+			    ai->ai_family != AF_INET6) {
+				errno = EAFNOSUPPORT;
 				continue;
+			}
 			if (getnameinfo(ai->ai_addr, ai->ai_addrlen,
 			    ntop, sizeof(ntop), strport, sizeof(strport),
 			    NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
+				oerrno = errno;
 				error("%s: getnameinfo failed", __func__);
+				errno = oerrno;
 				continue;
 			}
 			debug("Connecting to %.200s [%.100s] port %s.",
 				host, ntop, strport);
 
 			/* Create a socket for connecting. */
-			sock = ssh_create_socket(needpriv, ai);
-			if (sock < 0)
+			sock = ssh_create_socket(ai);
+			if (sock < 0) {
 				/* Any error is already output */
+				errno = 0;
 				continue;
+			}
 
 			if (timeout_connect(sock, ai->ai_addr, ai->ai_addrlen,
 			    timeout_ms) >= 0) {
@@ -475,10 +550,12 @@
 				memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen);
 				break;
 			} else {
+				oerrno = errno;
 				debug("connect to address %s port %s: %s",
 				    ntop, strport, strerror(errno));
 				close(sock);
 				sock = -1;
+				errno = oerrno;
 			}
 		}
 		if (sock != -1)
@@ -488,8 +565,8 @@
 	/* Return failure if we didn't get a successful connection. */
 	if (sock == -1) {
 		error("ssh: connect to host %s port %s: %s",
-		    host, strport, strerror(errno));
-		return (-1);
+		    host, strport, errno == 0 ? "failure" : strerror(errno));
+		return -1;
 	}
 
 	debug("Connection established.");
@@ -501,40 +578,38 @@
 		error("setsockopt SO_KEEPALIVE: %.100s", strerror(errno));
 
 	/* Set the connection. */
-	packet_set_connection(sock, sock);
+	if (ssh_packet_set_connection(ssh, sock, sock) == NULL)
+		return -1; /* ssh_packet_set_connection logs error */
 
-	return 0;
+        return 0;
 }
 
 int
-ssh_connect(const char *host, struct addrinfo *addrs,
+ssh_connect(struct ssh *ssh, const char *host, struct addrinfo *addrs,
     struct sockaddr_storage *hostaddr, u_short port, int family,
-    int connection_attempts, int *timeout_ms, int want_keepalive, int needpriv)
+    int connection_attempts, int *timeout_ms, int want_keepalive)
 {
 	if (options.proxy_command == NULL) {
-		return ssh_connect_direct(host, addrs, hostaddr, port, family,
-		    connection_attempts, timeout_ms, want_keepalive, needpriv);
+		return ssh_connect_direct(ssh, host, addrs, hostaddr, port,
+		    family, connection_attempts, timeout_ms, want_keepalive);
 	} else if (strcmp(options.proxy_command, "-") == 0) {
-		packet_set_connection(STDIN_FILENO, STDOUT_FILENO);
-		return 0; /* Always succeeds */
+		if ((ssh_packet_set_connection(ssh,
+		    STDIN_FILENO, STDOUT_FILENO)) == NULL)
+			return -1; /* ssh_packet_set_connection logs error */
+		return 0;
 	} else if (options.proxy_use_fdpass) {
-		return ssh_proxy_fdpass_connect(host, port,
+		return ssh_proxy_fdpass_connect(ssh, host, port,
 		    options.proxy_command);
 	}
-	return ssh_proxy_connect(host, port, options.proxy_command);
+	return ssh_proxy_connect(ssh, host, port, options.proxy_command);
 }
 
 static void
 send_client_banner(int connection_out, int minor1)
 {
 	/* Send our own protocol version identification. */
-	if (compat20) {
-		xasprintf(&client_version_string, "SSH-%d.%d-%.100s\r\n",
-		    PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION);
-	} else {
-		xasprintf(&client_version_string, "SSH-%d.%d-%.100s\n",
-		    PROTOCOL_MAJOR_1, minor1, SSH_VERSION);
-	}
+	xasprintf(&client_version_string, "SSH-%d.%d-%.100s\r\n",
+	    PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION);
 	if (atomicio(vwrite, connection_out, client_version_string,
 	    strlen(client_version_string)) != strlen(client_version_string))
 		fatal("write: %.100s", strerror(errno));
@@ -553,50 +628,27 @@
 	int remote_major, remote_minor, mismatch;
 	int connection_in = packet_get_connection_in();
 	int connection_out = packet_get_connection_out();
-	int minor1 = PROTOCOL_MINOR_1, client_banner_sent = 0;
 	u_int i, n;
 	size_t len;
-	int fdsetsz, remaining, rc;
-	struct timeval t_start, t_remaining;
-	fd_set *fdset;
+	int rc;
 
-	fdsetsz = howmany(connection_in + 1, NFDBITS) * sizeof(fd_mask);
-	fdset = xcalloc(1, fdsetsz);
-
-	/*
-	 * If we are SSH2-only then we can send the banner immediately and
-	 * save a round-trip.
-	 */
-	if (options.protocol == SSH_PROTO_2) {
-		enable_compat20();
-		send_client_banner(connection_out, 0);
-		client_banner_sent = 1;
-	}
+	send_client_banner(connection_out, 0);
 
 	/* Read other side's version identification. */
-	remaining = timeout_ms;
 	for (n = 0;;) {
 		for (i = 0; i < sizeof(buf) - 1; i++) {
 			if (timeout_ms > 0) {
-				gettimeofday(&t_start, NULL);
-				ms_to_timeval(&t_remaining, remaining);
-				FD_SET(connection_in, fdset);
-				rc = select(connection_in + 1, fdset, NULL,
-				    fdset, &t_remaining);
-				ms_subtract_diff(&t_start, &remaining);
-				if (rc == 0 || remaining <= 0)
+				rc = waitrfd(connection_in, &timeout_ms);
+				if (rc == -1 && errno == ETIMEDOUT) {
 					fatal("Connection timed out during "
 					    "banner exchange");
-				if (rc == -1) {
-					if (errno == EINTR)
-						continue;
-					fatal("ssh_exchange_identification: "
-					    "select: %s", strerror(errno));
+				} else if (rc == -1) {
+					fatal("%s: %s",
+					    __func__, strerror(errno));
 				}
 			}
 
 			len = atomicio(read, connection_in, &buf[i], 1);
-
 			if (len != 1 && errno == EPIPE)
 				fatal("ssh_exchange_identification: "
 				    "Connection closed by remote host");
@@ -622,7 +674,6 @@
 		debug("ssh_exchange_identification: %s", buf);
 	}
 	server_version_string = xstrdup(buf);
-	free(fdset);
 
 	/*
 	 * Check that the versions match.  In future this might accept
@@ -638,51 +689,22 @@
 	mismatch = 0;
 
 	switch (remote_major) {
-	case 1:
-		if (remote_minor == 99 &&
-		    (options.protocol & SSH_PROTO_2) &&
-		    !(options.protocol & SSH_PROTO_1_PREFERRED)) {
-			enable_compat20();
-			break;
-		}
-		if (!(options.protocol & SSH_PROTO_1)) {
-			mismatch = 1;
-			break;
-		}
-		if (remote_minor < 3) {
-			fatal("Remote machine has too old SSH software version.");
-		} else if (remote_minor == 3 || remote_minor == 4) {
-			/* We speak 1.3, too. */
-			enable_compat13();
-			minor1 = 3;
-			if (options.forward_agent) {
-				logit("Agent forwarding disabled for protocol 1.3");
-				options.forward_agent = 0;
-			}
-		}
-		break;
 	case 2:
-		if (options.protocol & SSH_PROTO_2) {
-			enable_compat20();
-			break;
-		}
-		/* FALLTHROUGH */
+		break;
+	case 1:
+		if (remote_minor != 99)
+			mismatch = 1;
+		break;
 	default:
 		mismatch = 1;
 		break;
 	}
 	if (mismatch)
 		fatal("Protocol major versions differ: %d vs. %d",
-		    (options.protocol & SSH_PROTO_2) ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1,
-		    remote_major);
-	if ((datafellows & SSH_BUG_DERIVEKEY) != 0)
-		fatal("Server version \"%.100s\" uses unsafe key agreement; "
-		    "refusing connection", remote_version);
+		    PROTOCOL_MAJOR_2, remote_major);
 	if ((datafellows & SSH_BUG_RSASIGMD5) != 0)
 		logit("Server version \"%.100s\" uses unsafe RSA signature "
 		    "scheme; disabling use of RSA keys", remote_version);
-	if (!client_banner_sent)
-		send_client_banner(connection_out, minor1);
 	chop(server_version_string);
 }
 
@@ -698,11 +720,12 @@
 		return 0;
 	for (msg = prompt;;msg = again) {
 		p = read_passphrase(msg, RP_ECHO);
-		if (p == NULL ||
-		    (p[0] == '\0') || (p[0] == '\n') ||
-		    strncasecmp(p, "no", 2) == 0)
+		if (p == NULL)
+			return 0;
+		p[strcspn(p, "\n")] = '\0';
+		if (p[0] == '\0' || strcasecmp(p, "no") == 0)
 			ret = 0;
-		if (p && strncasecmp(p, "yes", 3) == 0)
+		else if (strcasecmp(p, "yes") == 0)
 			ret = 1;
 		free(p);
 		if (ret != -1)
@@ -711,15 +734,15 @@
 }
 
 static int
-check_host_cert(const char *host, const Key *host_key)
+check_host_cert(const char *host, const struct sshkey *host_key)
 {
 	const char *reason;
 
-	if (key_cert_check_authority(host_key, 1, 0, host, &reason) != 0) {
+	if (sshkey_cert_check_authority(host_key, 1, 0, host, &reason) != 0) {
 		error("%s", reason);
 		return 0;
 	}
-	if (buffer_len(host_key->cert->critical) != 0) {
+	if (sshbuf_len(host_key->cert->critical) != 0) {
 		error("Certificate for %s contains unsupported "
 		    "critical options(s)", host);
 		return 0;
@@ -809,13 +832,13 @@
 #define ROQUIET	2
 static int
 check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port,
-    Key *host_key, int readonly,
+    struct sshkey *host_key, int readonly,
     char **user_hostfiles, u_int num_user_hostfiles,
     char **system_hostfiles, u_int num_system_hostfiles)
 {
 	HostStatus host_status;
 	HostStatus ip_status;
-	Key *raw_key = NULL;
+	struct sshkey *raw_key = NULL;
 	char *ip = NULL, *host = NULL;
 	char hostline[1000], *hostp, *fp, *ra;
 	char msg[1024];
@@ -823,7 +846,7 @@
 	const struct hostkey_entry *host_found, *ip_found;
 	int len, cancelled_forwarding = 0;
 	int local = sockaddr_is_local(hostaddr);
-	int r, want_cert = key_is_cert(host_key), host_ip_differ = 0;
+	int r, want_cert = sshkey_is_cert(host_key), host_ip_differ = 0;
 	int hostkey_trusted = 0; /* Known or explicitly accepted by user */
 	struct hostkeys *host_hostkeys, *ip_hostkeys;
 	u_int i;
@@ -874,8 +897,8 @@
 
  retry:
 	/* Reload these as they may have changed on cert->key downgrade */
-	want_cert = key_is_cert(host_key);
-	type = key_type(host_key);
+	want_cert = sshkey_is_cert(host_key);
+	type = sshkey_type(host_key);
 
 	/*
 	 * Check if the host key is present in the user's list of known
@@ -895,7 +918,7 @@
 		if (host_status == HOST_CHANGED &&
 		    (ip_status != HOST_CHANGED || 
 		    (ip_found != NULL &&
-		    !key_equal(ip_found->key, host_found->key))))
+		    !sshkey_equal(ip_found->key, host_found->key))))
 			host_ip_differ = 1;
 	} else
 		ip_status = host_status;
@@ -907,7 +930,9 @@
 		    host, type, want_cert ? "certificate" : "key");
 		debug("Found %s in %s:%lu", want_cert ? "CA key" : "key",
 		    host_found->file, host_found->line);
-		if (want_cert && !check_host_cert(hostname, host_key))
+		if (want_cert &&
+		    !check_host_cert(options.host_key_alias == NULL ?
+		    hostname : options.host_key_alias, host_key))
 			goto fail;
 		if (options.check_host_ip && ip_status == HOST_NEW) {
 			if (readonly || want_cert)
@@ -951,7 +976,8 @@
 		if (readonly || want_cert)
 			goto fail;
 		/* The host is new. */
-		if (options.strict_host_key_checking == 1) {
+		if (options.strict_host_key_checking ==
+		    SSH_STRICT_HOSTKEY_YES) {
 			/*
 			 * User has requested strict host key checking.  We
 			 * will not add the host key automatically.  The only
@@ -960,7 +986,8 @@
 			error("No %s host key is known for %.200s and you "
 			    "have requested strict checking.", type, host);
 			goto fail;
-		} else if (options.strict_host_key_checking == 2) {
+		} else if (options.strict_host_key_checking ==
+		    SSH_STRICT_HOSTKEY_ASK) {
 			char msg1[1024], msg2[1024];
 
 			if (show_other_keys(host_hostkeys, host_key))
@@ -1004,8 +1031,8 @@
 			hostkey_trusted = 1; /* user explicitly confirmed */
 		}
 		/*
-		 * If not in strict mode, add the key automatically to the
-		 * local known_hosts file.
+		 * If in "new" or "off" strict mode, add the key automatically
+		 * to the local known_hosts file.
 		 */
 		if (options.check_host_ip && ip_status == HOST_NEW) {
 			snprintf(hostline, sizeof(hostline), "%s,%s", host, ip);
@@ -1047,7 +1074,8 @@
 		 * If strict host key checking is in use, the user will have
 		 * to edit the key manually and we can only abort.
 		 */
-		if (options.strict_host_key_checking) {
+		if (options.strict_host_key_checking !=
+		    SSH_STRICT_HOSTKEY_OFF) {
 			error("%s host key for %.200s was revoked and you have "
 			    "requested strict checking.", type, host);
 			goto fail;
@@ -1092,14 +1120,16 @@
 		warn_changed_key(host_key);
 		error("Add correct host key in %.100s to get rid of this message.",
 		    user_hostfiles[0]);
-		error("Offending %s key in %s:%lu", key_type(host_found->key),
+		error("Offending %s key in %s:%lu",
+		    sshkey_type(host_found->key),
 		    host_found->file, host_found->line);
 
 		/*
 		 * If strict host key checking is in use, the user will have
 		 * to edit the key manually and we can only abort.
 		 */
-		if (options.strict_host_key_checking) {
+		if (options.strict_host_key_checking !=
+		    SSH_STRICT_HOSTKEY_OFF) {
 			error("%s host key for %.200s has changed and you have "
 			    "requested strict checking.", type, host);
 			goto fail;
@@ -1186,15 +1216,17 @@
 			    "\nMatching host key in %s:%lu",
 			    host_found->file, host_found->line);
 		}
-		if (options.strict_host_key_checking == 1) {
-			logit("%s", msg);
-			error("Exiting, you have requested strict checking.");
-			goto fail;
-		} else if (options.strict_host_key_checking == 2) {
+		if (options.strict_host_key_checking ==
+		    SSH_STRICT_HOSTKEY_ASK) {
 			strlcat(msg, "\nAre you sure you want "
 			    "to continue connecting (yes/no)? ", sizeof(msg));
 			if (!confirm(msg))
 				goto fail;
+		} else if (options.strict_host_key_checking !=
+		    SSH_STRICT_HOSTKEY_OFF) {
+			logit("%s", msg);
+			error("Exiting, you have requested strict checking.");
+			goto fail;
 		} else {
 			logit("%s", msg);
 		}
@@ -1221,14 +1253,15 @@
 		 * search normally.
 		 */
 		debug("No matching CA found. Retry with plain key");
-		raw_key = key_from_private(host_key);
-		if (key_drop_cert(raw_key) != 0)
-			fatal("Couldn't drop certificate");
+		if ((r = sshkey_from_private(host_key, &raw_key)) != 0)
+			fatal("%s: sshkey_from_private: %s",
+			    __func__, ssh_err(r));
+		if ((r = sshkey_drop_cert(raw_key)) != 0)
+			fatal("Couldn't drop certificate: %s", ssh_err(r));
 		host_key = raw_key;
 		goto retry;
 	}
-	if (raw_key != NULL)
-		key_free(raw_key);
+	sshkey_free(raw_key);
 	free(ip);
 	free(host);
 	if (host_hostkeys != NULL)
@@ -1240,7 +1273,7 @@
 
 /* returns 0 if key verifies or -1 if key does NOT verify */
 int
-verify_host_key(char *host, struct sockaddr *hostaddr, Key *host_key)
+verify_host_key(char *host, struct sockaddr *hostaddr, struct sshkey *host_key)
 {
 	u_int i;
 	int r = -1, flags = 0;
@@ -1276,8 +1309,7 @@
 			    host_key->cert->principals[i]);
 		}
 	} else {
-		debug("Server host key: %s %s", compat20 ?
-		    sshkey_ssh_name(host_key) : sshkey_type(host_key), fp);
+		debug("Server host key: %s %s", sshkey_ssh_name(host_key), fp);
 	}
 
 	if (sshkey_equal(previous_host_key, host_key)) {
@@ -1345,8 +1377,8 @@
 	free(fp);
 	free(cafp);
 	if (r == 0 && host_key != NULL) {
-		key_free(previous_host_key);
-		previous_host_key = key_from_private(host_key);
+		sshkey_free(previous_host_key);
+		r = sshkey_from_private(host_key, &previous_host_key);
 	}
 
 	return r;
@@ -1382,17 +1414,8 @@
 	/* key exchange */
 	/* authenticate user */
 	debug("Authenticating to %s:%d as '%s'", host, port, server_user);
-	if (compat20) {
-		ssh_kex2(host, hostaddr, port);
-		ssh_userauth2(local_user, server_user, host, sensitive);
-	} else {
-#ifdef WITH_SSH1
-		ssh_kex(host, hostaddr);
-		ssh_userauth1(local_user, server_user, host, sensitive);
-#else
-		fatal("ssh1 is not supported");
-#endif
-	}
+	ssh_kex2(host, hostaddr, port);
+	ssh_userauth2(local_user, server_user, host, sensitive);
 	free(local_user);
 }
 
@@ -1416,14 +1439,14 @@
 
 /* print all known host keys for a given host, but skip keys of given type */
 static int
-show_other_keys(struct hostkeys *hostkeys, Key *key)
+show_other_keys(struct hostkeys *hostkeys, struct sshkey *key)
 {
 	int type[] = {
-		KEY_RSA1,
 		KEY_RSA,
 		KEY_DSA,
 		KEY_ECDSA,
 		KEY_ED25519,
+		KEY_XMSS,
 		-1
 	};
 	int i, ret = 0;
@@ -1444,9 +1467,9 @@
 		logit("WARNING: %s key found for host %s\n"
 		    "in %s:%lu\n"
 		    "%s key fingerprint %s.",
-		    key_type(found->key),
+		    sshkey_type(found->key),
 		    found->host, found->file, found->line,
-		    key_type(found->key), fp);
+		    sshkey_type(found->key), fp);
 		if (options.visual_host_key)
 			logit("%s", ra);
 		free(ra);
@@ -1457,7 +1480,7 @@
 }
 
 static void
-warn_changed_key(Key *host_key)
+warn_changed_key(struct sshkey *host_key)
 {
 	char *fp;
 
@@ -1473,7 +1496,7 @@
 	error("Someone could be eavesdropping on you right now (man-in-the-middle attack)!");
 	error("It is also possible that a host key has just been changed.");
 	error("The fingerprint for the %s key sent by the remote host is\n%s.",
-	    key_type(host_key), fp);
+	    sshkey_type(host_key), fp);
 	error("Please contact your system administrator.");
 
 	free(fp);
@@ -1520,8 +1543,8 @@
 }
 
 void
-maybe_add_key_to_agent(char *authfile, Key *private, char *comment,
-    char *passphrase)
+maybe_add_key_to_agent(char *authfile, const struct sshkey *private,
+    char *comment, char *passphrase)
 {
 	int auth_sock = -1, r;
 
@@ -1536,12 +1559,14 @@
 	if (options.add_keys_to_agent == 2 &&
 	    !ask_permission("Add key %s (%s) to agent?", authfile, comment)) {
 		debug3("user denied adding this key");
+		close(auth_sock);
 		return;
 	}
 
 	if ((r = ssh_add_identity_constrained(auth_sock, private, comment, 0,
-	    (options.add_keys_to_agent == 3))) == 0)
+	    (options.add_keys_to_agent == 3), 0)) == 0)
 		debug("identity added to agent: %s", authfile);
 	else
 		debug("could not add identity to agent: %s (%d)", authfile, r);
+	close(auth_sock);
 }
diff --git a/sshconnect.h b/sshconnect.h
index 19130bc..890d857 100644
--- a/sshconnect.h
+++ b/sshconnect.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect.h,v 1.29 2015/11/15 22:26:49 jcs Exp $ */
+/* $OpenBSD: sshconnect.h,v 1.35 2018/07/19 10:28:47 dtucker Exp $ */
 
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
@@ -26,14 +26,15 @@
 
 typedef struct Sensitive Sensitive;
 struct Sensitive {
-	Key	**keys;
-	int	nkeys;
-	int	external_keysign;
+	struct sshkey	**keys;
+	int		nkeys;
 };
 
 struct addrinfo;
-int	 ssh_connect(const char *, struct addrinfo *, struct sockaddr_storage *,
-    u_short, int, int, int *, int, int);
+struct ssh;
+
+int	 ssh_connect(struct ssh *, const char *, struct addrinfo *,
+	    struct sockaddr_storage *, u_short, int, int, int *, int);
 void	 ssh_kill_proxy_command(void);
 
 void	 ssh_login(Sensitive *, const char *, struct sockaddr *, u_short,
@@ -41,7 +42,7 @@
 
 void	 ssh_exchange_identification(int);
 
-int	 verify_host_key(char *, struct sockaddr *, Key *);
+int	 verify_host_key(char *, struct sockaddr *, struct sshkey *);
 
 void	 get_hostfile_hostname_ipaddr(char *, struct sockaddr *, u_short,
     char **, char **);
@@ -55,31 +56,4 @@
 void	 ssh_put_password(char *);
 int	 ssh_local_cmd(const char *);
 
-void	 maybe_add_key_to_agent(char *, Key *, char *, char *);
-
-/*
- * Macros to raise/lower permissions.
- */
-#ifdef __Fuchsia__
-#define PRIV_START do {					\
-} while (0)
-
-#define PRIV_END do {					\
-} while (0)
-#else
-#define PRIV_START do {					\
-	int save_errno = errno;				\
-	if (seteuid(original_effective_uid) != 0)	\
-		fatal("PRIV_START: seteuid: %s",	\
-		    strerror(errno));			\
-	errno = save_errno;				\
-} while (0)
-
-#define PRIV_END do {					\
-	int save_errno = errno;				\
-	if (seteuid(original_real_uid) != 0)		\
-		fatal("PRIV_END: seteuid: %s",		\
-		    strerror(errno));			\
-	errno = save_errno;				\
-} while (0)
-#endif
+void	 maybe_add_key_to_agent(char *, const struct sshkey *, char *, char *);
diff --git a/sshconnect1.c b/sshconnect1.c
deleted file mode 100644
index a045361..0000000
--- a/sshconnect1.c
+++ /dev/null
@@ -1,772 +0,0 @@
-/* $OpenBSD: sshconnect1.c,v 1.79 2016/09/19 07:52:42 natano Exp $ */
-/*
- * Author: Tatu Ylonen <ylo@cs.hut.fi>
- * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- *                    All rights reserved
- * Code to connect to a remote host, and to perform the client side of the
- * login (authentication) dialog.
- *
- * As far as I am concerned, the code I have written for this software
- * can be used freely for any purpose.  Any derived versions of this
- * software must be clearly marked as such, and if the derived work is
- * incompatible with the protocol description in the RFC file, it must be
- * called by a name other than "ssh" or "Secure Shell".
- */
-
-#include "includes.h"
-
-#ifdef WITH_SSH1
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <openssl/bn.h>
-
-#include <errno.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#include <pwd.h>
-
-#include "xmalloc.h"
-#include "ssh.h"
-#include "ssh1.h"
-#include "rsa.h"
-#include "buffer.h"
-#include "packet.h"
-#include "key.h"
-#include "cipher.h"
-#include "kex.h"
-#include "uidswap.h"
-#include "log.h"
-#include "misc.h"
-#include "readconf.h"
-#include "authfd.h"
-#include "sshconnect.h"
-#include "authfile.h"
-#include "canohost.h"
-#include "hostfile.h"
-#include "auth.h"
-#include "digest.h"
-#include "ssherr.h"
-
-/* Session id for the current session. */
-u_char session_id[16];
-u_int supported_authentications = 0;
-
-extern Options options;
-extern char *__progname;
-
-/*
- * Checks if the user has an authentication agent, and if so, tries to
- * authenticate using the agent.
- */
-static int
-try_agent_authentication(void)
-{
-	int r, type, agent_fd, ret = 0;
-	u_char response[16];
-	size_t i;
-	BIGNUM *challenge;
-	struct ssh_identitylist *idlist = NULL;
-
-	/* Get connection to the agent. */
-	if ((r = ssh_get_authentication_socket(&agent_fd)) != 0) {
-		if (r != SSH_ERR_AGENT_NOT_PRESENT)
-			debug("%s: ssh_get_authentication_socket: %s",
-			    __func__, ssh_err(r));
-		return 0;
-	}
-
-	if ((challenge = BN_new()) == NULL)
-		fatal("try_agent_authentication: BN_new failed");
-
-	/* Loop through identities served by the agent. */
-	if ((r = ssh_fetch_identitylist(agent_fd, 1, &idlist)) != 0) {
-		if (r != SSH_ERR_AGENT_NO_IDENTITIES)
-			debug("%s: ssh_fetch_identitylist: %s",
-			    __func__, ssh_err(r));
-		goto out;
-	}
-	for (i = 0; i < idlist->nkeys; i++) {
-		/* Try this identity. */
-		debug("Trying RSA authentication via agent with '%.100s'",
-		    idlist->comments[i]);
-
-		/* Tell the server that we are willing to authenticate using this key. */
-		packet_start(SSH_CMSG_AUTH_RSA);
-		packet_put_bignum(idlist->keys[i]->rsa->n);
-		packet_send();
-		packet_write_wait();
-
-		/* Wait for server's response. */
-		type = packet_read();
-
-		/* The server sends failure if it doesn't like our key or
-		   does not support RSA authentication. */
-		if (type == SSH_SMSG_FAILURE) {
-			debug("Server refused our key.");
-			continue;
-		}
-		/* Otherwise it should have sent a challenge. */
-		if (type != SSH_SMSG_AUTH_RSA_CHALLENGE)
-			packet_disconnect("Protocol error during RSA authentication: %d",
-					  type);
-
-		packet_get_bignum(challenge);
-		packet_check_eom();
-
-		debug("Received RSA challenge from server.");
-
-		/* Ask the agent to decrypt the challenge. */
-		if ((r = ssh_decrypt_challenge(agent_fd, idlist->keys[i],
-		    challenge, session_id, response)) != 0) {
-			/*
-			 * The agent failed to authenticate this identifier
-			 * although it advertised it supports this.  Just
-			 * return a wrong value.
-			 */
-			logit("Authentication agent failed to decrypt "
-			    "challenge: %s", ssh_err(r));
-			explicit_bzero(response, sizeof(response));
-		}
-		debug("Sending response to RSA challenge.");
-
-		/* Send the decrypted challenge back to the server. */
-		packet_start(SSH_CMSG_AUTH_RSA_RESPONSE);
-		for (i = 0; i < 16; i++)
-			packet_put_char(response[i]);
-		packet_send();
-		packet_write_wait();
-
-		/* Wait for response from the server. */
-		type = packet_read();
-
-		/*
-		 * The server returns success if it accepted the
-		 * authentication.
-		 */
-		if (type == SSH_SMSG_SUCCESS) {
-			debug("RSA authentication accepted by server.");
-			ret = 1;
-			break;
-		} else if (type != SSH_SMSG_FAILURE)
-			packet_disconnect("Protocol error waiting RSA auth "
-			    "response: %d", type);
-	}
-	if (ret != 1)
-		debug("RSA authentication using agent refused.");
- out:
-	ssh_free_identitylist(idlist);
-	ssh_close_authentication_socket(agent_fd);
-	BN_clear_free(challenge);
-	return ret;
-}
-
-/*
- * Computes the proper response to a RSA challenge, and sends the response to
- * the server.
- */
-static void
-respond_to_rsa_challenge(BIGNUM * challenge, RSA * prv)
-{
-	u_char buf[32], response[16];
-	struct ssh_digest_ctx *md;
-	int i, len;
-
-	/* Decrypt the challenge using the private key. */
-	/* XXX think about Bleichenbacher, too */
-	if (rsa_private_decrypt(challenge, challenge, prv) != 0)
-		packet_disconnect(
-		    "respond_to_rsa_challenge: rsa_private_decrypt failed");
-
-	/* Compute the response. */
-	/* The response is MD5 of decrypted challenge plus session id. */
-	len = BN_num_bytes(challenge);
-	if (len <= 0 || (u_int)len > sizeof(buf))
-		packet_disconnect(
-		    "respond_to_rsa_challenge: bad challenge length %d", len);
-
-	memset(buf, 0, sizeof(buf));
-	BN_bn2bin(challenge, buf + sizeof(buf) - len);
-	if ((md = ssh_digest_start(SSH_DIGEST_MD5)) == NULL ||
-	    ssh_digest_update(md, buf, 32) < 0 ||
-	    ssh_digest_update(md, session_id, 16) < 0 ||
-	    ssh_digest_final(md, response, sizeof(response)) < 0)
-		fatal("%s: md5 failed", __func__);
-	ssh_digest_free(md);
-
-	debug("Sending response to host key RSA challenge.");
-
-	/* Send the response back to the server. */
-	packet_start(SSH_CMSG_AUTH_RSA_RESPONSE);
-	for (i = 0; i < 16; i++)
-		packet_put_char(response[i]);
-	packet_send();
-	packet_write_wait();
-
-	explicit_bzero(buf, sizeof(buf));
-	explicit_bzero(response, sizeof(response));
-	explicit_bzero(&md, sizeof(md));
-}
-
-/*
- * Checks if the user has authentication file, and if so, tries to authenticate
- * the user using it.
- */
-static int
-try_rsa_authentication(int idx)
-{
-	BIGNUM *challenge;
-	Key *public, *private;
-	char buf[300], *passphrase = NULL, *comment, *authfile;
-	int i, perm_ok = 1, type, quit;
-
-	public = options.identity_keys[idx];
-	authfile = options.identity_files[idx];
-	comment = xstrdup(authfile);
-
-	debug("Trying RSA authentication with key '%.100s'", comment);
-
-	/* Tell the server that we are willing to authenticate using this key. */
-	packet_start(SSH_CMSG_AUTH_RSA);
-	packet_put_bignum(public->rsa->n);
-	packet_send();
-	packet_write_wait();
-
-	/* Wait for server's response. */
-	type = packet_read();
-
-	/*
-	 * The server responds with failure if it doesn't like our key or
-	 * doesn't support RSA authentication.
-	 */
-	if (type == SSH_SMSG_FAILURE) {
-		debug("Server refused our key.");
-		free(comment);
-		return 0;
-	}
-	/* Otherwise, the server should respond with a challenge. */
-	if (type != SSH_SMSG_AUTH_RSA_CHALLENGE)
-		packet_disconnect("Protocol error during RSA authentication: %d", type);
-
-	/* Get the challenge from the packet. */
-	if ((challenge = BN_new()) == NULL)
-		fatal("try_rsa_authentication: BN_new failed");
-	packet_get_bignum(challenge);
-	packet_check_eom();
-
-	debug("Received RSA challenge from server.");
-
-	/*
-	 * If the key is not stored in external hardware, we have to
-	 * load the private key.  Try first with empty passphrase; if it
-	 * fails, ask for a passphrase.
-	 */
-	if (public->flags & SSHKEY_FLAG_EXT)
-		private = public;
-	else
-		private = key_load_private_type(KEY_RSA1, authfile, "", NULL,
-		    &perm_ok);
-	if (private == NULL && !options.batch_mode && perm_ok) {
-		snprintf(buf, sizeof(buf),
-		    "Enter passphrase for RSA key '%.100s': ", comment);
-		for (i = 0; i < options.number_of_password_prompts; i++) {
-			passphrase = read_passphrase(buf, 0);
-			if (strcmp(passphrase, "") != 0) {
-				private = key_load_private_type(KEY_RSA1,
-				    authfile, passphrase, NULL, NULL);
-				quit = 0;
-			} else {
-				debug2("no passphrase given, try next key");
-				quit = 1;
-			}
-			if (private != NULL || quit)
-				break;
-			debug2("bad passphrase given, try again...");
-		}
-	}
-
-	if (private != NULL)
-		maybe_add_key_to_agent(authfile, private, comment, passphrase);
-
-	if (passphrase != NULL) {
-		explicit_bzero(passphrase, strlen(passphrase));
-		free(passphrase);
-	}
-
-	/* We no longer need the comment. */
-	free(comment);
-
-	if (private == NULL) {
-		if (!options.batch_mode && perm_ok)
-			error("Bad passphrase.");
-
-		/* Send a dummy response packet to avoid protocol error. */
-		packet_start(SSH_CMSG_AUTH_RSA_RESPONSE);
-		for (i = 0; i < 16; i++)
-			packet_put_char(0);
-		packet_send();
-		packet_write_wait();
-
-		/* Expect the server to reject it... */
-		packet_read_expect(SSH_SMSG_FAILURE);
-		BN_clear_free(challenge);
-		return 0;
-	}
-
-	/* Compute and send a response to the challenge. */
-	respond_to_rsa_challenge(challenge, private->rsa);
-
-	/* Destroy the private key unless it in external hardware. */
-	if (!(private->flags & SSHKEY_FLAG_EXT))
-		key_free(private);
-
-	/* We no longer need the challenge. */
-	BN_clear_free(challenge);
-
-	/* Wait for response from the server. */
-	type = packet_read();
-	if (type == SSH_SMSG_SUCCESS) {
-		debug("RSA authentication accepted by server.");
-		return 1;
-	}
-	if (type != SSH_SMSG_FAILURE)
-		packet_disconnect("Protocol error waiting RSA auth response: %d", type);
-	debug("RSA authentication refused.");
-	return 0;
-}
-
-/*
- * Tries to authenticate the user using combined rhosts or /etc/hosts.equiv
- * authentication and RSA host authentication.
- */
-static int
-try_rhosts_rsa_authentication(const char *local_user, Key * host_key)
-{
-	int type;
-	BIGNUM *challenge;
-
-	debug("Trying rhosts or /etc/hosts.equiv with RSA host authentication.");
-
-	/* Tell the server that we are willing to authenticate using this key. */
-	packet_start(SSH_CMSG_AUTH_RHOSTS_RSA);
-	packet_put_cstring(local_user);
-	packet_put_int(BN_num_bits(host_key->rsa->n));
-	packet_put_bignum(host_key->rsa->e);
-	packet_put_bignum(host_key->rsa->n);
-	packet_send();
-	packet_write_wait();
-
-	/* Wait for server's response. */
-	type = packet_read();
-
-	/* The server responds with failure if it doesn't admit our
-	   .rhosts authentication or doesn't know our host key. */
-	if (type == SSH_SMSG_FAILURE) {
-		debug("Server refused our rhosts authentication or host key.");
-		return 0;
-	}
-	/* Otherwise, the server should respond with a challenge. */
-	if (type != SSH_SMSG_AUTH_RSA_CHALLENGE)
-		packet_disconnect("Protocol error during RSA authentication: %d", type);
-
-	/* Get the challenge from the packet. */
-	if ((challenge = BN_new()) == NULL)
-		fatal("try_rhosts_rsa_authentication: BN_new failed");
-	packet_get_bignum(challenge);
-	packet_check_eom();
-
-	debug("Received RSA challenge for host key from server.");
-
-	/* Compute a response to the challenge. */
-	respond_to_rsa_challenge(challenge, host_key->rsa);
-
-	/* We no longer need the challenge. */
-	BN_clear_free(challenge);
-
-	/* Wait for response from the server. */
-	type = packet_read();
-	if (type == SSH_SMSG_SUCCESS) {
-		debug("Rhosts or /etc/hosts.equiv with RSA host authentication accepted by server.");
-		return 1;
-	}
-	if (type != SSH_SMSG_FAILURE)
-		packet_disconnect("Protocol error waiting RSA auth response: %d", type);
-	debug("Rhosts or /etc/hosts.equiv with RSA host authentication refused.");
-	return 0;
-}
-
-/*
- * Tries to authenticate with any string-based challenge/response system.
- * Note that the client code is not tied to s/key or TIS.
- */
-static int
-try_challenge_response_authentication(void)
-{
-	int type, i;
-	u_int clen;
-	char prompt[1024];
-	char *challenge, *response;
-
-	debug("Doing challenge response authentication.");
-
-	for (i = 0; i < options.number_of_password_prompts; i++) {
-		/* request a challenge */
-		packet_start(SSH_CMSG_AUTH_TIS);
-		packet_send();
-		packet_write_wait();
-
-		type = packet_read();
-		if (type != SSH_SMSG_FAILURE &&
-		    type != SSH_SMSG_AUTH_TIS_CHALLENGE) {
-			packet_disconnect("Protocol error: got %d in response "
-			    "to SSH_CMSG_AUTH_TIS", type);
-		}
-		if (type != SSH_SMSG_AUTH_TIS_CHALLENGE) {
-			debug("No challenge.");
-			return 0;
-		}
-		challenge = packet_get_string(&clen);
-		packet_check_eom();
-		snprintf(prompt, sizeof prompt, "%s%s", challenge,
-		    strchr(challenge, '\n') ? "" : "\nResponse: ");
-		free(challenge);
-		if (i != 0)
-			error("Permission denied, please try again.");
-		if (options.cipher == SSH_CIPHER_NONE)
-			logit("WARNING: Encryption is disabled! "
-			    "Response will be transmitted in clear text.");
-		response = read_passphrase(prompt, 0);
-		if (strcmp(response, "") == 0) {
-			free(response);
-			break;
-		}
-		packet_start(SSH_CMSG_AUTH_TIS_RESPONSE);
-		ssh_put_password(response);
-		explicit_bzero(response, strlen(response));
-		free(response);
-		packet_send();
-		packet_write_wait();
-		type = packet_read();
-		if (type == SSH_SMSG_SUCCESS)
-			return 1;
-		if (type != SSH_SMSG_FAILURE)
-			packet_disconnect("Protocol error: got %d in response "
-			    "to SSH_CMSG_AUTH_TIS_RESPONSE", type);
-	}
-	/* failure */
-	return 0;
-}
-
-/*
- * Tries to authenticate with plain passwd authentication.
- */
-static int
-try_password_authentication(char *prompt)
-{
-	int type, i;
-	char *password;
-
-	debug("Doing password authentication.");
-	if (options.cipher == SSH_CIPHER_NONE)
-		logit("WARNING: Encryption is disabled! Password will be transmitted in clear text.");
-	for (i = 0; i < options.number_of_password_prompts; i++) {
-		if (i != 0)
-			error("Permission denied, please try again.");
-		password = read_passphrase(prompt, 0);
-		packet_start(SSH_CMSG_AUTH_PASSWORD);
-		ssh_put_password(password);
-		explicit_bzero(password, strlen(password));
-		free(password);
-		packet_send();
-		packet_write_wait();
-
-		type = packet_read();
-		if (type == SSH_SMSG_SUCCESS)
-			return 1;
-		if (type != SSH_SMSG_FAILURE)
-			packet_disconnect("Protocol error: got %d in response to passwd auth", type);
-	}
-	/* failure */
-	return 0;
-}
-
-/*
- * SSH1 key exchange
- */
-void
-ssh_kex(char *host, struct sockaddr *hostaddr)
-{
-	int i;
-	BIGNUM *key;
-	Key *host_key, *server_key;
-	int bits, rbits;
-	int ssh_cipher_default = SSH_CIPHER_3DES;
-	u_char session_key[SSH_SESSION_KEY_LENGTH];
-	u_char cookie[8];
-	u_int supported_ciphers;
-	u_int server_flags, client_flags;
-
-	debug("Waiting for server public key.");
-
-	/* Wait for a public key packet from the server. */
-	packet_read_expect(SSH_SMSG_PUBLIC_KEY);
-
-	/* Get cookie from the packet. */
-	for (i = 0; i < 8; i++)
-		cookie[i] = packet_get_char();
-
-	/* Get the public key. */
-	server_key = key_new(KEY_RSA1);
-	bits = packet_get_int();
-	packet_get_bignum(server_key->rsa->e);
-	packet_get_bignum(server_key->rsa->n);
-
-	rbits = BN_num_bits(server_key->rsa->n);
-	if (bits != rbits) {
-		logit("Warning: Server lies about size of server public key: "
-		    "actual size is %d bits vs. announced %d.", rbits, bits);
-		logit("Warning: This may be due to an old implementation of ssh.");
-	}
-	/* Get the host key. */
-	host_key = key_new(KEY_RSA1);
-	bits = packet_get_int();
-	packet_get_bignum(host_key->rsa->e);
-	packet_get_bignum(host_key->rsa->n);
-
-	rbits = BN_num_bits(host_key->rsa->n);
-	if (bits != rbits) {
-		logit("Warning: Server lies about size of server host key: "
-		    "actual size is %d bits vs. announced %d.", rbits, bits);
-		logit("Warning: This may be due to an old implementation of ssh.");
-	}
-
-	/* Get protocol flags. */
-	server_flags = packet_get_int();
-	packet_set_protocol_flags(server_flags);
-
-	supported_ciphers = packet_get_int();
-	supported_authentications = packet_get_int();
-	packet_check_eom();
-
-	debug("Received server public key (%d bits) and host key (%d bits).",
-	    BN_num_bits(server_key->rsa->n), BN_num_bits(host_key->rsa->n));
-
-	if (verify_host_key(host, hostaddr, host_key) == -1)
-		fatal("Host key verification failed.");
-
-	client_flags = SSH_PROTOFLAG_SCREEN_NUMBER | SSH_PROTOFLAG_HOST_IN_FWD_OPEN;
-
-	derive_ssh1_session_id(host_key->rsa->n, server_key->rsa->n, cookie, session_id);
-
-	/*
-	 * Generate an encryption key for the session.   The key is a 256 bit
-	 * random number, interpreted as a 32-byte key, with the least
-	 * significant 8 bits being the first byte of the key.
-	 */
-	arc4random_buf(session_key, sizeof(session_key));
-
-	/*
-	 * According to the protocol spec, the first byte of the session key
-	 * is the highest byte of the integer.  The session key is xored with
-	 * the first 16 bytes of the session id.
-	 */
-	if ((key = BN_new()) == NULL)
-		fatal("ssh_kex: BN_new failed");
-	if (BN_set_word(key, 0) == 0)
-		fatal("ssh_kex: BN_set_word failed");
-	for (i = 0; i < SSH_SESSION_KEY_LENGTH; i++) {
-		if (BN_lshift(key, key, 8) == 0)
-			fatal("ssh_kex: BN_lshift failed");
-		if (i < 16) {
-			if (BN_add_word(key, session_key[i] ^ session_id[i])
-			    == 0)
-				fatal("ssh_kex: BN_add_word failed");
-		} else {
-			if (BN_add_word(key, session_key[i]) == 0)
-				fatal("ssh_kex: BN_add_word failed");
-		}
-	}
-
-	/*
-	 * Encrypt the integer using the public key and host key of the
-	 * server (key with smaller modulus first).
-	 */
-	if (BN_cmp(server_key->rsa->n, host_key->rsa->n) < 0) {
-		/* Public key has smaller modulus. */
-		if (BN_num_bits(host_key->rsa->n) <
-		    BN_num_bits(server_key->rsa->n) + SSH_KEY_BITS_RESERVED) {
-			fatal("respond_to_rsa_challenge: host_key %d < server_key %d + "
-			    "SSH_KEY_BITS_RESERVED %d",
-			    BN_num_bits(host_key->rsa->n),
-			    BN_num_bits(server_key->rsa->n),
-			    SSH_KEY_BITS_RESERVED);
-		}
-		if (rsa_public_encrypt(key, key, server_key->rsa) != 0 ||
-		    rsa_public_encrypt(key, key, host_key->rsa) != 0)
-			fatal("%s: rsa_public_encrypt failed", __func__);
-	} else {
-		/* Host key has smaller modulus (or they are equal). */
-		if (BN_num_bits(server_key->rsa->n) <
-		    BN_num_bits(host_key->rsa->n) + SSH_KEY_BITS_RESERVED) {
-			fatal("respond_to_rsa_challenge: server_key %d < host_key %d + "
-			    "SSH_KEY_BITS_RESERVED %d",
-			    BN_num_bits(server_key->rsa->n),
-			    BN_num_bits(host_key->rsa->n),
-			    SSH_KEY_BITS_RESERVED);
-		}
-		if (rsa_public_encrypt(key, key, host_key->rsa) != 0 ||
-		    rsa_public_encrypt(key, key, server_key->rsa) != 0)
-			fatal("%s: rsa_public_encrypt failed", __func__);
-	}
-
-	/* Destroy the public keys since we no longer need them. */
-	key_free(server_key);
-	key_free(host_key);
-
-	if (options.cipher == SSH_CIPHER_NOT_SET) {
-		if (cipher_mask_ssh1(1) & supported_ciphers & (1 << ssh_cipher_default))
-			options.cipher = ssh_cipher_default;
-	} else if (options.cipher == SSH_CIPHER_INVALID ||
-	    !(cipher_mask_ssh1(1) & (1 << options.cipher))) {
-		logit("No valid SSH1 cipher, using %.100s instead.",
-		    cipher_name(ssh_cipher_default));
-		options.cipher = ssh_cipher_default;
-	}
-	/* Check that the selected cipher is supported. */
-	if (!(supported_ciphers & (1 << options.cipher)))
-		fatal("Selected cipher type %.100s not supported by server.",
-		    cipher_name(options.cipher));
-
-	debug("Encryption type: %.100s", cipher_name(options.cipher));
-
-	/* Send the encrypted session key to the server. */
-	packet_start(SSH_CMSG_SESSION_KEY);
-	packet_put_char(options.cipher);
-
-	/* Send the cookie back to the server. */
-	for (i = 0; i < 8; i++)
-		packet_put_char(cookie[i]);
-
-	/* Send and destroy the encrypted encryption key integer. */
-	packet_put_bignum(key);
-	BN_clear_free(key);
-
-	/* Send protocol flags. */
-	packet_put_int(client_flags);
-
-	/* Send the packet now. */
-	packet_send();
-	packet_write_wait();
-
-	debug("Sent encrypted session key.");
-
-	/* Set the encryption key. */
-	packet_set_encryption_key(session_key, SSH_SESSION_KEY_LENGTH, options.cipher);
-
-	/*
-	 * We will no longer need the session key here.
-	 * Destroy any extra copies.
-	 */
-	explicit_bzero(session_key, sizeof(session_key));
-
-	/*
-	 * Expect a success message from the server.  Note that this message
-	 * will be received in encrypted form.
-	 */
-	packet_read_expect(SSH_SMSG_SUCCESS);
-
-	debug("Received encrypted confirmation.");
-}
-
-/*
- * Authenticate user
- */
-void
-ssh_userauth1(const char *local_user, const char *server_user, char *host,
-    Sensitive *sensitive)
-{
-	int i, type;
-
-	if (supported_authentications == 0)
-		fatal("ssh_userauth1: server supports no auth methods");
-
-	/* Send the name of the user to log in as on the server. */
-	packet_start(SSH_CMSG_USER);
-	packet_put_cstring(server_user);
-	packet_send();
-	packet_write_wait();
-
-	/*
-	 * The server should respond with success if no authentication is
-	 * needed (the user has no password).  Otherwise the server responds
-	 * with failure.
-	 */
-	type = packet_read();
-
-	/* check whether the connection was accepted without authentication. */
-	if (type == SSH_SMSG_SUCCESS)
-		goto success;
-	if (type != SSH_SMSG_FAILURE)
-		packet_disconnect("Protocol error: got %d in response to SSH_CMSG_USER", type);
-
-	/*
-	 * Try .rhosts or /etc/hosts.equiv authentication with RSA host
-	 * authentication.
-	 */
-	if ((supported_authentications & (1 << SSH_AUTH_RHOSTS_RSA)) &&
-	    options.rhosts_rsa_authentication) {
-		for (i = 0; i < sensitive->nkeys; i++) {
-			if (sensitive->keys[i] != NULL &&
-			    sensitive->keys[i]->type == KEY_RSA1 &&
-			    try_rhosts_rsa_authentication(local_user,
-			    sensitive->keys[i]))
-				goto success;
-		}
-	}
-	/* Try RSA authentication if the server supports it. */
-	if ((supported_authentications & (1 << SSH_AUTH_RSA)) &&
-	    options.rsa_authentication) {
-		/*
-		 * Try RSA authentication using the authentication agent. The
-		 * agent is tried first because no passphrase is needed for
-		 * it, whereas identity files may require passphrases.
-		 */
-		if (try_agent_authentication())
-			goto success;
-
-		/* Try RSA authentication for each identity. */
-		for (i = 0; i < options.num_identity_files; i++)
-			if (options.identity_keys[i] != NULL &&
-			    options.identity_keys[i]->type == KEY_RSA1 &&
-			    try_rsa_authentication(i))
-				goto success;
-	}
-	/* Try challenge response authentication if the server supports it. */
-	if ((supported_authentications & (1 << SSH_AUTH_TIS)) &&
-	    options.challenge_response_authentication && !options.batch_mode) {
-		if (try_challenge_response_authentication())
-			goto success;
-	}
-	/* Try password authentication if the server supports it. */
-	if ((supported_authentications & (1 << SSH_AUTH_PASSWORD)) &&
-	    options.password_authentication && !options.batch_mode) {
-		char prompt[80];
-
-		snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",
-		    server_user, host);
-		if (try_password_authentication(prompt))
-			goto success;
-	}
-	/* All authentication methods have failed.  Exit with an error message. */
-	fatal("Permission denied.");
-	/* NOTREACHED */
-
- success:
-	return;	/* need statement after label */
-}
-
-#endif /* WITH_SSH1 */
diff --git a/sshconnect2.c b/sshconnect2.c
index 2abb866..10e4f0a 100644
--- a/sshconnect2.c
+++ b/sshconnect2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect2.c,v 1.254 2017/02/03 02:56:00 dtucker Exp $ */
+/* $OpenBSD: sshconnect2.c,v 1.284 2018/08/13 02:41:05 djm Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  * Copyright (c) 2008 Damien Miller.  All rights reserved.
@@ -49,11 +49,11 @@
 #include "xmalloc.h"
 #include "ssh.h"
 #include "ssh2.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "packet.h"
 #include "compat.h"
 #include "cipher.h"
-#include "key.h"
+#include "sshkey.h"
 #include "kex.h"
 #include "myproposal.h"
 #include "sshconnect.h"
@@ -93,7 +93,7 @@
 struct sockaddr *xxx_hostaddr;
 
 static int
-verify_host_key_callback(Key *hostkey, struct ssh *ssh)
+verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh)
 {
 	if (verify_host_key(xxx_host, xxx_hostaddr, hostkey) == -1)
 		fatal("Host key verification failed.");
@@ -158,7 +158,7 @@
 ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 {
 	char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT };
-	char *s;
+	char *s, *all_key;
 	struct kex *kex;
 	int r;
 
@@ -178,9 +178,11 @@
 	myproposal[PROPOSAL_MAC_ALGS_CTOS] =
 	    myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs;
 	if (options.hostkeyalgorithms != NULL) {
-		if (kex_assemble_names(KEX_DEFAULT_PK_ALG,
-		    &options.hostkeyalgorithms) != 0)
+		all_key = sshkey_alg_list(0, 0, 1, ',');
+		if (kex_assemble_names(&options.hostkeyalgorithms,
+		    KEX_DEFAULT_PK_ALG, all_key) != 0)
 			fatal("%s: kex_assemble_namelist", __func__);
+		free(all_key);
 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] =
 		    compat_pkalg_proposal(options.hostkeyalgorithms);
 	} else {
@@ -217,7 +219,7 @@
 	kex->server_version_string=server_version_string;
 	kex->verify_host_key=&verify_host_key_callback;
 
-	dispatch_run(DISPATCH_BLOCK, &kex->done, active_state);
+	ssh_dispatch_run_fatal(active_state, DISPATCH_BLOCK, &kex->done);
 
 	/* remove ext-info from the KEX proposals for rekeying */
 	myproposal[PROPOSAL_KEX_ALGS] =
@@ -230,10 +232,11 @@
 
 #ifdef DEBUG_KEXDH
 	/* send 1st encrypted/maced/compressed message */
-	packet_start(SSH2_MSG_IGNORE);
-	packet_put_cstring("markus");
-	packet_send();
-	packet_write_wait();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_IGNORE)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, "markus")) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0 ||
+	    (r = ssh_packet_write_wait(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 #endif
 }
 
@@ -287,16 +290,16 @@
 	int	*batch_flag;	/* flag in option struct that disables method */
 };
 
-int	input_userauth_service_accept(int, u_int32_t, void *);
-int	input_userauth_ext_info(int, u_int32_t, void *);
-int	input_userauth_success(int, u_int32_t, void *);
-int	input_userauth_success_unexpected(int, u_int32_t, void *);
-int	input_userauth_failure(int, u_int32_t, void *);
-int	input_userauth_banner(int, u_int32_t, void *);
-int	input_userauth_error(int, u_int32_t, void *);
-int	input_userauth_info_req(int, u_int32_t, void *);
-int	input_userauth_pk_ok(int, u_int32_t, void *);
-int	input_userauth_passwd_changereq(int, u_int32_t, void *);
+int	input_userauth_service_accept(int, u_int32_t, struct ssh *);
+int	input_userauth_ext_info(int, u_int32_t, struct ssh *);
+int	input_userauth_success(int, u_int32_t, struct ssh *);
+int	input_userauth_success_unexpected(int, u_int32_t, struct ssh *);
+int	input_userauth_failure(int, u_int32_t, struct ssh *);
+int	input_userauth_banner(int, u_int32_t, struct ssh *);
+int	input_userauth_error(int, u_int32_t, struct ssh *);
+int	input_userauth_info_req(int, u_int32_t, struct ssh *);
+int	input_userauth_pk_ok(int, u_int32_t, struct ssh *);
+int	input_userauth_passwd_changereq(int, u_int32_t, struct ssh *);
 
 int	userauth_none(Authctxt *);
 int	userauth_pubkey(Authctxt *);
@@ -306,20 +309,20 @@
 
 #ifdef GSSAPI
 int	userauth_gssapi(Authctxt *authctxt);
-int	input_gssapi_response(int type, u_int32_t, void *);
-int	input_gssapi_token(int type, u_int32_t, void *);
-int	input_gssapi_hash(int type, u_int32_t, void *);
-int	input_gssapi_error(int, u_int32_t, void *);
-int	input_gssapi_errtok(int, u_int32_t, void *);
+int	input_gssapi_response(int type, u_int32_t, struct ssh *);
+int	input_gssapi_token(int type, u_int32_t, struct ssh *);
+int	input_gssapi_hash(int type, u_int32_t, struct ssh *);
+int	input_gssapi_error(int, u_int32_t, struct ssh *);
+int	input_gssapi_errtok(int, u_int32_t, struct ssh *);
 #endif
 
 void	userauth(Authctxt *, char *);
 
-static int sign_and_send_pubkey(Authctxt *, Identity *);
+static int sign_and_send_pubkey(struct ssh *ssh, Authctxt *, Identity *);
 static void pubkey_prepare(Authctxt *);
 static void pubkey_cleanup(Authctxt *);
 static void pubkey_reset(Authctxt *);
-static Key *load_identity_file(Identity *);
+static struct sshkey *load_identity_file(Identity *);
 
 static Authmethod *authmethod_get(char *authlist);
 static Authmethod *authmethod_lookup(const char *name);
@@ -397,10 +400,12 @@
 	    (r = sshpkt_send(ssh)) != 0)
 		fatal("%s: %s", __func__, ssh_err(r));
 
+	ssh->authctxt = &authctxt;
 	ssh_dispatch_init(ssh, &input_userauth_error);
 	ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, &input_userauth_ext_info);
 	ssh_dispatch_set(ssh, SSH2_MSG_SERVICE_ACCEPT, &input_userauth_service_accept);
-	ssh_dispatch_run(ssh, DISPATCH_BLOCK, &authctxt.success, &authctxt);	/* loop until success */
+	ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &authctxt.success);	/* loop until success */
+	ssh->authctxt = NULL;
 
 	pubkey_cleanup(&authctxt);
 	ssh_dispatch_range(ssh, SSH2_MSG_USERAUTH_MIN, SSH2_MSG_USERAUTH_MAX, NULL);
@@ -412,10 +417,9 @@
 
 /* ARGSUSED */
 int
-input_userauth_service_accept(int type, u_int32_t seqnr, void *ctxt)
+input_userauth_service_accept(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
-	struct ssh *ssh = active_state;
+	Authctxt *authctxt = ssh->authctxt;
 	int r;
 
 	if (ssh_packet_remaining(ssh) > 0) {
@@ -446,14 +450,16 @@
 
 /* ARGSUSED */
 int
-input_userauth_ext_info(int type, u_int32_t seqnr, void *ctxt)
+input_userauth_ext_info(int type, u_int32_t seqnr, struct ssh *ssh)
 {
-	return kex_input_ext_info(type, seqnr, active_state);
+	return kex_input_ext_info(type, seqnr, ssh);
 }
 
 void
 userauth(Authctxt *authctxt, char *authlist)
 {
+	struct ssh *ssh = active_state; /* XXX */
+
 	if (authctxt->method != NULL && authctxt->method->cleanup != NULL)
 		authctxt->method->cleanup(authctxt);
 
@@ -468,11 +474,12 @@
 	for (;;) {
 		Authmethod *method = authmethod_get(authlist);
 		if (method == NULL)
-			fatal("Permission denied (%s).", authlist);
+			fatal("%s@%s: Permission denied (%s).",
+			    authctxt->server_user, authctxt->host, authlist);
 		authctxt->method = method;
 
 		/* reset the per method handler */
-		dispatch_range(SSH2_MSG_USERAUTH_PER_METHOD_MIN,
+		ssh_dispatch_range(ssh, SSH2_MSG_USERAUTH_PER_METHOD_MIN,
 		    SSH2_MSG_USERAUTH_PER_METHOD_MAX, NULL);
 
 		/* and try new method */
@@ -488,7 +495,7 @@
 
 /* ARGSUSED */
 int
-input_userauth_error(int type, u_int32_t seq, void *ctxt)
+input_userauth_error(int type, u_int32_t seq, struct ssh *ssh)
 {
 	fatal("input_userauth_error: bad message during authentication: "
 	    "type %d", type);
@@ -497,7 +504,7 @@
 
 /* ARGSUSED */
 int
-input_userauth_banner(int type, u_int32_t seq, void *ctxt)
+input_userauth_banner(int type, u_int32_t seq, struct ssh *ssh)
 {
 	char *msg, *lang;
 	u_int len;
@@ -514,9 +521,9 @@
 
 /* ARGSUSED */
 int
-input_userauth_success(int type, u_int32_t seq, void *ctxt)
+input_userauth_success(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 
 	if (authctxt == NULL)
 		fatal("input_userauth_success: no authentication context");
@@ -531,9 +538,9 @@
 }
 
 int
-input_userauth_success_unexpected(int type, u_int32_t seq, void *ctxt)
+input_userauth_success_unexpected(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 
 	if (authctxt == NULL)
 		fatal("%s: no authentication context", __func__);
@@ -545,18 +552,20 @@
 
 /* ARGSUSED */
 int
-input_userauth_failure(int type, u_int32_t seq, void *ctxt)
+input_userauth_failure(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	char *authlist = NULL;
-	int partial;
+	u_char partial;
+	int r;
 
 	if (authctxt == NULL)
 		fatal("input_userauth_failure: no authentication context");
 
-	authlist = packet_get_string(NULL);
-	partial = packet_get_char();
-	packet_check_eom();
+	if ((r = sshpkt_get_cstring(ssh, &authlist, NULL)) != 0 ||
+	    (r = sshpkt_get_u8(ssh, &partial)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		goto out;
 
 	if (partial != 0) {
 		verbose("Authenticated with partial success.");
@@ -566,46 +575,41 @@
 	debug("Authentications that can continue: %s", authlist);
 
 	userauth(authctxt, authlist);
+	authlist = NULL;
+ out:
+	free(authlist);
 	return 0;
 }
 
 /* ARGSUSED */
 int
-input_userauth_pk_ok(int type, u_int32_t seq, void *ctxt)
+input_userauth_pk_ok(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
-	Key *key = NULL;
+	Authctxt *authctxt = ssh->authctxt;
+	struct sshkey *key = NULL;
 	Identity *id = NULL;
-	Buffer b;
 	int pktype, sent = 0;
-	u_int alen, blen;
-	char *pkalg, *fp;
-	u_char *pkblob;
+	size_t blen;
+	char *pkalg = NULL, *fp;
+	u_char *pkblob = NULL;
+	int r;
 
 	if (authctxt == NULL)
 		fatal("input_userauth_pk_ok: no authentication context");
-	if (datafellows & SSH_BUG_PKOK) {
-		/* this is similar to SSH_BUG_PKAUTH */
-		debug2("input_userauth_pk_ok: SSH_BUG_PKOK");
-		pkblob = packet_get_string(&blen);
-		buffer_init(&b);
-		buffer_append(&b, pkblob, blen);
-		pkalg = buffer_get_string(&b, &alen);
-		buffer_free(&b);
-	} else {
-		pkalg = packet_get_string(&alen);
-		pkblob = packet_get_string(&blen);
-	}
-	packet_check_eom();
 
-	debug("Server accepts key: pkalg %s blen %u", pkalg, blen);
+	if ((r = sshpkt_get_cstring(ssh, &pkalg, NULL)) != 0 ||
+	    (r = sshpkt_get_string(ssh, &pkblob, &blen)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		goto done;
 
-	if ((pktype = key_type_from_name(pkalg)) == KEY_UNSPEC) {
+	debug("Server accepts key: pkalg %s blen %zu", pkalg, blen);
+
+	if ((pktype = sshkey_type_from_name(pkalg)) == KEY_UNSPEC) {
 		debug("unknown pkalg %s", pkalg);
 		goto done;
 	}
-	if ((key = key_from_blob(pkblob, blen)) == NULL) {
-		debug("no key from blob. pkalg %s", pkalg);
+	if ((r = sshkey_from_blob(pkblob, blen, &key)) != 0) {
+		debug("no key from blob. pkalg %s: %s", pkalg, ssh_err(r));
 		goto done;
 	}
 	if (key->type != pktype) {
@@ -626,32 +630,33 @@
 	 * duplicate keys
 	 */
 	TAILQ_FOREACH_REVERSE(id, &authctxt->keys, idlist, next) {
-		if (key_equal(key, id->key)) {
-			sent = sign_and_send_pubkey(authctxt, id);
+		if (sshkey_equal(key, id->key)) {
+			sent = sign_and_send_pubkey(ssh, authctxt, id);
 			break;
 		}
 	}
-done:
-	if (key != NULL)
-		key_free(key);
+	r = 0;
+ done:
+	sshkey_free(key);
 	free(pkalg);
 	free(pkblob);
 
 	/* try another method if we did not send a packet */
-	if (sent == 0)
+	if (r == 0 && sent == 0)
 		userauth(authctxt, NULL);
-	return 0;
+	return r;
 }
 
 #ifdef GSSAPI
 int
 userauth_gssapi(Authctxt *authctxt)
 {
+	struct ssh *ssh = active_state; /* XXX */
 	Gssctxt *gssctxt = NULL;
 	static gss_OID_set gss_supported = NULL;
 	static u_int mech = 0;
 	OM_uint32 min;
-	int ok = 0;
+	int r, ok = 0;
 
 	/* Try one GSSAPI method at a time, rather than sending them all at
 	 * once. */
@@ -663,7 +668,7 @@
 	while (mech < gss_supported->count && !ok) {
 		/* My DER encoding requires length<128 */
 		if (gss_supported->elements[mech].length < 128 &&
-		    ssh_gssapi_check_mechanism(&gssctxt, 
+		    ssh_gssapi_check_mechanism(&gssctxt,
 		    &gss_supported->elements[mech], authctxt->host)) {
 			ok = 1; /* Mechanism works */
 		} else {
@@ -676,25 +681,26 @@
 
 	authctxt->methoddata=(void *)gssctxt;
 
-	packet_start(SSH2_MSG_USERAUTH_REQUEST);
-	packet_put_cstring(authctxt->server_user);
-	packet_put_cstring(authctxt->service);
-	packet_put_cstring(authctxt->method->name);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, 1)) != 0 ||
+	    (r = sshpkt_put_u32(ssh,
+	    (gss_supported->elements[mech].length) + 2)) != 0 ||
+	    (r = sshpkt_put_u8(ssh, SSH_GSS_OIDTYPE)) != 0 ||
+	    (r = sshpkt_put_u8(ssh,
+	    gss_supported->elements[mech].length)) != 0 ||
+	    (r = sshpkt_put(ssh,
+	    gss_supported->elements[mech].elements,
+	    gss_supported->elements[mech].length)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
-	packet_put_int(1);
-
-	packet_put_int((gss_supported->elements[mech].length) + 2);
-	packet_put_char(SSH_GSS_OIDTYPE);
-	packet_put_char(gss_supported->elements[mech].length);
-	packet_put_raw(gss_supported->elements[mech].elements,
-	    gss_supported->elements[mech].length);
-
-	packet_send();
-
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_RESPONSE, &input_gssapi_response);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, &input_gssapi_token);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERROR, &input_gssapi_error);
-	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, &input_gssapi_errtok);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_RESPONSE, &input_gssapi_response);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, &input_gssapi_token);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERROR, &input_gssapi_error);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, &input_gssapi_errtok);
 
 	mech++; /* Move along to next candidate */
 
@@ -702,52 +708,64 @@
 }
 
 static OM_uint32
-process_gssapi_token(void *ctxt, gss_buffer_t recv_tok)
+process_gssapi_token(struct ssh *ssh, gss_buffer_t recv_tok)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	Gssctxt *gssctxt = authctxt->methoddata;
 	gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
 	gss_buffer_desc mic = GSS_C_EMPTY_BUFFER;
 	gss_buffer_desc gssbuf;
 	OM_uint32 status, ms, flags;
-	Buffer b;
+	int r;
 
 	status = ssh_gssapi_init_ctx(gssctxt, options.gss_deleg_creds,
 	    recv_tok, &send_tok, &flags);
 
 	if (send_tok.length > 0) {
-		if (GSS_ERROR(status))
-			packet_start(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK);
-		else
-			packet_start(SSH2_MSG_USERAUTH_GSSAPI_TOKEN);
+		u_char type = GSS_ERROR(status) ?
+		    SSH2_MSG_USERAUTH_GSSAPI_ERRTOK :
+		    SSH2_MSG_USERAUTH_GSSAPI_TOKEN;
 
-		packet_put_string(send_tok.value, send_tok.length);
-		packet_send();
+		if ((r = sshpkt_start(ssh, type)) != 0 ||
+		    (r = sshpkt_put_string(ssh, send_tok.value,
+		    send_tok.length)) != 0 ||
+		    (r = sshpkt_send(ssh)) != 0)
+			fatal("%s: %s", __func__, ssh_err(r));
+
 		gss_release_buffer(&ms, &send_tok);
 	}
 
 	if (status == GSS_S_COMPLETE) {
 		/* send either complete or MIC, depending on mechanism */
 		if (!(flags & GSS_C_INTEG_FLAG)) {
-			packet_start(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE);
-			packet_send();
+			if ((r = sshpkt_start(ssh,
+			    SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE)) != 0 ||
+			    (r = sshpkt_send(ssh)) != 0)
+				fatal("%s: %s", __func__, ssh_err(r));
 		} else {
-			ssh_gssapi_buildmic(&b, authctxt->server_user,
+			struct sshbuf *b;
+
+			if ((b = sshbuf_new()) == NULL)
+				fatal("%s: sshbuf_new failed", __func__);
+			ssh_gssapi_buildmic(b, authctxt->server_user,
 			    authctxt->service, "gssapi-with-mic");
 
-			gssbuf.value = buffer_ptr(&b);
-			gssbuf.length = buffer_len(&b);
+			if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL)
+				fatal("%s: sshbuf_mutable_ptr failed", __func__);
+			gssbuf.length = sshbuf_len(b);
 
 			status = ssh_gssapi_sign(gssctxt, &gssbuf, &mic);
 
 			if (!GSS_ERROR(status)) {
-				packet_start(SSH2_MSG_USERAUTH_GSSAPI_MIC);
-				packet_put_string(mic.value, mic.length);
-
-				packet_send();
+				if ((r = sshpkt_start(ssh,
+				    SSH2_MSG_USERAUTH_GSSAPI_MIC)) != 0 ||
+				    (r = sshpkt_put_string(ssh, mic.value,
+				    mic.length)) != 0 ||
+				    (r = sshpkt_send(ssh)) != 0)
+					fatal("%s: %s", __func__, ssh_err(r));
 			}
 
-			buffer_free(&b);
+			sshbuf_free(b);
 			gss_release_buffer(&ms, &mic);
 		}
 	}
@@ -757,99 +775,111 @@
 
 /* ARGSUSED */
 int
-input_gssapi_response(int type, u_int32_t plen, void *ctxt)
+input_gssapi_response(int type, u_int32_t plen, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	Gssctxt *gssctxt;
-	int oidlen;
-	char *oidv;
+	size_t oidlen;
+	u_char *oidv = NULL;
+	int r;
 
 	if (authctxt == NULL)
 		fatal("input_gssapi_response: no authentication context");
 	gssctxt = authctxt->methoddata;
 
 	/* Setup our OID */
-	oidv = packet_get_string(&oidlen);
+	if ((r = sshpkt_get_string(ssh, &oidv, &oidlen)) != 0)
+		goto done;
 
 	if (oidlen <= 2 ||
 	    oidv[0] != SSH_GSS_OIDTYPE ||
 	    oidv[1] != oidlen - 2) {
-		free(oidv);
 		debug("Badly encoded mechanism OID received");
 		userauth(authctxt, NULL);
-		return 0;
+		goto ok;
 	}
 
 	if (!ssh_gssapi_check_oid(gssctxt, oidv + 2, oidlen - 2))
 		fatal("Server returned different OID than expected");
 
-	packet_check_eom();
+	if ((r = sshpkt_get_end(ssh)) != 0)
+		goto done;
 
-	free(oidv);
-
-	if (GSS_ERROR(process_gssapi_token(ctxt, GSS_C_NO_BUFFER))) {
+	if (GSS_ERROR(process_gssapi_token(ssh, GSS_C_NO_BUFFER))) {
 		/* Start again with next method on list */
 		debug("Trying to start again");
 		userauth(authctxt, NULL);
-		return 0;
+		goto ok;
 	}
-	return 0;
+ ok:
+	r = 0;
+ done:
+	free(oidv);
+	return r;
 }
 
 /* ARGSUSED */
 int
-input_gssapi_token(int type, u_int32_t plen, void *ctxt)
+input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	gss_buffer_desc recv_tok;
+	u_char *p = NULL;
+	size_t len;
 	OM_uint32 status;
-	u_int slen;
+	int r;
 
 	if (authctxt == NULL)
 		fatal("input_gssapi_response: no authentication context");
 
-	recv_tok.value = packet_get_string(&slen);
-	recv_tok.length = slen;	/* safe typecast */
+	if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		goto out;
 
-	packet_check_eom();
+	recv_tok.value = p;
+	recv_tok.length = len;
+	status = process_gssapi_token(ssh, &recv_tok);
 
-	status = process_gssapi_token(ctxt, &recv_tok);
-
-	free(recv_tok.value);
-
+	/* Start again with the next method in the list */
 	if (GSS_ERROR(status)) {
-		/* Start again with the next method in the list */
 		userauth(authctxt, NULL);
-		return 0;
+		/* ok */
 	}
-	return 0;
+	r = 0;
+ out:
+	free(p);
+	return r;
 }
 
 /* ARGSUSED */
 int
-input_gssapi_errtok(int type, u_int32_t plen, void *ctxt)
+input_gssapi_errtok(int type, u_int32_t plen, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
+	Authctxt *authctxt = ssh->authctxt;
 	Gssctxt *gssctxt;
 	gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
 	gss_buffer_desc recv_tok;
 	OM_uint32 ms;
-	u_int len;
+	u_char *p = NULL;
+	size_t len;
+	int r;
 
 	if (authctxt == NULL)
 		fatal("input_gssapi_response: no authentication context");
 	gssctxt = authctxt->methoddata;
 
-	recv_tok.value = packet_get_string(&len);
-	recv_tok.length = len;
-
-	packet_check_eom();
+	if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0) {
+		free(p);
+		return r;
+	}
 
 	/* Stick it into GSSAPI and see what it says */
+	recv_tok.value = p;
+	recv_tok.length = len;
 	(void)ssh_gssapi_init_ctx(gssctxt, options.gss_deleg_creds,
 	    &recv_tok, &send_tok, NULL);
-
-	free(recv_tok.value);
+	free(p);
 	gss_release_buffer(&ms, &send_tok);
 
 	/* Server will be returning a failed packet after this one */
@@ -858,45 +888,52 @@
 
 /* ARGSUSED */
 int
-input_gssapi_error(int type, u_int32_t plen, void *ctxt)
+input_gssapi_error(int type, u_int32_t plen, struct ssh *ssh)
 {
-	char *msg;
-	char *lang;
+	char *msg = NULL;
+	char *lang = NULL;
+	int r;
 
-	/* maj */(void)packet_get_int();
-	/* min */(void)packet_get_int();
-	msg=packet_get_string(NULL);
-	lang=packet_get_string(NULL);
-
-	packet_check_eom();
-
+	if ((r = sshpkt_get_u32(ssh, NULL)) != 0 ||	/* maj */
+	    (r = sshpkt_get_u32(ssh, NULL)) != 0 ||	/* min */
+	    (r = sshpkt_get_cstring(ssh, &msg, NULL)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &lang, NULL)) != 0)
+		goto out;
+	r = sshpkt_get_end(ssh);
 	debug("Server GSSAPI Error:\n%s", msg);
+ out:
 	free(msg);
 	free(lang);
-	return 0;
+	return r;
 }
 #endif /* GSSAPI */
 
 int
 userauth_none(Authctxt *authctxt)
 {
+	struct ssh *ssh = active_state; /* XXX */
+	int r;
+
 	/* initial userauth request */
-	packet_start(SSH2_MSG_USERAUTH_REQUEST);
-	packet_put_cstring(authctxt->server_user);
-	packet_put_cstring(authctxt->service);
-	packet_put_cstring(authctxt->method->name);
-	packet_send();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 	return 1;
 }
 
 int
 userauth_passwd(Authctxt *authctxt)
 {
+	struct ssh *ssh = active_state; /* XXX */
 	static int attempt = 0;
-	char prompt[150];
+	char prompt[256];
 	char *password;
 	const char *host = options.host_key_alias ?  options.host_key_alias :
 	    authctxt->host;
+	int r;
 
 	if (attempt++ >= options.number_of_password_prompts)
 		return 0;
@@ -907,18 +944,20 @@
 	snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",
 	    authctxt->server_user, host);
 	password = read_passphrase(prompt, 0);
-	packet_start(SSH2_MSG_USERAUTH_REQUEST);
-	packet_put_cstring(authctxt->server_user);
-	packet_put_cstring(authctxt->service);
-	packet_put_cstring(authctxt->method->name);
-	packet_put_char(0);
-	packet_put_cstring(password);
-	explicit_bzero(password, strlen(password));
-	free(password);
-	packet_add_padding(64);
-	packet_send();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
+	    (r = sshpkt_put_u8(ssh, 0)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, password)) != 0 ||
+	    (r = sshpkt_add_padding(ssh, 64)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
-	dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,
+	if (password)
+		freezero(password, strlen(password));
+
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,
 	    &input_userauth_passwd_changereq);
 
 	return 1;
@@ -929,12 +968,13 @@
  */
 /* ARGSUSED */
 int
-input_userauth_passwd_changereq(int type, u_int32_t seqnr, void *ctxt)
+input_userauth_passwd_changereq(int type, u_int32_t seqnr, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
-	char *info, *lang, *password = NULL, *retype = NULL;
-	char prompt[150];
+	Authctxt *authctxt = ssh->authctxt;
+	char *info = NULL, *lang = NULL, *password = NULL, *retype = NULL;
+	char prompt[256];
 	const char *host;
+	int r;
 
 	debug2("input_userauth_passwd_changereq");
 
@@ -943,24 +983,26 @@
 		    "no authentication context");
 	host = options.host_key_alias ? options.host_key_alias : authctxt->host;
 
-	info = packet_get_string(NULL);
-	lang = packet_get_string(NULL);
+	if ((r = sshpkt_get_cstring(ssh, &info, NULL)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &lang, NULL)) != 0)
+		goto out;
 	if (strlen(info) > 0)
 		logit("%s", info);
-	free(info);
-	free(lang);
-	packet_start(SSH2_MSG_USERAUTH_REQUEST);
-	packet_put_cstring(authctxt->server_user);
-	packet_put_cstring(authctxt->service);
-	packet_put_cstring(authctxt->method->name);
-	packet_put_char(1);			/* additional info */
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
+	    (r = sshpkt_put_u8(ssh, 1)) != 0)	/* additional info */
+		goto out;
+
 	snprintf(prompt, sizeof(prompt),
 	    "Enter %.30s@%.128s's old password: ",
 	    authctxt->server_user, host);
 	password = read_passphrase(prompt, 0);
-	packet_put_cstring(password);
-	explicit_bzero(password, strlen(password));
-	free(password);
+	if ((r = sshpkt_put_cstring(ssh, password)) != 0)
+		goto out;
+
+	freezero(password, strlen(password));
 	password = NULL;
 	while (password == NULL) {
 		snprintf(prompt, sizeof(prompt),
@@ -969,141 +1011,196 @@
 		password = read_passphrase(prompt, RP_ALLOW_EOF);
 		if (password == NULL) {
 			/* bail out */
-			return 0;
+			r = 0;
+			goto out;
 		}
 		snprintf(prompt, sizeof(prompt),
 		    "Retype %.30s@%.128s's new password: ",
 		    authctxt->server_user, host);
 		retype = read_passphrase(prompt, 0);
 		if (strcmp(password, retype) != 0) {
-			explicit_bzero(password, strlen(password));
-			free(password);
+			freezero(password, strlen(password));
 			logit("Mismatch; try again, EOF to quit.");
 			password = NULL;
 		}
-		explicit_bzero(retype, strlen(retype));
-		free(retype);
+		freezero(retype, strlen(retype));
 	}
-	packet_put_cstring(password);
-	explicit_bzero(password, strlen(password));
-	free(password);
-	packet_add_padding(64);
-	packet_send();
+	if ((r = sshpkt_put_cstring(ssh, password)) != 0 ||
+	    (r = sshpkt_add_padding(ssh, 64)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		goto out;
 
-	dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,
 	    &input_userauth_passwd_changereq);
-	return 0;
+	r = 0;
+ out:
+	if (password)
+		freezero(password, strlen(password));
+	free(info);
+	free(lang);
+	return r;
 }
 
-static const char *
-identity_sign_encode(struct identity *id)
+/*
+ * Select an algorithm for publickey signatures.
+ * Returns algorithm (caller must free) or NULL if no mutual algorithm found.
+ *
+ * Call with ssh==NULL to ignore server-sig-algs extension list and
+ * only attempt with the key's base signature type.
+ */
+static char *
+key_sig_algorithm(struct ssh *ssh, const struct sshkey *key)
 {
-	struct ssh *ssh = active_state;
+	char *allowed, *oallowed, *cp, *tmp, *alg = NULL;
 
-	if (id->key->type == KEY_RSA) {
-		switch (ssh->kex->rsa_sha2) {
-		case 256:
-			return "rsa-sha2-256";
-		case 512:
-			return "rsa-sha2-512";
-		}
+	/*
+	 * The signature algorithm will only differ from the key algorithm
+	 * for RSA keys/certs and when the server advertises support for
+	 * newer (SHA2) algorithms.
+	 */
+	if (ssh == NULL || ssh->kex->server_sig_algs == NULL ||
+	    (key->type != KEY_RSA && key->type != KEY_RSA_CERT)) {
+		/* Filter base key signature alg against our configuration */
+		return match_list(sshkey_ssh_name(key),
+		    options.pubkey_key_types, NULL);
 	}
-	return key_ssh_name(id->key);
+
+	/*
+	 * For RSA keys/certs, since these might have a different sig type:
+	 * find the first entry in PubkeyAcceptedKeyTypes of the right type
+	 * that also appears in the supported signature algorithms list from
+	 * the server.
+	 */
+	oallowed = allowed = xstrdup(options.pubkey_key_types);
+	while ((cp = strsep(&allowed, ",")) != NULL) {
+		if (sshkey_type_from_name(cp) != key->type)
+			continue;
+		tmp = match_list(sshkey_sigalg_by_name(cp), ssh->kex->server_sig_algs, NULL);
+		if (tmp != NULL)
+			alg = xstrdup(cp);
+		free(tmp);
+		if (alg != NULL)
+			break;
+	}
+	free(oallowed);
+	return alg;
 }
 
 static int
 identity_sign(struct identity *id, u_char **sigp, size_t *lenp,
-    const u_char *data, size_t datalen, u_int compat)
+    const u_char *data, size_t datalen, u_int compat, const char *alg)
 {
-	Key *prv;
-	int ret;
-	const char *alg;
+	struct sshkey *prv;
+	int r;
 
-	alg = identity_sign_encode(id);
-
-	/* the agent supports this key */
-	if (id->agent_fd != -1)
+	/* The agent supports this key. */
+	if (id->key != NULL && id->agent_fd != -1) {
 		return ssh_agent_sign(id->agent_fd, id->key, sigp, lenp,
 		    data, datalen, alg, compat);
+	}
 
 	/*
-	 * we have already loaded the private key or
-	 * the private key is stored in external hardware
+	 * We have already loaded the private key or the private key is
+	 * stored in external hardware.
 	 */
-	if (id->isprivate || (id->key->flags & SSHKEY_FLAG_EXT))
-		return (sshkey_sign(id->key, sigp, lenp, data, datalen, alg,
-		    compat));
-	/* load the private key from the file */
+	if (id->key != NULL &&
+	    (id->isprivate || (id->key->flags & SSHKEY_FLAG_EXT))) {
+		if ((r = sshkey_sign(id->key, sigp, lenp, data, datalen,
+		    alg, compat)) != 0)
+			return r;
+		/*
+		 * PKCS#11 tokens may not support all signature algorithms,
+		 * so check what we get back.
+		 */
+		if ((r = sshkey_check_sigtype(*sigp, *lenp, alg)) != 0)
+			return r;
+		return 0;
+	}
+
+	/* Load the private key from the file. */
 	if ((prv = load_identity_file(id)) == NULL)
 		return SSH_ERR_KEY_NOT_FOUND;
-	ret = sshkey_sign(prv, sigp, lenp, data, datalen, alg, compat);
+	if (id->key != NULL && !sshkey_equal_public(prv, id->key)) {
+		error("%s: private key %s contents do not match public",
+		   __func__, id->filename);
+		return SSH_ERR_KEY_NOT_FOUND;
+	}
+	r = sshkey_sign(prv, sigp, lenp, data, datalen, alg, compat);
 	sshkey_free(prv);
-	return (ret);
+	return r;
 }
 
 static int
-sign_and_send_pubkey(Authctxt *authctxt, Identity *id)
+id_filename_matches(Identity *id, Identity *private_id)
 {
-	Buffer b;
-	Identity *private_id;
-	u_char *blob, *signature;
-	size_t slen;
-	u_int bloblen, skip = 0;
-	int matched, ret = -1, have_sig = 1;
-	char *fp;
+	const char *suffixes[] = { ".pub", "-cert.pub", NULL };
+	size_t len = strlen(id->filename), plen = strlen(private_id->filename);
+	size_t i, slen;
+
+	if (strcmp(id->filename, private_id->filename) == 0)
+		return 1;
+	for (i = 0; suffixes[i]; i++) {
+		slen = strlen(suffixes[i]);
+		if (len > slen && plen == len - slen &&
+		    strcmp(id->filename + (len - slen), suffixes[i]) == 0 &&
+		    memcmp(id->filename, private_id->filename, plen) == 0)
+			return 1;
+	}
+	return 0;
+}
+
+static int
+sign_and_send_pubkey(struct ssh *ssh, Authctxt *authctxt, Identity *id)
+{
+	struct sshbuf *b = NULL;
+	Identity *private_id, *sign_id = NULL;
+	u_char *signature = NULL;
+	size_t slen = 0, skip = 0;
+	int r, fallback_sigtype, sent = 0;
+	char *alg = NULL, *fp = NULL;
+	const char *loc = "";
 
 	if ((fp = sshkey_fingerprint(id->key, options.fingerprint_hash,
 	    SSH_FP_DEFAULT)) == NULL)
 		return 0;
-	debug3("%s: %s %s", __func__, key_type(id->key), fp);
-	free(fp);
 
-	if (key_to_blob(id->key, &blob, &bloblen) == 0) {
-		/* we cannot handle this key */
-		debug3("sign_and_send_pubkey: cannot handle key");
-		return 0;
-	}
-	/* data to be signed */
-	buffer_init(&b);
-	if (datafellows & SSH_OLD_SESSIONID) {
-		buffer_append(&b, session_id2, session_id2_len);
-		skip = session_id2_len;
-	} else {
-		buffer_put_string(&b, session_id2, session_id2_len);
-		skip = buffer_len(&b);
-	}
-	buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
-	buffer_put_cstring(&b, authctxt->server_user);
-	buffer_put_cstring(&b,
-	    datafellows & SSH_BUG_PKSERVICE ?
-	    "ssh-userauth" :
-	    authctxt->service);
-	if (datafellows & SSH_BUG_PKAUTH) {
-		buffer_put_char(&b, have_sig);
-	} else {
-		buffer_put_cstring(&b, authctxt->method->name);
-		buffer_put_char(&b, have_sig);
-		buffer_put_cstring(&b, identity_sign_encode(id));
-	}
-	buffer_put_string(&b, blob, bloblen);
+	debug3("%s: %s %s", __func__, sshkey_type(id->key), fp);
 
 	/*
 	 * If the key is an certificate, try to find a matching private key
 	 * and use it to complete the signature.
 	 * If no such private key exists, fall back to trying the certificate
 	 * key itself in case it has a private half already loaded.
+	 * This will try to set sign_id to the private key that will perform
+	 * the signature.
 	 */
-	if (key_is_cert(id->key)) {
-		matched = 0;
+	if (sshkey_is_cert(id->key)) {
 		TAILQ_FOREACH(private_id, &authctxt->keys, next) {
 			if (sshkey_equal_public(id->key, private_id->key) &&
 			    id->key->type != private_id->key->type) {
-				id = private_id;
-				matched = 1;
+				sign_id = private_id;
 				break;
 			}
 		}
-		if (matched) {
+		/*
+		 * Exact key matches are preferred, but also allow
+		 * filename matches for non-PKCS#11/agent keys that
+		 * didn't load public keys. This supports the case
+		 * of keeping just a private key file and public
+		 * certificate on disk.
+		 */
+		if (sign_id == NULL &&
+		    !id->isprivate && id->agent_fd == -1 &&
+		    (id->key->flags & SSHKEY_FLAG_EXT) == 0) {
+			TAILQ_FOREACH(private_id, &authctxt->keys, next) {
+				if (private_id->key == NULL &&
+				    id_filename_matches(id, private_id)) {
+					sign_id = private_id;
+					break;
+				}
+			}
+		}
+		if (sign_id != NULL) {
 			debug2("%s: using private key \"%s\"%s for "
 			    "certificate", __func__, id->filename,
 			    id->agent_fd != -1 ? " from agent" : "");
@@ -1113,85 +1210,147 @@
 		}
 	}
 
-	/* generate signature */
-	ret = identity_sign(id, &signature, &slen,
-	    buffer_ptr(&b), buffer_len(&b), datafellows);
-	if (ret != 0) {
-		if (ret != SSH_ERR_KEY_NOT_FOUND)
-			error("%s: signing failed: %s", __func__, ssh_err(ret));
-		free(blob);
-		buffer_free(&b);
-		return 0;
+	/*
+	 * If the above didn't select another identity to do the signing
+	 * then default to the one we started with.
+	 */
+	if (sign_id == NULL)
+		sign_id = id;
+
+	/* assemble and sign data */
+	for (fallback_sigtype = 0; fallback_sigtype <= 1; fallback_sigtype++) {
+		free(alg);
+		slen = 0;
+		signature = NULL;
+		if ((alg = key_sig_algorithm(fallback_sigtype ? NULL : ssh,
+		    id->key)) == NULL) {
+			error("%s: no mutual signature supported", __func__);
+			goto out;
+		}
+		debug3("%s: signing using %s", __func__, alg);
+
+		sshbuf_free(b);
+		if ((b = sshbuf_new()) == NULL)
+			fatal("%s: sshbuf_new failed", __func__);
+		if (datafellows & SSH_OLD_SESSIONID) {
+			if ((r = sshbuf_put(b, session_id2,
+			    session_id2_len)) != 0) {
+				fatal("%s: sshbuf_put: %s",
+				    __func__, ssh_err(r));
+			}
+		} else {
+			if ((r = sshbuf_put_string(b, session_id2,
+			    session_id2_len)) != 0) {
+				fatal("%s: sshbuf_put_string: %s",
+				    __func__, ssh_err(r));
+			}
+		}
+		skip = sshbuf_len(b);
+		if ((r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+		    (r = sshbuf_put_cstring(b, authctxt->server_user)) != 0 ||
+		    (r = sshbuf_put_cstring(b, authctxt->service)) != 0 ||
+		    (r = sshbuf_put_cstring(b, authctxt->method->name)) != 0 ||
+		    (r = sshbuf_put_u8(b, 1)) != 0 ||
+		    (r = sshbuf_put_cstring(b, alg)) != 0 ||
+		    (r = sshkey_puts(id->key, b)) != 0) {
+			fatal("%s: assemble signed data: %s",
+			    __func__, ssh_err(r));
+		}
+
+		/* generate signature */
+		r = identity_sign(sign_id, &signature, &slen,
+		    sshbuf_ptr(b), sshbuf_len(b), datafellows, alg);
+		if (r == 0)
+			break;
+		else if (r == SSH_ERR_KEY_NOT_FOUND)
+			goto out; /* soft failure */
+		else if (r == SSH_ERR_SIGN_ALG_UNSUPPORTED &&
+		    !fallback_sigtype) {
+			if (sign_id->agent_fd != -1)
+				loc = "agent ";
+			else if ((sign_id->key->flags & SSHKEY_FLAG_EXT) != 0)
+				loc = "token ";
+			logit("%skey %s %s returned incorrect signature type",
+			    loc, sshkey_type(id->key), fp);
+			continue;
+		}
+		error("%s: signing failed: %s", __func__, ssh_err(r));
+		goto out;
 	}
-#ifdef DEBUG_PK
-	buffer_dump(&b);
-#endif
-	if (datafellows & SSH_BUG_PKSERVICE) {
-		buffer_clear(&b);
-		buffer_append(&b, session_id2, session_id2_len);
-		skip = session_id2_len;
-		buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
-		buffer_put_cstring(&b, authctxt->server_user);
-		buffer_put_cstring(&b, authctxt->service);
-		buffer_put_cstring(&b, authctxt->method->name);
-		buffer_put_char(&b, have_sig);
-		if (!(datafellows & SSH_BUG_PKAUTH))
-			buffer_put_cstring(&b, key_ssh_name(id->key));
-		buffer_put_string(&b, blob, bloblen);
-	}
-	free(blob);
+	if (slen == 0 || signature == NULL) /* shouldn't happen */
+		fatal("%s: no signature", __func__);
 
 	/* append signature */
-	buffer_put_string(&b, signature, slen);
-	free(signature);
+	if ((r = sshbuf_put_string(b, signature, slen)) != 0)
+		fatal("%s: append signature: %s", __func__, ssh_err(r));
 
+#ifdef DEBUG_PK
+	sshbuf_dump(b, stderr);
+#endif
 	/* skip session id and packet type */
-	if (buffer_len(&b) < skip + 1)
-		fatal("userauth_pubkey: internal error");
-	buffer_consume(&b, skip + 1);
+	if ((r = sshbuf_consume(b, skip + 1)) != 0)
+		fatal("%s: consume: %s", __func__, ssh_err(r));
 
 	/* put remaining data from buffer into packet */
-	packet_start(SSH2_MSG_USERAUTH_REQUEST);
-	packet_put_raw(buffer_ptr(&b), buffer_len(&b));
-	buffer_free(&b);
-	packet_send();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshpkt_putb(ssh, b)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: enqueue request: %s", __func__, ssh_err(r));
 
-	return 1;
+	/* success */
+	sent = 1;
+
+ out:
+	free(fp);
+	free(alg);
+	sshbuf_free(b);
+	freezero(signature, slen);
+	return sent;
 }
 
 static int
-send_pubkey_test(Authctxt *authctxt, Identity *id)
+send_pubkey_test(struct ssh *ssh, Authctxt *authctxt, Identity *id)
 {
-	u_char *blob;
-	u_int bloblen, have_sig = 0;
+	u_char *blob = NULL;
+	char *alg = NULL;
+	size_t bloblen;
+	u_int have_sig = 0;
+	int sent = 0, r;
 
-	debug3("send_pubkey_test");
+	if ((alg = key_sig_algorithm(ssh, id->key)) == NULL) {
+		debug("%s: no mutual signature algorithm", __func__);
+		goto out;
+	}
 
-	if (key_to_blob(id->key, &blob, &bloblen) == 0) {
+	if ((r = sshkey_to_blob(id->key, &blob, &bloblen)) != 0) {
 		/* we cannot handle this key */
-		debug3("send_pubkey_test: cannot handle key");
-		return 0;
+		debug3("%s: cannot handle key", __func__);
+		goto out;
 	}
 	/* register callback for USERAUTH_PK_OK message */
-	dispatch_set(SSH2_MSG_USERAUTH_PK_OK, &input_userauth_pk_ok);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_PK_OK, &input_userauth_pk_ok);
 
-	packet_start(SSH2_MSG_USERAUTH_REQUEST);
-	packet_put_cstring(authctxt->server_user);
-	packet_put_cstring(authctxt->service);
-	packet_put_cstring(authctxt->method->name);
-	packet_put_char(have_sig);
-	if (!(datafellows & SSH_BUG_PKAUTH))
-		packet_put_cstring(identity_sign_encode(id));
-	packet_put_string(blob, bloblen);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
+	    (r = sshpkt_put_u8(ssh, have_sig)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, alg)) != 0 ||
+	    (r = sshpkt_put_string(ssh, blob, bloblen)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
+	sent = 1;
+
+ out:
+	free(alg);
 	free(blob);
-	packet_send();
-	return 1;
+	return sent;
 }
 
-static Key *
+static struct sshkey *
 load_identity_file(Identity *id)
 {
-	Key *private = NULL;
+	struct sshkey *private = NULL;
 	char prompt[300], *passphrase, *comment;
 	int r, perm_ok = 0, quit = 0, i;
 	struct stat st;
@@ -1243,10 +1402,8 @@
 		    !(id->key && id->isprivate))
 			maybe_add_key_to_agent(id->filename, private, comment,
 			    passphrase);
-		if (i > 0) {
-			explicit_bzero(passphrase, strlen(passphrase));
-			free(passphrase);
-		}
+		if (i > 0)
+			freezero(passphrase, strlen(passphrase));
 		free(comment);
 		if (private != NULL || quit)
 			break;
@@ -1254,6 +1411,36 @@
 	return private;
 }
 
+static int
+key_type_allowed_by_config(struct sshkey *key)
+{
+	if (match_pattern_list(sshkey_ssh_name(key),
+	    options.pubkey_key_types, 0) == 1)
+		return 1;
+
+	/* RSA keys/certs might be allowed by alternate signature types */
+	switch (key->type) {
+	case KEY_RSA:
+		if (match_pattern_list("rsa-sha2-512",
+		    options.pubkey_key_types, 0) == 1)
+			return 1;
+		if (match_pattern_list("rsa-sha2-256",
+		    options.pubkey_key_types, 0) == 1)
+			return 1;
+		break;
+	case KEY_RSA_CERT:
+		if (match_pattern_list("rsa-sha2-512-cert-v01@openssh.com",
+		    options.pubkey_key_types, 0) == 1)
+			return 1;
+		if (match_pattern_list("rsa-sha2-256-cert-v01@openssh.com",
+		    options.pubkey_key_types, 0) == 1)
+			return 1;
+		break;
+	}
+	return 0;
+}
+
+
 /*
  * try keys in the following order:
  * 	1. certificates listed in the config file
@@ -1280,8 +1467,6 @@
 	/* list of keys stored in the filesystem and PKCS#11 */
 	for (i = 0; i < options.num_identity_files; i++) {
 		key = options.identity_keys[i];
-		if (key && key->type == KEY_RSA1)
-			continue;
 		if (key && key->cert && key->cert->type != SSH2_CERT_TYPE_USER)
 			continue;
 		options.identity_keys[i] = NULL;
@@ -1295,7 +1480,7 @@
 	/* list of certificates specified by user */
 	for (i = 0; i < options.num_certificate_files; i++) {
 		key = options.certificates[i];
-		if (!key_is_cert(key) || key->cert == NULL ||
+		if (!sshkey_is_cert(key) || key->cert == NULL ||
 		    key->cert->type != SSH2_CERT_TYPE_USER)
 			continue;
 		id = xcalloc(1, sizeof(*id));
@@ -1310,7 +1495,7 @@
 		if (r != SSH_ERR_AGENT_NOT_PRESENT)
 			debug("%s: ssh_get_authentication_socket: %s",
 			    __func__, ssh_err(r));
-	} else if ((r = ssh_fetch_identitylist(agent_fd, 2, &idlist)) != 0) {
+	} else if ((r = ssh_fetch_identitylist(agent_fd, &idlist)) != 0) {
 		if (r != SSH_ERR_AGENT_NO_IDENTITIES)
 			debug("%s: ssh_fetch_identitylist: %s",
 			    __func__, ssh_err(r));
@@ -1369,8 +1554,7 @@
 		/* If IdentitiesOnly set and key not found then don't use it */
 		if (!found && options.identities_only) {
 			TAILQ_REMOVE(&files, id, next);
-			explicit_bzero(id, sizeof(*id));
-			free(id);
+			freezero(id, sizeof(*id));
 		}
 	}
 	/* append remaining keys from the config file */
@@ -1380,9 +1564,7 @@
 	}
 	/* finally, filter by PubkeyAcceptedKeyTypes */
 	TAILQ_FOREACH_SAFE(id, preferred, next, id2) {
-		if (id->key != NULL &&
-		    match_pattern_list(sshkey_ssh_name(id->key),
-		    options.pubkey_key_types, 0) != 1) {
+		if (id->key != NULL && !key_type_allowed_by_config(id->key)) {
 			debug("Skipping %s key %s - "
 			    "not in PubkeyAcceptedKeyTypes",
 			    sshkey_ssh_name(id->key), id->filename);
@@ -1428,20 +1610,22 @@
 {
 	if (!id->key)
 		return (0);
-	if (key_type_plain(id->key->type) == KEY_RSA &&
+	if (sshkey_type_plain(id->key->type) == KEY_RSA &&
 	    (datafellows & SSH_BUG_RSASIGMD5) != 0) {
 		debug("Skipped %s key %s for RSA/MD5 server",
-		    key_type(id->key), id->filename);
+		    sshkey_type(id->key), id->filename);
 		return (0);
 	}
-	return (id->key->type != KEY_RSA1);
+	return 1;
 }
 
 int
 userauth_pubkey(Authctxt *authctxt)
 {
+	struct ssh *ssh = active_state; /* XXX */
 	Identity *id;
 	int sent = 0;
+	char *fp;
 
 	while ((id = TAILQ_FIRST(&authctxt->keys))) {
 		if (id->tried++)
@@ -1456,9 +1640,17 @@
 		 */
 		if (id->key != NULL) {
 			if (try_identity(id)) {
-				debug("Offering %s public key: %s",
-				    key_type(id->key), id->filename);
-				sent = send_pubkey_test(authctxt, id);
+				if ((fp = sshkey_fingerprint(id->key,
+				    options.fingerprint_hash,
+				    SSH_FP_DEFAULT)) == NULL) {
+					error("%s: sshkey_fingerprint failed",
+					    __func__);
+					return 0;
+				}
+				debug("Offering public key: %s %s %s",
+				    sshkey_type(id->key), fp, id->filename);
+				free(fp);
+				sent = send_pubkey_test(ssh, authctxt, id);
 			}
 		} else {
 			debug("Trying private key: %s", id->filename);
@@ -1466,10 +1658,10 @@
 			if (id->key != NULL) {
 				if (try_identity(id)) {
 					id->isprivate = 1;
-					sent = sign_and_send_pubkey(
+					sent = sign_and_send_pubkey(ssh,
 					    authctxt, id);
 				}
-				key_free(id->key);
+				sshkey_free(id->key);
 				id->key = NULL;
 				id->isprivate = 0;
 			}
@@ -1486,28 +1678,31 @@
 int
 userauth_kbdint(Authctxt *authctxt)
 {
+	struct ssh *ssh = active_state; /* XXX */
 	static int attempt = 0;
+	int r;
 
 	if (attempt++ >= options.number_of_password_prompts)
 		return 0;
 	/* disable if no SSH2_MSG_USERAUTH_INFO_REQUEST has been seen */
 	if (attempt > 1 && !authctxt->info_req_seen) {
 		debug3("userauth_kbdint: disable: no info_req_seen");
-		dispatch_set(SSH2_MSG_USERAUTH_INFO_REQUEST, NULL);
+		ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_INFO_REQUEST, NULL);
 		return 0;
 	}
 
 	debug2("userauth_kbdint");
-	packet_start(SSH2_MSG_USERAUTH_REQUEST);
-	packet_put_cstring(authctxt->server_user);
-	packet_put_cstring(authctxt->service);
-	packet_put_cstring(authctxt->method->name);
-	packet_put_cstring("");					/* lang */
-	packet_put_cstring(options.kbd_interactive_devices ?
-	    options.kbd_interactive_devices : "");
-	packet_send();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, "")) != 0 ||		/* lang */
+	    (r = sshpkt_put_cstring(ssh, options.kbd_interactive_devices ?
+	    options.kbd_interactive_devices : "")) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		fatal("%s: %s", __func__, ssh_err(r));
 
-	dispatch_set(SSH2_MSG_USERAUTH_INFO_REQUEST, &input_userauth_info_req);
+	ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_INFO_REQUEST, &input_userauth_info_req);
 	return 1;
 }
 
@@ -1515,12 +1710,14 @@
  * parse INFO_REQUEST, prompt user and send INFO_RESPONSE
  */
 int
-input_userauth_info_req(int type, u_int32_t seq, void *ctxt)
+input_userauth_info_req(int type, u_int32_t seq, struct ssh *ssh)
 {
-	Authctxt *authctxt = ctxt;
-	char *name, *inst, *lang, *prompt, *response;
+	Authctxt *authctxt = ssh->authctxt;
+	char *name = NULL, *inst = NULL, *lang = NULL, *prompt = NULL;
+	char *response = NULL;
+	u_char echo = 0;
 	u_int num_prompts, i;
-	int echo = 0;
+	int r;
 
 	debug2("input_userauth_info_req");
 
@@ -1529,44 +1726,52 @@
 
 	authctxt->info_req_seen = 1;
 
-	name = packet_get_string(NULL);
-	inst = packet_get_string(NULL);
-	lang = packet_get_string(NULL);
+	if ((r = sshpkt_get_cstring(ssh, &name, NULL)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &inst, NULL)) != 0 ||
+	    (r = sshpkt_get_cstring(ssh, &lang, NULL)) != 0)
+		goto out;
 	if (strlen(name) > 0)
 		logit("%s", name);
 	if (strlen(inst) > 0)
 		logit("%s", inst);
-	free(name);
-	free(inst);
-	free(lang);
 
-	num_prompts = packet_get_int();
+	if ((r = sshpkt_get_u32(ssh, &num_prompts)) != 0)
+		goto out;
 	/*
 	 * Begin to build info response packet based on prompts requested.
 	 * We commit to providing the correct number of responses, so if
 	 * further on we run into a problem that prevents this, we have to
 	 * be sure and clean this up and send a correct error response.
 	 */
-	packet_start(SSH2_MSG_USERAUTH_INFO_RESPONSE);
-	packet_put_int(num_prompts);
+	if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_INFO_RESPONSE)) != 0 ||
+	    (r = sshpkt_put_u32(ssh, num_prompts)) != 0)
+		goto out;
 
 	debug2("input_userauth_info_req: num_prompts %d", num_prompts);
 	for (i = 0; i < num_prompts; i++) {
-		prompt = packet_get_string(NULL);
-		echo = packet_get_char();
-
+		if ((r = sshpkt_get_cstring(ssh, &prompt, NULL)) != 0 ||
+		    (r = sshpkt_get_u8(ssh, &echo)) != 0)
+			goto out;
 		response = read_passphrase(prompt, echo ? RP_ECHO : 0);
-
-		packet_put_cstring(response);
-		explicit_bzero(response, strlen(response));
-		free(response);
+		if ((r = sshpkt_put_cstring(ssh, response)) != 0)
+			goto out;
+		freezero(response, strlen(response));
 		free(prompt);
+		response = prompt = NULL;
 	}
-	packet_check_eom(); /* done with parsing incoming message. */
-
-	packet_add_padding(64);
-	packet_send();
-	return 0;
+	/* done with parsing incoming message. */
+	if ((r = sshpkt_get_end(ssh)) != 0 ||
+	    (r = sshpkt_add_padding(ssh, 64)) != 0)
+		goto out;
+	r = sshpkt_send(ssh);
+ out:
+	if (response)
+		freezero(response, strlen(response));
+	free(prompt);
+	free(name);
+	free(inst);
+	free(lang);
+	return r;
 }
 
 static int
@@ -1607,7 +1812,6 @@
 	if (pid == 0) {
 		/* keep the socket on exec */
 		fcntl(sock, F_SETFD, 0);
-		permanently_drop_suid(getuid());
 		close(from[0]);
 		if (dup2(from[1], STDOUT_FILENO) < 0)
 			fatal("%s: dup2: %s", __func__, strerror(errno));
@@ -1687,10 +1891,9 @@
 int
 userauth_hostbased(Authctxt *authctxt)
 {
-	struct ssh *ssh = active_state;
+	struct ssh *ssh = active_state; /* XXX */
 	struct sshkey *private = NULL;
 	struct sshbuf *b = NULL;
-	const char *service;
 	u_char *sig = NULL, *keyblob = NULL;
 	char *fp = NULL, *chost = NULL, *lname = NULL;
 	size_t siglen = 0, keylen = 0;
@@ -1718,7 +1921,6 @@
 		private = NULL;
 		for (i = 0; i < authctxt->sensitive->nkeys; i++) {
 			if (authctxt->sensitive->keys[i] == NULL ||
-			    authctxt->sensitive->keys[i]->type == KEY_RSA1 ||
 			    authctxt->sensitive->keys[i]->type == KEY_UNSPEC)
 				continue;
 			if (match_pattern_list(
@@ -1762,9 +1964,6 @@
 	xasprintf(&chost, "%s.", lname);
 	debug2("%s: chost %s", __func__, chost);
 
-	service = datafellows & SSH_BUG_HBSERVICE ? "ssh-userauth" :
-	    authctxt->service;
-
 	/* construct data */
 	if ((b = sshbuf_new()) == NULL) {
 		error("%s: sshbuf_new failed", __func__);
@@ -1777,9 +1976,9 @@
 	if ((r = sshbuf_put_string(b, session_id2, session_id2_len)) != 0 ||
 	    (r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
 	    (r = sshbuf_put_cstring(b, authctxt->server_user)) != 0 ||
-	    (r = sshbuf_put_cstring(b, service)) != 0 ||
+	    (r = sshbuf_put_cstring(b, authctxt->service)) != 0 ||
 	    (r = sshbuf_put_cstring(b, authctxt->method->name)) != 0 ||
-	    (r = sshbuf_put_cstring(b, key_ssh_name(private))) != 0 ||
+	    (r = sshbuf_put_cstring(b, sshkey_ssh_name(private))) != 0 ||
 	    (r = sshbuf_put_string(b, keyblob, keylen)) != 0 ||
 	    (r = sshbuf_put_cstring(b, chost)) != 0 ||
 	    (r = sshbuf_put_cstring(b, authctxt->local_user)) != 0) {
@@ -1790,12 +1989,8 @@
 #ifdef DEBUG_PK
 	sshbuf_dump(b, stderr);
 #endif
-	if (authctxt->sensitive->external_keysign)
-		r = ssh_keysign(private, &sig, &siglen,
-		    sshbuf_ptr(b), sshbuf_len(b));
-	else if ((r = sshkey_sign(private, &sig, &siglen,
-	    sshbuf_ptr(b), sshbuf_len(b), NULL, datafellows)) != 0)
-		debug("%s: sshkey_sign: %s", __func__, ssh_err(r));
+	r = ssh_keysign(private, &sig, &siglen,
+	    sshbuf_ptr(b), sshbuf_len(b));
 	if (r != 0) {
 		error("sign using hostkey %s %s failed",
 		    sshkey_ssh_name(private), fp);
@@ -1805,7 +2000,7 @@
 	    (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
 	    (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
 	    (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
-	    (r = sshpkt_put_cstring(ssh, key_ssh_name(private))) != 0 ||
+	    (r = sshpkt_put_cstring(ssh, sshkey_ssh_name(private))) != 0 ||
 	    (r = sshpkt_put_string(ssh, keyblob, keylen)) != 0 ||
 	    (r = sshpkt_put_cstring(ssh, chost)) != 0 ||
 	    (r = sshpkt_put_cstring(ssh, authctxt->local_user)) != 0 ||
@@ -1817,10 +2012,8 @@
 	success = 1;
 
  out:
-	if (sig != NULL) {
-		explicit_bzero(sig, siglen);
-		free(sig);
-	}
+	if (sig != NULL)
+		freezero(sig, siglen);
 	free(keyblob);
 	free(lname);
 	free(fp);
@@ -1917,20 +2110,22 @@
 authmethods_get(void)
 {
 	Authmethod *method = NULL;
-	Buffer b;
+	struct sshbuf *b;
 	char *list;
+	int r;
 
-	buffer_init(&b);
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	for (method = authmethods; method->name != NULL; method++) {
 		if (authmethod_is_enabled(method)) {
-			if (buffer_len(&b) > 0)
-				buffer_append(&b, ",", 1);
-			buffer_append(&b, method->name, strlen(method->name));
+			if ((r = sshbuf_putf(b, "%s%s",
+			    sshbuf_len(b) ? "," : "", method->name)) != 0)
+				fatal("%s: buffer error: %s",
+				    __func__, ssh_err(r));
 		}
 	}
-	if ((list = sshbuf_dup_string(&b)) == NULL)
+	if ((list = sshbuf_dup_string(b)) == NULL)
 		fatal("%s: sshbuf_dup_string failed", __func__);
-	buffer_free(&b);
+	sshbuf_free(b);
 	return list;
 }
-
diff --git a/sshd.8 b/sshd.8
index 7725a69..fb133c1 100644
--- a/sshd.8
+++ b/sshd.8
@@ -33,8 +33,8 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $OpenBSD: sshd.8,v 1.288 2017/01/30 23:27:39 dtucker Exp $
-.Dd $Mdocdate: January 30 2017 $
+.\" $OpenBSD: sshd.8,v 1.304 2018/07/22 12:16:59 dtucker Exp $
+.Dd $Mdocdate: July 22 2018 $
 .Dt SSHD 8
 .Os
 .Sh NAME
@@ -100,20 +100,22 @@
 extended test mode.
 If provided, any
 .Cm Match
-directives in the configuration file
-that would apply to the specified user, host, and address will be set before
-the configuration is written to standard output.
-The connection parameters are supplied as keyword=value pairs.
+directives in the configuration file that would apply are applied before the
+configuration is written to standard output.
+The connection parameters are supplied as keyword=value pairs and may be
+supplied in any order, either with multiple
+.Fl C
+options or as a comma-separated list.
 The keywords are
+.Dq addr,
 .Dq user ,
 .Dq host ,
 .Dq laddr ,
 .Dq lport ,
 and
-.Dq addr .
-All are required and may be supplied in any order, either with multiple
-.Fl C
-options or as a comma-separated list.
+.Dq rdomain
+and correspond to source address, user, resolved source host name,
+local address, local port number and routing domain respectively.
 .It Fl c Ar host_certificate_file
 Specifies a path to a certificate file to identify
 .Nm
@@ -164,7 +166,6 @@
 is not run as root (as the normal
 host key files are normally not readable by anyone but root).
 The default is
-.Pa /etc/ssh/ssh_host_dsa_key ,
 .Pa /etc/ssh/ssh_host_ecdsa_key ,
 .Pa /etc/ssh/ssh_host_ed25519_key
 and
@@ -260,7 +261,7 @@
 to use from those offered by the server.
 Additionally, session integrity is provided
 through a cryptographic message authentication code
-(hmac-md5, hmac-sha1, umac-64, umac-128, hmac-ripemd160,
+(hmac-md5, hmac-sha1, umac-64, umac-128,
 hmac-sha2-256 or hmac-sha2-512).
 .Pp
 Finally, the server and the client enter an authentication dialog.
@@ -276,7 +277,7 @@
 .Cm DenyUsers
 or its group is listed in
 .Cm DenyGroups
-\&.  The definition of a locked account is system dependant. Some platforms
+\&.  The definition of a locked account is system dependent. Some platforms
 have their own account database (eg AIX) and some modify the passwd field (
 .Ql \&*LK\&*
 on Solaris and UnixWare,
@@ -452,7 +453,7 @@
 file and edit it.
 .Pp
 .Nm
-enforces a minimum RSA key modulus size of 768 bits.
+enforces a minimum RSA key modulus size of 1024 bits.
 .Pp
 The options (if present) consist of comma-separated option
 specifications.
@@ -512,6 +513,10 @@
 controlled via the
 .Cm PermitUserEnvironment
 option.
+.It Cm expiry-time="timespec"
+Specifies a time after which the key will not be accepted.
+The time may be specified as a YYYYMMDD date or a YYYYMMDDHHMM[SS] time
+in the system time-zone.
 .It Cm from="pattern-list"
 Specifies that in addition to public key authentication, either the canonical
 name of the remote host or its IP address must be present in the
@@ -549,11 +554,37 @@
 .It Cm no-X11-forwarding
 Forbids X11 forwarding when this key is used for authentication.
 Any X11 forward requests by the client will return an error.
+.It Cm permitlisten="[host:]port"
+Limit remote port forwarding with the
+.Xr ssh 1
+.Fl R
+option such that it may only listen on the specified host (optional) and port.
+IPv6 addresses can be specified by enclosing the address in square brackets.
+Multiple
+.Cm permitlisten
+options may be applied separated by commas.
+Hostnames may include wildcards as described in the PATTERNS section in
+.Xr ssh_config 5 .
+A port specification of
+.Cm *
+matches any port.
+Note that the setting of
+.Cm GatewayPorts
+may further restrict listen addresses.
+Note that
+.Xr ssh 1
+will send a hostname of
+.Dq localhost
+if a listen host was not specified when the forwarding was requested, and
+that this name is treated differently to the explicit localhost addresses
+.Dq 127.0.0.1
+and
+.Dq ::1 .
 .It Cm permitopen="host:port"
-Limit local port forwarding with
+Limit local port forwarding with the
 .Xr ssh 1
 .Fl L
-such that it may only connect to the specified host and port.
+option such that it may only connect to the specified host and port.
 IPv6 addresses can be specified by enclosing the address in square brackets.
 Multiple
 .Cm permitopen
@@ -566,6 +597,7 @@
 .It Cm port-forwarding
 Enable port forwarding previously disabled by the
 .Cm restrict
+option.
 .It Cm principals="principals"
 On a
 .Cm cert-authority
@@ -612,9 +644,11 @@
 ssh-rsa AAAAB3Nza...LiPk== user@example.net
 from="*.sales.example.net,!pc.sales.example.net" ssh-rsa
 AAAAB2...19Q== john@example.net
-command="dump /home",no-pty,no-port-forwarding ssh-dss
+command="dump /home",no-pty,no-port-forwarding ssh-rsa
 AAAAC3...51R== example.net
-permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-dss
+permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-rsa
+AAAAB5...21S==
+permitlisten="localhost:8080",permitopen="localhost:22000" ssh-rsa
 AAAAB5...21S==
 tunnel="0",command="sh /etc/netstart tun0" ssh-rsa AAAA...==
 jane@example.net
@@ -652,9 +686,23 @@
 and
 .Ql \&?
 act as
-wildcards); each pattern in turn is matched against the canonical host
-name (when authenticating a client) or against the user-supplied
-name (when authenticating a server).
+wildcards); each pattern in turn is matched against the host name.
+When
+.Nm sshd
+is authenticating a client, such as when using
+.Cm HostbasedAuthentication ,
+this will be the canonical client host name.
+When
+.Xr ssh 1
+is authenticating a server, this will be the host name
+given by the user, the value of the
+.Xr ssh 1
+.Cm HostkeyAlias
+if it was specified, or the canonical server hostname if the
+.Xr ssh 1
+.Cm CanonicalizeHostname
+option was used.
+.Pp
 A pattern may also be preceded by
 .Ql \&!
 to indicate negation: if the host name matches a negated
@@ -857,7 +905,6 @@
 but allows host-based authentication without permitting login with
 rlogin/rsh.
 .Pp
-.It Pa /etc/ssh/ssh_host_dsa_key
 .It Pa /etc/ssh/ssh_host_ecdsa_key
 .It Pa /etc/ssh/ssh_host_ed25519_key
 .It Pa /etc/ssh/ssh_host_rsa_key
@@ -868,7 +915,6 @@
 .Nm
 does not start if these files are group/world-accessible.
 .Pp
-.It Pa /etc/ssh/ssh_host_dsa_key.pub
 .It Pa /etc/ssh/ssh_host_ecdsa_key.pub
 .It Pa /etc/ssh/ssh_host_ed25519_key.pub
 .It Pa /etc/ssh/ssh_host_rsa_key.pub
diff --git a/sshd.c b/sshd.c
index 9be967a..87dfa72 100644
--- a/sshd.c
+++ b/sshd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshd.c,v 1.483 2017/02/24 03:16:34 djm Exp $ */
+/* $OpenBSD: sshd.c,v 1.514 2018/08/13 02:41:05 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -88,11 +88,10 @@
 #include "xmalloc.h"
 #include "ssh.h"
 #include "ssh2.h"
-#include "rsa.h"
 #include "sshpty.h"
 #include "packet.h"
 #include "log.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "misc.h"
 #include "match.h"
 #include "servconf.h"
@@ -100,7 +99,7 @@
 #include "compat.h"
 #include "cipher.h"
 #include "digest.h"
-#include "key.h"
+#include "sshkey.h"
 #include "kex.h"
 #include "myproposal.h"
 #include "authfile.h"
@@ -120,6 +119,7 @@
 #endif
 #include "monitor_wrap.h"
 #include "ssh-sandbox.h"
+#include "auth-options.h"
 #include "version.h"
 #include "ssherr.h"
 
@@ -145,7 +145,12 @@
  */
 int debug_flag = 0;
 
-/* Flag indicating that the daemon should only test the configuration and keys. */
+/*
+ * Indicating that the daemon should only test the configuration and keys.
+ * If test_flag > 1 ("-T" flag), then sshd will also dump the effective
+ * configuration, optionally using connection information provided by the
+ * "-C" flag.
+ */
 int test_flag = 0;
 
 /* Flag indicating that the daemon is being started from inetd. */
@@ -195,10 +200,10 @@
  * not very useful.  Currently, memory locking is not implemented.
  */
 struct {
-	Key	**host_keys;		/* all private host keys */
-	Key	**host_pubkeys;		/* all public host keys */
-	Key	**host_certificates;	/* all public host certificates */
-	int	have_ssh2_key;
+	struct sshkey	**host_keys;		/* all private host keys */
+	struct sshkey	**host_pubkeys;		/* all public host keys */
+	struct sshkey	**host_certificates;	/* all public host certificates */
+	int		have_ssh2_key;
 } sensitive_data;
 
 /* This is set to true when a signal is received. */
@@ -220,18 +225,26 @@
 int startup_pipe;		/* in child */
 
 /* variables used for privilege separation */
+#ifdef __Fuchsia__
+int use_privsep = 0;
+#else
 int use_privsep = -1;
+#endif
 struct monitor *pmonitor = NULL;
 int privsep_is_preauth = 1;
+static int privsep_chroot = 1;
 
 /* global authentication context */
 Authctxt *the_authctxt = NULL;
 
+/* global key/cert auth options. XXX move to permanent ssh->authctxt? */
+struct sshauthopt *auth_opts = NULL;
+
 /* sshd_config buffer */
-Buffer cfg;
+struct sshbuf *cfg;
 
 /* message to be displayed after login */
-Buffer loginmsg;
+struct sshbuf *loginmsg;
 
 /* Unprivileged user */
 struct passwd *privsep_pw = NULL;
@@ -278,7 +291,6 @@
 	int save_errno = errno;
 
 	received_sighup = 1;
-	signal(SIGHUP, sighup_handler);
 	errno = save_errno;
 }
 
@@ -328,8 +340,6 @@
 	while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
 	    (pid < 0 && errno == EINTR))
 		;
-
-	signal(SIGCHLD, main_sigchld_handler);
 	errno = save_errno;
 }
 
@@ -441,18 +451,12 @@
 		logit("Client version \"%.100s\" uses unsafe RSA signature "
 		    "scheme; disabling use of RSA keys", remote_version);
 	}
-	if ((ssh->compat & SSH_BUG_DERIVEKEY) != 0) {
-		fatal("Client version \"%.100s\" uses unsafe key agreement; "
-		    "refusing connection", remote_version);
-	}
 
 	chop(server_version_string);
 	debug("Local version string %.200s", server_version_string);
 
-	if (remote_major == 2 ||
-	    (remote_major == 1 && remote_minor == 99)) {
-		enable_compat20();
-	} else {
+	if (remote_major != 2 &&
+	    !(remote_major == 1 && remote_minor == 99)) {
 		s = "Protocol major versions differ.\n";
 		(void) atomicio(vwrite, sock_out, s, strlen(s));
 		close(sock_in);
@@ -469,15 +473,15 @@
 void
 destroy_sensitive_data(void)
 {
-	int i;
+	u_int i;
 
 	for (i = 0; i < options.num_host_key_files; i++) {
 		if (sensitive_data.host_keys[i]) {
-			key_free(sensitive_data.host_keys[i]);
+			sshkey_free(sensitive_data.host_keys[i]);
 			sensitive_data.host_keys[i] = NULL;
 		}
 		if (sensitive_data.host_certificates[i]) {
-			key_free(sensitive_data.host_certificates[i]);
+			sshkey_free(sensitive_data.host_certificates[i]);
 			sensitive_data.host_certificates[i] = NULL;
 		}
 	}
@@ -487,13 +491,18 @@
 void
 demote_sensitive_data(void)
 {
-	Key *tmp;
-	int i;
+	struct sshkey *tmp;
+	u_int i;
+	int r;
 
 	for (i = 0; i < options.num_host_key_files; i++) {
 		if (sensitive_data.host_keys[i]) {
-			tmp = key_demote(sensitive_data.host_keys[i]);
-			key_free(sensitive_data.host_keys[i]);
+			if ((r = sshkey_demote(sensitive_data.host_keys[i],
+			    &tmp)) != 0)
+				fatal("could not demote host %s key: %s",
+				    sshkey_type(sensitive_data.host_keys[i]),
+				    ssh_err(r));
+			sshkey_free(sensitive_data.host_keys[i]);
 			sensitive_data.host_keys[i] = tmp;
 		}
 		/* Certs do not need demotion */
@@ -541,7 +550,7 @@
 	demote_sensitive_data();
 
 	/* Demote the child */
-	if (getuid() == 0 || geteuid() == 0) {
+	if (privsep_chroot) {
 		/* Change our root directory */
 		if (chroot(_PATH_PRIVSEP_CHROOT_DIR) == -1)
 			fatal("chroot(\"%s\"): %s", _PATH_PRIVSEP_CHROOT_DIR,
@@ -649,7 +658,8 @@
 		fatal("fork of unprivileged child failed");
 	else if (pmonitor->m_pid != 0) {
 		verbose("User child is on pid %ld", (long)pmonitor->m_pid);
-		buffer_clear(&loginmsg);
+		sshbuf_reset(loginmsg);
+		monitor_clear_keystate(pmonitor);
 		monitor_child_postauth(pmonitor);
 
 		/* NEVERREACHED */
@@ -680,44 +690,47 @@
 	packet_set_authenticated();
 }
 
+static void
+append_hostkey_type(struct sshbuf *b, const char *s)
+{
+	int r;
+
+	if (match_pattern_list(s, options.hostkeyalgorithms, 0) != 1) {
+		debug3("%s: %s key not permitted by HostkeyAlgorithms",
+		    __func__, s);
+		return;
+	}
+	if ((r = sshbuf_putf(b, "%s%s", sshbuf_len(b) > 0 ? "," : "", s)) != 0)
+		fatal("%s: sshbuf_putf: %s", __func__, ssh_err(r));
+}
+
 static char *
 list_hostkey_types(void)
 {
-	Buffer b;
-	const char *p;
+	struct sshbuf *b;
+	struct sshkey *key;
 	char *ret;
-	int i;
-	Key *key;
+	u_int i;
 
-	buffer_init(&b);
+	if ((b = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	for (i = 0; i < options.num_host_key_files; i++) {
 		key = sensitive_data.host_keys[i];
 		if (key == NULL)
 			key = sensitive_data.host_pubkeys[i];
 		if (key == NULL)
 			continue;
-		/* Check that the key is accepted in HostkeyAlgorithms */
-		if (match_pattern_list(sshkey_ssh_name(key),
-		    options.hostkeyalgorithms, 0) != 1) {
-			debug3("%s: %s key not permitted by HostkeyAlgorithms",
-			    __func__, sshkey_ssh_name(key));
-			continue;
-		}
 		switch (key->type) {
 		case KEY_RSA:
+			/* for RSA we also support SHA2 signatures */
+			append_hostkey_type(b, "rsa-sha2-512");
+			append_hostkey_type(b, "rsa-sha2-256");
+			/* FALLTHROUGH */
 		case KEY_DSA:
 		case KEY_ECDSA:
 		case KEY_ED25519:
-			if (buffer_len(&b) > 0)
-				buffer_append(&b, ",", 1);
-			p = key_ssh_name(key);
-			buffer_append(&b, p, strlen(p));
-
-			/* for RSA we also support SHA2 signatures */
-			if (key->type == KEY_RSA) {
-				p = ",rsa-sha2-512,rsa-sha2-256";
-				buffer_append(&b, p, strlen(p));
-			}
+		case KEY_XMSS:
+			append_hostkey_type(b, sshkey_ssh_name(key));
 			break;
 		}
 		/* If the private key has a cert peer, then list that too */
@@ -726,28 +739,32 @@
 			continue;
 		switch (key->type) {
 		case KEY_RSA_CERT:
+			/* for RSA we also support SHA2 signatures */
+			append_hostkey_type(b,
+			    "rsa-sha2-512-cert-v01@openssh.com");
+			append_hostkey_type(b,
+			    "rsa-sha2-256-cert-v01@openssh.com");
+			/* FALLTHROUGH */
 		case KEY_DSA_CERT:
 		case KEY_ECDSA_CERT:
 		case KEY_ED25519_CERT:
-			if (buffer_len(&b) > 0)
-				buffer_append(&b, ",", 1);
-			p = key_ssh_name(key);
-			buffer_append(&b, p, strlen(p));
+		case KEY_XMSS_CERT:
+			append_hostkey_type(b, sshkey_ssh_name(key));
 			break;
 		}
 	}
-	if ((ret = sshbuf_dup_string(&b)) == NULL)
+	if ((ret = sshbuf_dup_string(b)) == NULL)
 		fatal("%s: sshbuf_dup_string failed", __func__);
-	buffer_free(&b);
-	debug("list_hostkey_types: %s", ret);
+	sshbuf_free(b);
+	debug("%s: %s", __func__, ret);
 	return ret;
 }
 
-static Key *
+static struct sshkey *
 get_hostkey_by_type(int type, int nid, int need_private, struct ssh *ssh)
 {
-	int i;
-	Key *key;
+	u_int i;
+	struct sshkey *key;
 
 	for (i = 0; i < options.num_host_key_files; i++) {
 		switch (type) {
@@ -755,6 +772,7 @@
 		case KEY_DSA_CERT:
 		case KEY_ECDSA_CERT:
 		case KEY_ED25519_CERT:
+		case KEY_XMSS_CERT:
 			key = sensitive_data.host_certificates[i];
 			break;
 		default:
@@ -771,41 +789,41 @@
 	return NULL;
 }
 
-Key *
+struct sshkey *
 get_hostkey_public_by_type(int type, int nid, struct ssh *ssh)
 {
 	return get_hostkey_by_type(type, nid, 0, ssh);
 }
 
-Key *
+struct sshkey *
 get_hostkey_private_by_type(int type, int nid, struct ssh *ssh)
 {
 	return get_hostkey_by_type(type, nid, 1, ssh);
 }
 
-Key *
+struct sshkey *
 get_hostkey_by_index(int ind)
 {
-	if (ind < 0 || ind >= options.num_host_key_files)
+	if (ind < 0 || (u_int)ind >= options.num_host_key_files)
 		return (NULL);
 	return (sensitive_data.host_keys[ind]);
 }
 
-Key *
+struct sshkey *
 get_hostkey_public_by_index(int ind, struct ssh *ssh)
 {
-	if (ind < 0 || ind >= options.num_host_key_files)
+	if (ind < 0 || (u_int)ind >= options.num_host_key_files)
 		return (NULL);
 	return (sensitive_data.host_pubkeys[ind]);
 }
 
 int
-get_hostkey_index(Key *key, int compare, struct ssh *ssh)
+get_hostkey_index(struct sshkey *key, int compare, struct ssh *ssh)
 {
-	int i;
+	u_int i;
 
 	for (i = 0; i < options.num_host_key_files; i++) {
-		if (key_is_cert(key)) {
+		if (sshkey_is_cert(key)) {
 			if (key == sensitive_data.host_certificates[i] ||
 			    (compare && sensitive_data.host_certificates[i] &&
 			    sshkey_equal(key,
@@ -831,7 +849,8 @@
 {
 	struct sshbuf *buf;
 	struct sshkey *key;
-	int i, nkeys, r;
+	u_int i, nkeys;
+	int r;
 	char *fp;
 
 	/* Some clients cannot cope with the hostkeys message, skip those. */
@@ -862,7 +881,7 @@
 		packet_put_string(sshbuf_ptr(buf), sshbuf_len(buf));
 		nkeys++;
 	}
-	debug3("%s: sent %d hostkeys", __func__, nkeys);
+	debug3("%s: sent %u hostkeys", __func__, nkeys);
 	if (nkeys == 0)
 		fatal("%s: no hostkeys", __func__);
 	packet_send();
@@ -948,31 +967,33 @@
 }
 
 static void
-recv_rexec_state(int fd, Buffer *conf)
+recv_rexec_state(int fd, struct sshbuf *conf)
 {
-	Buffer m;
-	char *cp;
-	u_int len;
+	struct sshbuf *m;
+	u_char *cp, ver;
+	size_t len;
+	int r;
 
 	debug3("%s: entering fd = %d", __func__, fd);
 
-	buffer_init(&m);
-
-	if (ssh_msg_recv(fd, &m) == -1)
+	if ((m = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
+	if (ssh_msg_recv(fd, m) == -1)
 		fatal("%s: ssh_msg_recv failed", __func__);
-	if (buffer_get_char(&m) != 0)
+	if ((r = sshbuf_get_u8(m, &ver)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (ver != 0)
 		fatal("%s: rexec version mismatch", __func__);
-
-	cp = buffer_get_string(&m, &len);
-	if (conf != NULL)
-		buffer_append(conf, cp, len);
-	free(cp);
-
+	if ((r = sshbuf_get_string(m, &cp, &len)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
+	if (conf != NULL && (r = sshbuf_put(conf, cp, len)))
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 #if defined(WITH_OPENSSL) && !defined(OPENSSL_PRNG_ONLY)
-	rexec_recv_rng_seed(&m);
+	rexec_recv_rng_seed(m);
 #endif
 
-	buffer_free(&m);
+	free(cp);
+	sshbuf_free(m);
 
 	debug3("%s: done", __func__);
 }
@@ -1015,13 +1036,13 @@
  * Listen for TCP connections
  */
 static void
-server_listen(void)
+listen_on_addrs(struct listenaddr *la)
 {
-	int ret, listen_sock, on = 1;
+	int ret, listen_sock;
 	struct addrinfo *ai;
 	char ntop[NI_MAXHOST], strport[NI_MAXSERV];
 
-	for (ai = options.listen_addrs; ai; ai = ai->ai_next) {
+	for (ai = la->addrs; ai; ai = ai->ai_next) {
 		if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
 			continue;
 		if (num_listen_socks >= MAX_LISTEN_SOCKS)
@@ -1051,13 +1072,13 @@
 			close(listen_sock);
 			continue;
 		}
-		/*
-		 * Set socket options.
-		 * Allow local port reuse in TIME_WAIT.
-		 */
-		if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR,
-		    &on, sizeof(on)) == -1)
-			error("setsockopt SO_REUSEADDR: %s", strerror(errno));
+		/* Socket options */
+		set_reuseaddr(listen_sock);
+		if (la->rdomain != NULL &&
+		    set_rdomain(listen_sock, la->rdomain) == -1) {
+			close(listen_sock);
+			continue;
+		}
 
 		/* Only communicate in IPv6 over AF_INET6 sockets. */
 		if (ai->ai_family == AF_INET6)
@@ -1079,9 +1100,28 @@
 		if (listen(listen_sock, SSH_LISTEN_BACKLOG) < 0)
 			fatal("listen on [%s]:%s: %.100s",
 			    ntop, strport, strerror(errno));
-		logit("Server listening on %s port %s.", ntop, strport);
+		logit("Server listening on %s port %s%s%s.",
+		    ntop, strport,
+		    la->rdomain == NULL ? "" : " rdomain ",
+		    la->rdomain == NULL ? "" : la->rdomain);
 	}
-	freeaddrinfo(options.listen_addrs);
+}
+
+static void
+server_listen(void)
+{
+	u_int i;
+
+	for (i = 0; i < options.num_listen_addrs; i++) {
+		listen_on_addrs(&options.listen_addrs[i]);
+		freeaddrinfo(options.listen_addrs[i].addrs);
+		free(options.listen_addrs[i].rdomain);
+		memset(&options.listen_addrs[i], 0,
+		    sizeof(options.listen_addrs[i]));
+	}
+	free(options.listen_addrs);
+	options.listen_addrs = NULL;
+	options.num_listen_addrs = 0;
 
 	if (!num_listen_socks)
 		fatal("Cannot bind any address.");
@@ -1238,8 +1278,7 @@
 				startup_pipe = -1;
 				pid = getpid();
 				if (rexec_flag) {
-					send_rexec_state(config_s[0],
-					    &cfg);
+					send_rexec_state(config_s[0], cfg);
 					close(config_s[0]);
 				}
 				break;
@@ -1285,7 +1324,7 @@
 			close(startup_p[1]);
 
 			if (rexec_flag) {
-				send_rexec_state(config_s[0], &cfg);
+				send_rexec_state(config_s[0], cfg);
 				close(config_s[0]);
 				close(config_s[1]);
 			}
@@ -1316,7 +1355,7 @@
  * return an error if any are found).  Basically we are worried about
  * source routing; it can be used to pretend you are somebody
  * (ip-address) you are not. That itself may be "almost acceptable"
- * under certain circumstances, but rhosts autentication is useless
+ * under certain circumstances, but rhosts authentication is useless
  * if source routing is accepted. Notice also that if we just dropped
  * source routing here, the other side could use IP spoofing to do
  * rest of the interaction and could still bypass security.  So we
@@ -1353,6 +1392,83 @@
 #endif /* IP_OPTIONS */
 }
 
+/* Set the routing domain for this process */
+static void
+set_process_rdomain(struct ssh *ssh, const char *name)
+{
+#if defined(HAVE_SYS_SET_PROCESS_RDOMAIN)
+	if (name == NULL)
+		return; /* default */
+
+	if (strcmp(name, "%D") == 0) {
+		/* "expands" to routing domain of connection */
+		if ((name = ssh_packet_rdomain_in(ssh)) == NULL)
+			return;
+	}
+	/* NB. We don't pass 'ssh' to sys_set_process_rdomain() */
+	return sys_set_process_rdomain(name);
+#elif defined(__OpenBSD__)
+	int rtable, ortable = getrtable();
+	const char *errstr;
+
+	if (name == NULL)
+		return; /* default */
+
+	if (strcmp(name, "%D") == 0) {
+		/* "expands" to routing domain of connection */
+		if ((name = ssh_packet_rdomain_in(ssh)) == NULL)
+			return;
+	}
+
+	rtable = (int)strtonum(name, 0, 255, &errstr);
+	if (errstr != NULL) /* Shouldn't happen */
+		fatal("Invalid routing domain \"%s\": %s", name, errstr);
+	if (rtable != ortable && setrtable(rtable) != 0)
+		fatal("Unable to set routing domain %d: %s",
+		    rtable, strerror(errno));
+	debug("%s: set routing domain %d (was %d)", __func__, rtable, ortable);
+#else /* defined(__OpenBSD__) */
+	fatal("Unable to set routing domain: not supported in this platform");
+#endif
+}
+
+static void
+accumulate_host_timing_secret(struct sshbuf *server_cfg,
+    const struct sshkey *key)
+{
+	static struct ssh_digest_ctx *ctx;
+	u_char *hash;
+	size_t len;
+	struct sshbuf *buf;
+	int r;
+
+	if (ctx == NULL && (ctx = ssh_digest_start(SSH_DIGEST_SHA512)) == NULL)
+		fatal("%s: ssh_digest_start", __func__);
+	if (key == NULL) { /* finalize */
+		/* add server config in case we are using agent for host keys */
+		if (ssh_digest_update(ctx, sshbuf_ptr(server_cfg),
+		    sshbuf_len(server_cfg)) != 0)
+			fatal("%s: ssh_digest_update", __func__);
+		len = ssh_digest_bytes(SSH_DIGEST_SHA512);
+		hash = xmalloc(len);
+		if (ssh_digest_final(ctx, hash, len) != 0)
+			fatal("%s: ssh_digest_final", __func__);
+		options.timing_secret = PEEK_U64(hash);
+		freezero(hash, len);
+		ssh_digest_free(ctx);
+		ctx = NULL;
+		return;
+	}
+	if ((buf = sshbuf_new()) == NULL)
+		fatal("%s could not allocate buffer", __func__);
+	if ((r = sshkey_private_serialize(key, buf)) != 0)
+		fatal("sshkey_private_serialize: %s", ssh_err(r));
+	if (ssh_digest_update(ctx, sshbuf_ptr(buf), sshbuf_len(buf)) != 0)
+		fatal("%s: ssh_digest_update", __func__);
+	sshbuf_reset(buf);
+	sshbuf_free(buf);
+}
+
 /*
  * Main program for the daemon.
  */
@@ -1362,20 +1478,19 @@
 	struct ssh *ssh = NULL;
 	extern char *optarg;
 	extern int optind;
-	int r, opt, i, j, on = 1, already_daemon;
+	int r, opt, on = 1, already_daemon, remote_port;
 	int sock_in = -1, sock_out = -1, newsock = -1;
-	const char *remote_ip;
-	int remote_port;
+	const char *remote_ip, *rdomain;
 	char *fp, *line, *laddr, *logfile = NULL;
 	int config_s[2] = { -1 , -1 };
-	u_int n;
+	u_int i, j;
 	u_int64_t ibytes, obytes;
 	mode_t new_umask;
-	Key *key;
-	Key *pubkey;
+	struct sshkey *key;
+	struct sshkey *pubkey;
 	int keytype;
 	Authctxt *authctxt;
-	struct connection_info *connection_info = get_connection_info(0, 0);
+	struct connection_info *connection_info = NULL;
 
 	ssh_malloc_init();	/* must be called before any mallocs */
 
@@ -1388,7 +1503,7 @@
 	saved_argc = ac;
 	rexec_argc = ac;
 	saved_argv = xcalloc(ac + 1, sizeof(*saved_argv));
-	for (i = 0; i < ac; i++)
+	for (i = 0; (int)i < ac; i++)
 		saved_argv[i] = xstrdup(av[i]);
 	saved_argv[i] = NULL;
 
@@ -1421,12 +1536,8 @@
 			config_file_name = optarg;
 			break;
 		case 'c':
-			if (options.num_host_cert_files >= MAX_HOSTCERTS) {
-				fprintf(stderr, "too many host certificates.\n");
-				exit(1);
-			}
-			options.host_cert_files[options.num_host_cert_files++] =
-			   derelativise_path(optarg);
+			servconf_add_hostcert("[command-line]", 0,
+			    &options, optarg);
 			break;
 		case 'd':
 			if (debug_flag == 0) {
@@ -1485,12 +1596,8 @@
 			/* protocol 1, ignored */
 			break;
 		case 'h':
-			if (options.num_host_key_files >= MAX_HOSTKEYS) {
-				fprintf(stderr, "too many host keys.\n");
-				exit(1);
-			}
-			options.host_key_files[options.num_host_key_files++] = 
-			   derelativise_path(optarg);
+			servconf_add_hostkey("[command-line]", 0,
+			    &options, optarg);
 			break;
 		case 't':
 			test_flag = 1;
@@ -1499,6 +1606,7 @@
 			test_flag = 2;
 			break;
 		case 'C':
+			connection_info = get_connection_info(0, 0);
 			if (parse_server_match_testspec(connection_info,
 			    optarg) == -1)
 				exit(1);
@@ -1557,36 +1665,26 @@
 	if (getenv("KRB5CCNAME") != NULL)
 		(void) unsetenv("KRB5CCNAME");
 
-#ifdef _UNICOS
-	/* Cray can define user privs drop all privs now!
-	 * Not needed on PRIV_SU systems!
-	 */
-	drop_cray_privs();
-#endif
-
 	sensitive_data.have_ssh2_key = 0;
 
 	/*
-	 * If we're doing an extended config test, make sure we have all of
-	 * the parameters we need.  If we're not doing an extended test,
-	 * do not silently ignore connection test params.
+	 * If we're not doing an extended test do not silently ignore connection
+	 * test params.
 	 */
-	if (test_flag >= 2 && server_match_spec_complete(connection_info) == 0)
-		fatal("user, host and addr are all required when testing "
-		   "Match configs");
-	if (test_flag < 2 && server_match_spec_complete(connection_info) >= 0)
+	if (test_flag < 2 && connection_info != NULL)
 		fatal("Config test connection parameter (-C) provided without "
 		   "test mode (-T)");
 
 	/* Fetch our configuration */
-	buffer_init(&cfg);
+	if ((cfg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	if (rexeced_flag)
-		recv_rexec_state(REEXEC_CONFIG_PASS_FD, &cfg);
+		recv_rexec_state(REEXEC_CONFIG_PASS_FD, cfg);
 	else if (strcasecmp(config_file_name, "none") != 0)
-		load_server_config(config_file_name, &cfg);
+		load_server_config(config_file_name, cfg);
 
 	parse_server_config(&options, rexeced_flag ? "rexec" : config_file_name,
-	    &cfg, NULL);
+	    cfg, NULL);
 
 	seed_rng();
 
@@ -1616,19 +1714,16 @@
 	 * and warns for trivial misconfigurations that could break login.
 	 */
 	if (options.num_auth_methods != 0) {
-		for (n = 0; n < options.num_auth_methods; n++) {
-			if (auth2_methods_valid(options.auth_methods[n],
+		for (i = 0; i < options.num_auth_methods; i++) {
+			if (auth2_methods_valid(options.auth_methods[i],
 			    1) == 0)
 				break;
 		}
-		if (n >= options.num_auth_methods)
+		if (i >= options.num_auth_methods)
 			fatal("AuthenticationMethods cannot be satisfied by "
 			    "enabled authentication methods");
 	}
 
-	/* set default channel AF */
-	channel_set_af(options.address_family);
-
 	/* Check that there are no remaining arguments. */
 	if (optind < ac) {
 		fprintf(stderr, "Extra argument %s.\n", av[optind]);
@@ -1644,24 +1739,23 @@
 	);
 
 	/* Store privilege separation user for later use if required. */
+	privsep_chroot = use_privsep && (getuid() == 0 || geteuid() == 0);
 	if ((privsep_pw = getpwnam(SSH_PRIVSEP_USER)) == NULL) {
-		if (use_privsep || options.kerberos_authentication)
+		if (privsep_chroot || options.kerberos_authentication)
 			fatal("Privilege separation user %s does not exist",
 			    SSH_PRIVSEP_USER);
 	} else {
-		explicit_bzero(privsep_pw->pw_passwd,
-		    strlen(privsep_pw->pw_passwd));
 		privsep_pw = pwcopy(privsep_pw);
-		free(privsep_pw->pw_passwd);
+		freezero(privsep_pw->pw_passwd, strlen(privsep_pw->pw_passwd));
 		privsep_pw->pw_passwd = xstrdup("*");
 	}
 	endpwent();
 
 	/* load host keys */
 	sensitive_data.host_keys = xcalloc(options.num_host_key_files,
-	    sizeof(Key *));
+	    sizeof(struct sshkey *));
 	sensitive_data.host_pubkeys = xcalloc(options.num_host_key_files,
-	    sizeof(Key *));
+	    sizeof(struct sshkey *));
 
 	if (options.host_key_agent) {
 		if (strcmp(options.host_key_agent, SSH_AUTHSOCKET_ENV_NAME))
@@ -1677,10 +1771,18 @@
 	for (i = 0; i < options.num_host_key_files; i++) {
 		if (options.host_key_files[i] == NULL)
 			continue;
-		key = key_load_private(options.host_key_files[i], "", NULL);
-		pubkey = key_load_public(options.host_key_files[i], NULL);
+		if ((r = sshkey_load_private(options.host_key_files[i], "",
+		    &key, NULL)) != 0 && r != SSH_ERR_SYSTEM_ERROR)
+			error("Error loading host key \"%s\": %s",
+			    options.host_key_files[i], ssh_err(r));
+		if ((r = sshkey_load_public(options.host_key_files[i],
+		    &pubkey, NULL)) != 0 && r != SSH_ERR_SYSTEM_ERROR)
+			error("Error loading host key \"%s\": %s",
+			    options.host_key_files[i], ssh_err(r));
 		if (pubkey == NULL && key != NULL)
-			pubkey = key_demote(key);
+			if ((r = sshkey_demote(key, &pubkey)) != 0)
+				fatal("Could not demote key: \"%s\": %s",
+				    options.host_key_files[i], ssh_err(r));
 		sensitive_data.host_keys[i] = key;
 		sensitive_data.host_pubkeys[i] = pubkey;
 
@@ -1690,6 +1792,7 @@
 			keytype = pubkey->type;
 		} else if (key != NULL) {
 			keytype = key->type;
+			accumulate_host_timing_secret(cfg, key);
 		} else {
 			error("Could not load host key: %s",
 			    options.host_key_files[i]);
@@ -1703,6 +1806,7 @@
 		case KEY_DSA:
 		case KEY_ECDSA:
 		case KEY_ED25519:
+		case KEY_XMSS:
 			if (have_agent || key != NULL)
 				sensitive_data.have_ssh2_key = 1;
 			break;
@@ -1714,6 +1818,7 @@
 		    key ? "private" : "agent", i, sshkey_ssh_name(pubkey), fp);
 		free(fp);
 	}
+	accumulate_host_timing_secret(cfg, NULL);
 	if (!sensitive_data.have_ssh2_key) {
 		logit("sshd: no hostkeys available -- exiting.");
 		exit(1);
@@ -1724,28 +1829,28 @@
 	 * indices to the public keys that they relate to.
 	 */
 	sensitive_data.host_certificates = xcalloc(options.num_host_key_files,
-	    sizeof(Key *));
+	    sizeof(struct sshkey *));
 	for (i = 0; i < options.num_host_key_files; i++)
 		sensitive_data.host_certificates[i] = NULL;
 
 	for (i = 0; i < options.num_host_cert_files; i++) {
 		if (options.host_cert_files[i] == NULL)
 			continue;
-		key = key_load_public(options.host_cert_files[i], NULL);
-		if (key == NULL) {
-			error("Could not load host certificate: %s",
-			    options.host_cert_files[i]);
+		if ((r = sshkey_load_public(options.host_cert_files[i],
+		    &key, NULL)) != 0) {
+			error("Could not load host certificate \"%s\": %s",
+			    options.host_cert_files[i], ssh_err(r));
 			continue;
 		}
-		if (!key_is_cert(key)) {
+		if (!sshkey_is_cert(key)) {
 			error("Certificate file is not a certificate: %s",
 			    options.host_cert_files[i]);
-			key_free(key);
+			sshkey_free(key);
 			continue;
 		}
 		/* Find matching private key */
 		for (j = 0; j < options.num_host_key_files; j++) {
-			if (key_equal_public(key,
+			if (sshkey_equal_public(key,
 			    sensitive_data.host_keys[j])) {
 				sensitive_data.host_certificates[j] = key;
 				break;
@@ -1754,15 +1859,15 @@
 		if (j >= options.num_host_key_files) {
 			error("No matching private key for certificate: %s",
 			    options.host_cert_files[i]);
-			key_free(key);
+			sshkey_free(key);
 			continue;
 		}
 		sensitive_data.host_certificates[j] = key;
-		debug("host certificate: #%d type %d %s", j, key->type,
-		    key_type(key));
+		debug("host certificate: #%u type %d %s", j, key->type,
+		    sshkey_type(key));
 	}
 
-	if (use_privsep) {
+	if (privsep_chroot) {
 		struct stat st;
 
 		if ((stat(_PATH_PRIVSEP_CHROOT_DIR, &st) == -1) ||
@@ -1782,8 +1887,13 @@
 	}
 
 	if (test_flag > 1) {
-		if (server_match_spec_complete(connection_info) == 1)
-			parse_server_match_config(&options, connection_info);
+		/*
+		 * If no connection info was provided by -C then use
+		 * use a blank one that will cause no predicate to match.
+		 */
+		if (connection_info == NULL)
+			connection_info = get_connection_info(0, 0);
+		parse_server_match_config(&options, connection_info);
 		dump_config(&options);
 	}
 
@@ -1802,8 +1912,10 @@
 		debug("setgroups() failed: %.200s", strerror(errno));
 
 	if (rexec_flag) {
+		if (rexec_argc < 0)
+			fatal("rexec_argc %d < 0", rexec_argc);
 		rexec_argv = xcalloc(rexec_argc + 2, sizeof(char *));
-		for (i = 0; i < rexec_argc; i++) {
+		for (i = 0; i < (u_int)rexec_argc; i++) {
 			debug("rexec_argv[%d]='%s'", i, saved_argv[i]);
 			rexec_argv[i] = saved_argv[i];
 		}
@@ -1961,8 +2073,14 @@
 	packet_set_connection(sock_in, sock_out);
 	packet_set_server();
 	ssh = active_state; /* XXX */
+
 	check_ip_options(ssh);
 
+	/* Prepare the channels layer */
+	channel_init_channels(ssh);
+	channel_set_af(ssh, options.address_family);
+	process_permitopen(ssh, &options);
+
 	/* Set SO_KEEPALIVE if requested. */
 	if (options.tcp_keep_alive && packet_connection_is_on_socket() &&
 	    setsockopt(sock_in, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)) < 0)
@@ -1973,6 +2091,9 @@
 		cleanup_exit(255);
 	}
 
+	if (options.routing_domain != NULL)
+		set_process_rdomain(ssh, options.routing_domain);
+
 	/*
 	 * The rest of the code depends on the fact that
 	 * ssh_remote_ipaddr() caches the remote ip, even if
@@ -1984,10 +2105,15 @@
 	audit_connection_from(remote_ip, remote_port);
 #endif
 
+	rdomain = ssh_packet_rdomain_in(ssh);
+
 	/* Log the connection. */
 	laddr = get_local_ipaddr(sock_in);
-	verbose("Connection from %s port %d on %s port %d",
-	    remote_ip, remote_port, laddr,  ssh_local_port(ssh));
+	verbose("Connection from %s port %d on %s port %d%s%s%s",
+	    remote_ip, remote_port, laddr,  ssh_local_port(ssh),
+	    rdomain == NULL ? "" : " rdomain \"",
+	    rdomain == NULL ? "" : rdomain,
+	    rdomain == NULL ? "" : "\"");
 	free(laddr);
 
 	/*
@@ -2008,13 +2134,18 @@
 	/* allocate authentication context */
 	authctxt = xcalloc(1, sizeof(*authctxt));
 
-	authctxt->loginmsg = &loginmsg;
+	authctxt->loginmsg = loginmsg;
 
 	/* XXX global for cleanup, access from other modules */
 	the_authctxt = authctxt;
 
+	/* Set default key authentication options */
+	if ((auth_opts = sshauthopt_new_with_keys_defaults()) == NULL)
+		fatal("allocation failed");
+
 	/* prepare buffer to collect messages to display to user after login */
-	buffer_init(&loginmsg);
+	if ((loginmsg = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 	auth_debug_reset();
 
 	if (use_privsep) {
@@ -2038,6 +2169,7 @@
 	 */
 	if (use_privsep) {
 		mm_send_keystate(pmonitor);
+		packet_clear_keys();
 		exit(0);
 	}
 
@@ -2068,7 +2200,7 @@
 #ifdef USE_PAM
 	if (options.use_pam) {
 		do_pam_setcred(1);
-		do_pam_session();
+		do_pam_session(ssh);
 	}
 #endif
 
@@ -2085,10 +2217,10 @@
 	    options.client_alive_count_max);
 
 	/* Try to send all our hostkeys to the client */
-	notify_hostkeys(active_state);
+	notify_hostkeys(ssh);
 
 	/* Start session. */
-	do_authenticated(authctxt);
+	do_authenticated(ssh, authctxt);
 
 	/* The connection has been terminated. */
 	packet_get_bytes(&ibytes, &obytes);
@@ -2115,26 +2247,22 @@
 }
 
 int
-sshd_hostkey_sign(Key *privkey, Key *pubkey, u_char **signature, size_t *slen,
-    const u_char *data, size_t dlen, const char *alg, u_int flag)
+sshd_hostkey_sign(struct sshkey *privkey, struct sshkey *pubkey,
+    u_char **signature, size_t *slenp, const u_char *data, size_t dlen,
+    const char *alg, u_int flag)
 {
 	int r;
-	u_int xxx_slen, xxx_dlen = dlen;
 
 	if (privkey) {
-		if (PRIVSEP(key_sign(privkey, signature, &xxx_slen, data, xxx_dlen,
-		    alg) < 0))
+		if (PRIVSEP(sshkey_sign(privkey, signature, slenp, data, dlen,
+		    alg, datafellows)) < 0)
 			fatal("%s: key_sign failed", __func__);
-		if (slen)
-			*slen = xxx_slen;
 	} else if (use_privsep) {
-		if (mm_key_sign(pubkey, signature, &xxx_slen, data, xxx_dlen,
-		    alg) < 0)
+		if (mm_sshkey_sign(pubkey, signature, slenp, data, dlen,
+		    alg, datafellows) < 0)
 			fatal("%s: pubkey_sign failed", __func__);
-		if (slen)
-			*slen = xxx_slen;
 	} else {
-		if ((r = ssh_agent_sign(auth_sock, pubkey, signature, slen,
+		if ((r = ssh_agent_sign(auth_sock, pubkey, signature, slenp,
 		    data, dlen, alg, datafellows)) != 0)
 			fatal("%s: ssh_agent_sign failed: %s",
 			    __func__, ssh_err(r));
@@ -2196,7 +2324,7 @@
 	kex->host_key_index=&get_hostkey_index;
 	kex->sign = sshd_hostkey_sign;
 
-	dispatch_run(DISPATCH_BLOCK, &kex->done, active_state);
+	ssh_dispatch_run_fatal(active_state, DISPATCH_BLOCK, &kex->done);
 
 	session_id2 = kex->session_id;
 	session_id2_len = kex->session_id_len;
@@ -2215,8 +2343,10 @@
 void
 cleanup_exit(int i)
 {
+	struct ssh *ssh = active_state; /* XXX */
+
 	if (the_authctxt) {
-		do_cleanup(the_authctxt);
+		do_cleanup(ssh, the_authctxt);
 		if (use_privsep && privsep_is_preauth &&
 		    pmonitor != NULL && pmonitor->m_pid > 1) {
 			debug("Killing privsep child %d", pmonitor->m_pid);
diff --git a/sshd_config b/sshd_config
index 9f09e4a..19b7c91 100644
--- a/sshd_config
+++ b/sshd_config
@@ -1,4 +1,4 @@
-#	$OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
+#	$OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
 
 # This is the sshd server system-wide configuration file.  See
 # sshd_config(5) for more information.
@@ -16,7 +16,6 @@
 #ListenAddress ::
 
 #HostKey /etc/ssh/ssh_host_rsa_key
-#HostKey /etc/ssh/ssh_host_dsa_key
 #HostKey /etc/ssh/ssh_host_ecdsa_key
 #HostKey /etc/ssh/ssh_host_ed25519_key
 
@@ -92,8 +91,6 @@
 #PrintMotd yes
 #PrintLastLog yes
 #TCPKeepAlive yes
-#UseLogin no
-#UsePrivilegeSeparation sandbox
 #PermitUserEnvironment no
 #Compression delayed
 #ClientAliveInterval 0
diff --git a/sshd_config.5 b/sshd_config.5
index 454e46e..e1b54ba 100644
--- a/sshd_config.5
+++ b/sshd_config.5
@@ -33,15 +33,13 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $OpenBSD: sshd_config.5,v 1.242 2017/02/03 23:01:19 djm Exp $
-.Dd $Mdocdate: February 3 2017 $
+.\" $OpenBSD: sshd_config.5,v 1.281 2018/07/20 05:01:10 djm Exp $
+.Dd $Mdocdate: July 20 2018 $
 .Dt SSHD_CONFIG 5
 .Os
 .Sh NAME
 .Nm sshd_config
 .Nd OpenSSH SSH daemon configuration file
-.Sh SYNOPSIS
-.Nm /etc/ssh/sshd_config
 .Sh DESCRIPTION
 .Xr sshd 8
 reads configuration data from
@@ -50,6 +48,7 @@
 .Fl f
 on the command line).
 The file contains keyword-argument pairs, one per line.
+For each keyword, the first obtained value will be used.
 Lines starting with
 .Ql #
 and empty lines are interpreted as comments.
@@ -67,12 +66,14 @@
 .Xr environ 7 .
 See
 .Cm SendEnv
+and
+.Cm SetEnv
 in
 .Xr ssh_config 5
 for how to configure the client.
 The
 .Ev TERM
-environment variable is always sent whenever the client
+environment variable is always accepted whenever the client
 requests a pseudo-terminal as it is required by the protocol.
 Variables are specified by name, which may contain the wildcard characters
 .Ql *
@@ -185,7 +186,7 @@
 .It Cm AuthenticationMethods
 Specifies the authentication methods that must be successfully completed
 for a user to be granted access.
-This option must be followed by one or more comma-separated lists of
+This option must be followed by one or more lists of comma-separated
 authentication method names, or by the single string
 .Cm any
 to indicate the default behaviour of accepting any single authentication
@@ -204,10 +205,9 @@
 For keyboard interactive authentication it is also possible to
 restrict authentication to a specific device by appending a
 colon followed by the device identifier
-.Cm bsdauth ,
-.Cm pam ,
+.Cm bsdauth
 or
-.Cm skey ,
+.Cm pam .
 depending on the server configuration.
 For example,
 .Qq keyboard-interactive:bsdauth
@@ -225,6 +225,18 @@
 .Pp
 Note that each authentication method listed should also be explicitly enabled
 in the configuration.
+.Pp
+The available authentication methods are:
+.Qq gssapi-with-mic ,
+.Qq hostbased ,
+.Qq keyboard-interactive ,
+.Qq none
+(used for access to password-less accounts when
+.Cm PermitEmptyPasswords
+is enabled),
+.Qq password
+and
+.Qq publickey .
 .It Cm AuthorizedKeysCommand
 Specifies a program to be used to look up the user's public keys.
 The program must be owned by root, not writable by group or others and
@@ -464,16 +476,6 @@
 .It
 aes256-gcm@openssh.com
 .It
-arcfour
-.It
-arcfour128
-.It
-arcfour256
-.It
-blowfish-cbc
-.It
-cast128-cbc
-.It
 chacha20-poly1305@openssh.com
 .El
 .Pp
@@ -574,6 +576,14 @@
 TCP and StreamLocal.
 This option overrides all other forwarding-related options and may
 simplify restricted configurations.
+.It Cm ExposeAuthInfo
+Writes a temporary file containing a list of authentication methods and
+public credentials (e.g. keys) used to authenticate the user.
+The location of the file is exposed to the user session through the
+.Ev SSH_USER_AUTH
+environment variable.
+The default is
+.Cm no .
 .It Cm FingerprintHash
 Specifies the hash algorithm used when logging key fingerprints.
 Valid options are:
@@ -648,7 +658,7 @@
 .Cm yes .
 .It Cm HostbasedAcceptedKeyTypes
 Specifies the key types that will be accepted for hostbased authentication
-as a comma-separated pattern list.
+as a list of comma-separated patterns.
 Alternately if the specified value begins with a
 .Sq +
 character, then the specified key types will be appended to the default set
@@ -663,9 +673,10 @@
 ecdsa-sha2-nistp384-cert-v01@openssh.com,
 ecdsa-sha2-nistp521-cert-v01@openssh.com,
 ssh-ed25519-cert-v01@openssh.com,
+rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,
 ssh-rsa-cert-v01@openssh.com,
 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
-ssh-ed25519,ssh-rsa
+ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
 .Ed
 .Pp
 The list of available key types may also be obtained using
@@ -705,7 +716,6 @@
 Specifies a file containing a private host key
 used by SSH.
 The defaults are
-.Pa /etc/ssh/ssh_host_dsa_key ,
 .Pa /etc/ssh/ssh_host_ecdsa_key ,
 .Pa /etc/ssh/ssh_host_ed25519_key
 and
@@ -741,9 +751,10 @@
 ecdsa-sha2-nistp384-cert-v01@openssh.com,
 ecdsa-sha2-nistp521-cert-v01@openssh.com,
 ssh-ed25519-cert-v01@openssh.com,
+rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,
 ssh-rsa-cert-v01@openssh.com,
 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
-ssh-ed25519,ssh-rsa
+ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
 .Ed
 .Pp
 The list of available key types may also be obtained using
@@ -768,7 +779,9 @@
 should ignore the user's
 .Pa ~/.ssh/known_hosts
 during
-.Cm HostbasedAuthentication .
+.Cm HostbasedAuthentication
+and use only the system-wide known hosts file
+.Pa /etc/ssh/known_hosts .
 The default is
 .Cm no .
 .It Cm IPQoS
@@ -798,15 +811,19 @@
 .Cm lowdelay ,
 .Cm throughput ,
 .Cm reliability ,
-or a numeric value.
+a numeric value, or
+.Cm none
+to use the operating system default.
 This option may take one or two arguments, separated by whitespace.
 If one argument is specified, it is used as the packet class unconditionally.
 If two values are specified, the first is automatically selected for
 interactive sessions and the second for non-interactive sessions.
 The default is
-.Cm lowdelay
+.Cm af21
+(Low-Latency Data)
 for interactive sessions and
-.Cm throughput
+.Cm cs1
+(Lower Effort)
 for non-interactive sessions.
 .It Cm KbdInteractiveAuthentication
 Specifies whether to allow keyboard-interactive authentication.
@@ -867,6 +884,12 @@
 .It
 diffie-hellman-group14-sha1
 .It
+diffie-hellman-group14-sha256
+.It
+diffie-hellman-group16-sha512
+.It
+diffie-hellman-group18-sha512
+.It
 diffie-hellman-group-exchange-sha1
 .It
 diffie-hellman-group-exchange-sha256
@@ -883,7 +906,8 @@
 curve25519-sha256,curve25519-sha256@libssh.org,
 ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,
 diffie-hellman-group-exchange-sha256,
-diffie-hellman-group14-sha1
+diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,
+diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
 .Ed
 .Pp
 The list of available key exchange algorithms may also be obtained using
@@ -898,31 +922,47 @@
 .It
 .Cm ListenAddress
 .Sm off
-.Ar host | Ar IPv4_addr | Ar IPv6_addr
+.Ar hostname | address
 .Sm on
+.Op Cm rdomain Ar domain
 .It
 .Cm ListenAddress
 .Sm off
-.Ar host | Ar IPv4_addr : Ar port
+.Ar hostname : port
 .Sm on
+.Op Cm rdomain Ar domain
 .It
 .Cm ListenAddress
 .Sm off
-.Oo
-.Ar host | Ar IPv6_addr Oc : Ar port
+.Ar IPv4_address : port
 .Sm on
+.Op Cm rdomain Ar domain
+.It
+.Cm ListenAddress
+.Sm off
+.Oo Ar hostname | address Oc : Ar port
+.Sm on
+.Op Cm rdomain Ar domain
 .El
 .Pp
+The optional
+.Cm rdomain
+qualifier requests
+.Xr sshd 8
+listen in an explicit routing domain.
 If
 .Ar port
 is not specified,
 sshd will listen on the address and all
 .Cm Port
 options specified.
-The default is to listen on all local addresses.
+The default is to listen on all local addresses on the current default
+routing domain.
 Multiple
 .Cm ListenAddress
 options are permitted.
+For more information on routing domains, see
+.Xr rdomain 4 .
 .It Cm LoginGraceTime
 The server disconnects after this time if the user has not
 successfully logged in.
@@ -962,8 +1002,6 @@
 .It
 hmac-md5-96
 .It
-hmac-ripemd160
-.It
 hmac-sha1
 .It
 hmac-sha1-96
@@ -980,8 +1018,6 @@
 .It
 hmac-md5-96-etm@openssh.com
 .It
-hmac-ripemd160-etm@openssh.com
-.It
 hmac-sha1-etm@openssh.com
 .It
 hmac-sha1-96-etm@openssh.com
@@ -1030,8 +1066,15 @@
 .Cm Host ,
 .Cm LocalAddress ,
 .Cm LocalPort ,
+.Cm RDomain ,
 and
-.Cm Address .
+.Cm Address
+(with
+.Cm RDomain
+representing the
+.Xr rdomain 4
+on which the connection was received.)
+.Pp
 The match patterns may consist of single entries or comma-separated
 lists and may use the wildcard and negation operators described in the
 .Sx PATTERNS
@@ -1080,10 +1123,12 @@
 .Cm IPQoS ,
 .Cm KbdInteractiveAuthentication ,
 .Cm KerberosAuthentication ,
+.Cm LogLevel ,
 .Cm MaxAuthTries ,
 .Cm MaxSessions ,
 .Cm PasswordAuthentication ,
 .Cm PermitEmptyPasswords ,
+.Cm PermitListen ,
 .Cm PermitOpen ,
 .Cm PermitRootLogin ,
 .Cm PermitTTY ,
@@ -1093,6 +1138,8 @@
 .Cm PubkeyAuthentication ,
 .Cm RekeyLimit ,
 .Cm RevokedKeys ,
+.Cm RDomain ,
+.Cm SetEnv ,
 .Cm StreamLocalBindMask ,
 .Cm StreamLocalBindUnlink ,
 .Cm TrustedUserCAKeys ,
@@ -1142,6 +1189,48 @@
 server allows login to accounts with empty password strings.
 The default is
 .Cm no .
+.It Cm PermitListen
+Specifies the addresses/ports on which a remote TCP port forwarding may listen.
+The listen specification must be one of the following forms:
+.Pp
+.Bl -item -offset indent -compact
+.It
+.Cm PermitListen
+.Sm off
+.Ar port
+.Sm on
+.It
+.Cm PermitListen
+.Sm off
+.Ar host : port
+.Sm on
+.El
+.Pp
+Multiple permissions may be specified by separating them with whitespace.
+An argument of
+.Cm any
+can be used to remove all restrictions and permit any listen requests.
+An argument of
+.Cm none
+can be used to prohibit all listen requests.
+The host name may contain wildcards as described in the PATTERNS section in
+.Xr ssh_config 5 .
+The wildcard
+.Sq *
+can also be used in place of a port number to allow all ports.
+By default all port forwarding listen requests are permitted.
+Note that the
+.Cm GatewayPorts
+option may further restrict which addresses may be listened on.
+Note also that
+.Xr ssh 1
+will request a listen host of
+.Dq localhost
+if no listen host was specifically requested, and this this name is
+treated differently to explicit localhost addresses of
+.Dq 127.0.0.1
+and
+.Dq ::1 .
 .It Cm PermitOpen
 Specifies the destinations to which TCP port forwarding is permitted.
 The forwarding specification must be one of the following forms:
@@ -1181,7 +1270,6 @@
 The argument must be
 .Cm yes ,
 .Cm prohibit-password ,
-.Cm without-password ,
 .Cm forced-commands-only ,
 or
 .Cm no .
@@ -1190,8 +1278,8 @@
 .Pp
 If this option is set to
 .Cm prohibit-password
-or
-.Cm without-password ,
+(or its deprecated alias,
+.Cm without-password ) ,
 password and keyboard-interactive authentication are disabled for root.
 .Pp
 If this option is set to
@@ -1245,6 +1333,12 @@
 .Pa ~/.ssh/authorized_keys
 are processed by
 .Xr sshd 8 .
+Valid options are
+.Cm yes ,
+.Cm no
+or a pattern-list specifying which environment variable names to accept
+(for example
+.Qq LANG,LC_* ) .
 The default is
 .Cm no .
 Enabling environment processing may enable users to bypass access
@@ -1291,7 +1385,7 @@
 .Cm yes .
 .It Cm PubkeyAcceptedKeyTypes
 Specifies the key types that will be accepted for public key authentication
-as a comma-separated pattern list.
+as a list of comma-separated patterns.
 Alternately if the specified value begins with a
 .Sq +
 character, then the specified key types will be appended to the default set
@@ -1306,9 +1400,10 @@
 ecdsa-sha2-nistp384-cert-v01@openssh.com,
 ecdsa-sha2-nistp521-cert-v01@openssh.com,
 ssh-ed25519-cert-v01@openssh.com,
+rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,
 ssh-rsa-cert-v01@openssh.com,
 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
-ssh-ed25519,ssh-rsa
+ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
 .Ed
 .Pp
 The list of available key types may also be obtained using
@@ -1354,6 +1449,30 @@
 .Xr ssh-keygen 1 .
 For more information on KRLs, see the KEY REVOCATION LISTS section in
 .Xr ssh-keygen 1 .
+.It Cm RDomain
+Specifies an explicit routing domain that is applied after authentication
+has completed.
+The user session, as well and any forwarded or listening IP sockets,
+will be bound to this
+.Xr rdomain 4 .
+If the routing domain is set to
+.Cm \&%D ,
+then the domain in which the incoming connection was received will be applied.
+.It Cm SetEnv
+Specifies one or more environment variables to set in child sessions started
+by
+.Xr sshd 8
+as
+.Dq NAME=VALUE .
+The environment value may be quoted (e.g. if it contains whitespace
+characters).
+Environment variables set by
+.Cm SetEnv
+override the default environment and any variables specified by the user
+via
+.Cm AcceptEnv
+or
+.Cm PermitUserEnvironment .
 .It Cm StreamLocalBindMask
 Sets the octal file creation mode mask
 .Pq umask
@@ -1494,28 +1613,6 @@
 as a non-root user.
 The default is
 .Cm no .
-.It Cm UsePrivilegeSeparation
-Specifies whether
-.Xr sshd 8
-separates privileges by creating an unprivileged child process
-to deal with incoming network traffic.
-After successful authentication, another process will be created that has
-the privilege of the authenticated user.
-The goal of privilege separation is to prevent privilege
-escalation by containing any corruption within the unprivileged processes.
-The argument must be
-.Cm yes ,
-.Cm no ,
-or
-.Cm sandbox .
-If
-.Cm UsePrivilegeSeparation
-is set to
-.Cm sandbox
-then the pre-authentication unprivileged process is subject to additional
-restrictions.
-The default is
-.Cm sandbox .
 .It Cm VersionAddendum
 Optionally specifies additional text to append to the SSH protocol banner
 sent by the server upon connection.
@@ -1641,6 +1738,8 @@
 .It %%
 A literal
 .Sq % .
+.It \&%D
+The routing domain in which the incoming connection was received.
 .It %F
 The fingerprint of the CA key.
 .It %f
@@ -1659,24 +1758,29 @@
 The type of the CA key.
 .It %t
 The key or certificate type.
+.It \&%U
+The numeric user ID of the target user.
 .It %u
 The username.
 .El
 .Pp
 .Cm AuthorizedKeysCommand
-accepts the tokens %%, %f, %h, %k, %t, and %u.
+accepts the tokens %%, %f, %h, %k, %t, %U, and %u.
 .Pp
 .Cm AuthorizedKeysFile
-accepts the tokens %%, %h, and %u.
+accepts the tokens %%, %h, %U, and %u.
 .Pp
 .Cm AuthorizedPrincipalsCommand
-accepts the tokens %%, %F, %f, %h, %i, %K, %k, %s, %T, %t, and %u.
+accepts the tokens %%, %F, %f, %h, %i, %K, %k, %s, %T, %t, %U, and %u.
 .Pp
 .Cm AuthorizedPrincipalsFile
-accepts the tokens %%, %h, and %u.
+accepts the tokens %%, %h, %U, and %u.
 .Pp
 .Cm ChrootDirectory
-accepts the tokens %%, %h, and %u.
+accepts the tokens %%, %h, %U, and %u.
+.Pp
+.Cm RoutingDomain
+accepts the token %D.
 .Sh FILES
 .Bl -tag -width Ds
 .It Pa /etc/ssh/sshd_config
diff --git a/ssherr.c b/ssherr.c
index 6802070..8ad3d57 100644
--- a/ssherr.c
+++ b/ssherr.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: ssherr.c,v 1.5 2015/09/13 14:39:16 tim Exp $	*/
+/*	$OpenBSD: ssherr.c,v 1.8 2018/07/03 11:39:54 djm Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller
  *
@@ -135,6 +135,12 @@
 		return "Connection corrupted";
 	case SSH_ERR_PROTOCOL_ERROR:
 		return "Protocol error";
+	case SSH_ERR_KEY_LENGTH:
+		return "Invalid key length";
+	case SSH_ERR_NUMBER_TOO_LARGE:
+		return "number is too large";
+	case SSH_ERR_SIGN_ALG_UNSUPPORTED:
+		return "signature algorithm not supported";
 	default:
 		return "unknown error";
 	}
diff --git a/ssherr.h b/ssherr.h
index 6f771b4..348da5a 100644
--- a/ssherr.h
+++ b/ssherr.h
@@ -1,4 +1,4 @@
-/*	$OpenBSD: ssherr.h,v 1.3 2015/01/30 01:13:33 djm Exp $	*/
+/*	$OpenBSD: ssherr.h,v 1.6 2018/07/03 11:39:54 djm Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller
  *
@@ -77,6 +77,9 @@
 #define SSH_ERR_CONN_TIMEOUT			-53
 #define SSH_ERR_CONN_CORRUPT			-54
 #define SSH_ERR_PROTOCOL_ERROR			-55
+#define SSH_ERR_KEY_LENGTH			-56
+#define SSH_ERR_NUMBER_TOO_LARGE		-57
+#define SSH_ERR_SIGN_ALG_UNSUPPORTED		-58
 
 /* Translate a numeric error code to a human-readable error string */
 const char *ssh_err(int n);
diff --git a/sshkey-xmss.c b/sshkey-xmss.c
new file mode 100644
index 0000000..aaae702
--- /dev/null
+++ b/sshkey-xmss.c
@@ -0,0 +1,1055 @@
+/* $OpenBSD: sshkey-xmss.c,v 1.3 2018/07/09 21:59:10 markus Exp $ */
+/*
+ * Copyright (c) 2017 Markus Friedl.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "includes.h"
+#ifdef WITH_XMSS
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#ifdef HAVE_SYS_FILE_H
+# include <sys/file.h>
+#endif
+
+#include "ssh2.h"
+#include "ssherr.h"
+#include "sshbuf.h"
+#include "cipher.h"
+#include "sshkey.h"
+#include "sshkey-xmss.h"
+#include "atomicio.h"
+
+#include "xmss_fast.h"
+
+/* opaque internal XMSS state */
+#define XMSS_MAGIC		"xmss-state-v1"
+#define XMSS_CIPHERNAME		"aes256-gcm@openssh.com"
+struct ssh_xmss_state {
+	xmss_params	params;
+	u_int32_t	n, w, h, k;
+
+	bds_state	bds;
+	u_char		*stack;
+	u_int32_t	stackoffset;
+	u_char		*stacklevels;
+	u_char		*auth;
+	u_char		*keep;
+	u_char		*th_nodes;
+	u_char		*retain;
+	treehash_inst	*treehash;
+
+	u_int32_t	idx;		/* state read from file */
+	u_int32_t	maxidx;		/* restricted # of signatures */
+	int		have_state;	/* .state file exists */
+	int		lockfd;		/* locked in sshkey_xmss_get_state() */
+	int		allow_update;	/* allow sshkey_xmss_update_state() */
+	char		*enc_ciphername;/* encrypt state with cipher */
+	u_char		*enc_keyiv;	/* encrypt state with key */
+	u_int32_t	enc_keyiv_len;	/* length of enc_keyiv */
+};
+
+int	 sshkey_xmss_init_bds_state(struct sshkey *);
+int	 sshkey_xmss_init_enc_key(struct sshkey *, const char *);
+void	 sshkey_xmss_free_bds(struct sshkey *);
+int	 sshkey_xmss_get_state_from_file(struct sshkey *, const char *,
+	    int *, sshkey_printfn *);
+int	 sshkey_xmss_encrypt_state(const struct sshkey *, struct sshbuf *,
+	    struct sshbuf **);
+int	 sshkey_xmss_decrypt_state(const struct sshkey *, struct sshbuf *,
+	    struct sshbuf **);
+int	 sshkey_xmss_serialize_enc_key(const struct sshkey *, struct sshbuf *);
+int	 sshkey_xmss_deserialize_enc_key(struct sshkey *, struct sshbuf *);
+
+#define PRINT(s...) do { if (pr) pr(s); } while (0)
+
+int
+sshkey_xmss_init(struct sshkey *key, const char *name)
+{
+	struct ssh_xmss_state *state;
+
+	if (key->xmss_state != NULL)
+		return SSH_ERR_INVALID_FORMAT;
+	if (name == NULL)
+		return SSH_ERR_INVALID_FORMAT;
+	state = calloc(sizeof(struct ssh_xmss_state), 1);
+	if (state == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	if (strcmp(name, XMSS_SHA2_256_W16_H10_NAME) == 0) {
+		state->n = 32;
+		state->w = 16;
+		state->h = 10;
+	} else if (strcmp(name, XMSS_SHA2_256_W16_H16_NAME) == 0) {
+		state->n = 32;
+		state->w = 16;
+		state->h = 16;
+	} else if (strcmp(name, XMSS_SHA2_256_W16_H20_NAME) == 0) {
+		state->n = 32;
+		state->w = 16;
+		state->h = 20;
+	} else {
+		free(state);
+		return SSH_ERR_KEY_TYPE_UNKNOWN;
+	}
+	if ((key->xmss_name = strdup(name)) == NULL) {
+		free(state);
+		return SSH_ERR_ALLOC_FAIL;
+	}
+	state->k = 2;	/* XXX hardcoded */
+	state->lockfd = -1;
+	if (xmss_set_params(&state->params, state->n, state->h, state->w,
+	    state->k) != 0) {
+		free(state);
+		return SSH_ERR_INVALID_FORMAT;
+	}
+	key->xmss_state = state;
+	return 0;
+}
+
+void
+sshkey_xmss_free_state(struct sshkey *key)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+
+	sshkey_xmss_free_bds(key);
+	if (state) {
+		if (state->enc_keyiv) {
+			explicit_bzero(state->enc_keyiv, state->enc_keyiv_len);
+			free(state->enc_keyiv);
+		}
+		free(state->enc_ciphername);
+		free(state);
+	}
+	key->xmss_state = NULL;
+}
+
+#define SSH_XMSS_K2_MAGIC	"k=2"
+#define num_stack(x)		((x->h+1)*(x->n))
+#define num_stacklevels(x)	(x->h+1)
+#define num_auth(x)		((x->h)*(x->n))
+#define num_keep(x)		((x->h >> 1)*(x->n))
+#define num_th_nodes(x)		((x->h - x->k)*(x->n))
+#define num_retain(x)		(((1ULL << x->k) - x->k - 1) * (x->n))
+#define num_treehash(x)		((x->h) - (x->k))
+
+int
+sshkey_xmss_init_bds_state(struct sshkey *key)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+	u_int32_t i;
+
+	state->stackoffset = 0;
+	if ((state->stack = calloc(num_stack(state), 1)) == NULL ||
+	    (state->stacklevels = calloc(num_stacklevels(state), 1))== NULL ||
+	    (state->auth = calloc(num_auth(state), 1)) == NULL ||
+	    (state->keep = calloc(num_keep(state), 1)) == NULL ||
+	    (state->th_nodes = calloc(num_th_nodes(state), 1)) == NULL ||
+	    (state->retain = calloc(num_retain(state), 1)) == NULL ||
+	    (state->treehash = calloc(num_treehash(state),
+	    sizeof(treehash_inst))) == NULL) {
+		sshkey_xmss_free_bds(key);
+		return SSH_ERR_ALLOC_FAIL;
+	}
+	for (i = 0; i < state->h - state->k; i++)
+		state->treehash[i].node = &state->th_nodes[state->n*i];
+	xmss_set_bds_state(&state->bds, state->stack, state->stackoffset,
+	    state->stacklevels, state->auth, state->keep, state->treehash,
+	    state->retain, 0);
+	return 0;
+}
+
+void
+sshkey_xmss_free_bds(struct sshkey *key)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+
+	if (state == NULL)
+		return;
+	free(state->stack);
+	free(state->stacklevels);
+	free(state->auth);
+	free(state->keep);
+	free(state->th_nodes);
+	free(state->retain);
+	free(state->treehash);
+	state->stack = NULL;
+	state->stacklevels = NULL;
+	state->auth = NULL;
+	state->keep = NULL;
+	state->th_nodes = NULL;
+	state->retain = NULL;
+	state->treehash = NULL;
+}
+
+void *
+sshkey_xmss_params(const struct sshkey *key)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+
+	if (state == NULL)
+		return NULL;
+	return &state->params;
+}
+
+void *
+sshkey_xmss_bds_state(const struct sshkey *key)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+
+	if (state == NULL)
+		return NULL;
+	return &state->bds;
+}
+
+int
+sshkey_xmss_siglen(const struct sshkey *key, size_t *lenp)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+
+	if (lenp == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (state == NULL)
+		return SSH_ERR_INVALID_FORMAT;
+	*lenp = 4 + state->n +
+	    state->params.wots_par.keysize +
+	    state->h * state->n;
+	return 0;
+}
+
+size_t
+sshkey_xmss_pklen(const struct sshkey *key)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+
+	if (state == NULL)
+		return 0;
+	return state->n * 2;
+}
+
+size_t
+sshkey_xmss_sklen(const struct sshkey *key)
+{
+	struct ssh_xmss_state *state = key->xmss_state;
+
+	if (state == NULL)
+		return 0;
+	return state->n * 4 + 4;
+}
+
+int
+sshkey_xmss_init_enc_key(struct sshkey *k, const char *ciphername)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	const struct sshcipher *cipher;
+	size_t keylen = 0, ivlen = 0;
+
+	if (state == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((cipher = cipher_by_name(ciphername)) == NULL)
+		return SSH_ERR_INTERNAL_ERROR;
+	if ((state->enc_ciphername = strdup(ciphername)) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	keylen = cipher_keylen(cipher);
+	ivlen = cipher_ivlen(cipher);
+	state->enc_keyiv_len = keylen + ivlen;
+	if ((state->enc_keyiv = calloc(state->enc_keyiv_len, 1)) == NULL) {
+		free(state->enc_ciphername);
+		state->enc_ciphername = NULL;
+		return SSH_ERR_ALLOC_FAIL;
+	}
+	arc4random_buf(state->enc_keyiv, state->enc_keyiv_len);
+	return 0;
+}
+
+int
+sshkey_xmss_serialize_enc_key(const struct sshkey *k, struct sshbuf *b)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	int r;
+
+	if (state == NULL || state->enc_keyiv == NULL ||
+	    state->enc_ciphername == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = sshbuf_put_cstring(b, state->enc_ciphername)) != 0 ||
+	    (r = sshbuf_put_string(b, state->enc_keyiv,
+	    state->enc_keyiv_len)) != 0)
+		return r;
+	return 0;
+}
+
+int
+sshkey_xmss_deserialize_enc_key(struct sshkey *k, struct sshbuf *b)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	size_t len;
+	int r;
+
+	if (state == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = sshbuf_get_cstring(b, &state->enc_ciphername, NULL)) != 0 ||
+	    (r = sshbuf_get_string(b, &state->enc_keyiv, &len)) != 0)
+		return r;
+	state->enc_keyiv_len = len;
+	return 0;
+}
+
+int
+sshkey_xmss_serialize_pk_info(const struct sshkey *k, struct sshbuf *b,
+    enum sshkey_serialize_rep opts)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	u_char have_info = 1;
+	u_int32_t idx;
+	int r;
+
+	if (state == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (opts != SSHKEY_SERIALIZE_INFO)
+		return 0;
+	idx = k->xmss_sk ? PEEK_U32(k->xmss_sk) : state->idx;
+	if ((r = sshbuf_put_u8(b, have_info)) != 0 ||
+	    (r = sshbuf_put_u32(b, idx)) != 0 ||
+	    (r = sshbuf_put_u32(b, state->maxidx)) != 0)
+		return r;
+	return 0;
+}
+
+int
+sshkey_xmss_deserialize_pk_info(struct sshkey *k, struct sshbuf *b)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	u_char have_info;
+	int r;
+
+	if (state == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	/* optional */
+	if (sshbuf_len(b) == 0)
+		return 0;
+	if ((r = sshbuf_get_u8(b, &have_info)) != 0)
+		return r;
+	if (have_info != 1)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = sshbuf_get_u32(b, &state->idx)) != 0 ||
+	    (r = sshbuf_get_u32(b, &state->maxidx)) != 0)
+		return r;
+	return 0;
+}
+
+int
+sshkey_xmss_generate_private_key(struct sshkey *k, u_int bits)
+{
+	int r;
+	const char *name;
+
+	if (bits == 10) {
+		name = XMSS_SHA2_256_W16_H10_NAME;
+	} else if (bits == 16) {
+		name = XMSS_SHA2_256_W16_H16_NAME;
+	} else if (bits == 20) {
+		name = XMSS_SHA2_256_W16_H20_NAME;
+	} else {
+		name = XMSS_DEFAULT_NAME;
+	}
+	if ((r = sshkey_xmss_init(k, name)) != 0 ||
+	    (r = sshkey_xmss_init_bds_state(k)) != 0 ||
+	    (r = sshkey_xmss_init_enc_key(k, XMSS_CIPHERNAME)) != 0)
+		return r;
+	if ((k->xmss_pk = malloc(sshkey_xmss_pklen(k))) == NULL ||
+	    (k->xmss_sk = malloc(sshkey_xmss_sklen(k))) == NULL) {
+		return SSH_ERR_ALLOC_FAIL;
+	}
+	xmss_keypair(k->xmss_pk, k->xmss_sk, sshkey_xmss_bds_state(k),
+	    sshkey_xmss_params(k));
+	return 0;
+}
+
+int
+sshkey_xmss_get_state_from_file(struct sshkey *k, const char *filename,
+    int *have_file, sshkey_printfn *pr)
+{
+	struct sshbuf *b = NULL, *enc = NULL;
+	int ret = SSH_ERR_SYSTEM_ERROR, r, fd = -1;
+	u_int32_t len;
+	unsigned char buf[4], *data = NULL;
+
+	*have_file = 0;
+	if ((fd = open(filename, O_RDONLY)) >= 0) {
+		*have_file = 1;
+		if (atomicio(read, fd, buf, sizeof(buf)) != sizeof(buf)) {
+			PRINT("%s: corrupt state file: %s", __func__, filename);
+			goto done;
+		}
+		len = PEEK_U32(buf);
+		if ((data = calloc(len, 1)) == NULL) {
+			ret = SSH_ERR_ALLOC_FAIL;
+			goto done;
+		}
+		if (atomicio(read, fd, data, len) != len) {
+			PRINT("%s: cannot read blob: %s", __func__, filename);
+			goto done;
+		}
+		if ((enc = sshbuf_from(data, len)) == NULL) {
+			ret = SSH_ERR_ALLOC_FAIL;
+			goto done;
+		}
+		sshkey_xmss_free_bds(k);
+		if ((r = sshkey_xmss_decrypt_state(k, enc, &b)) != 0) {
+			ret = r;
+			goto done;
+		}
+		if ((r = sshkey_xmss_deserialize_state(k, b)) != 0) {
+			ret = r;
+			goto done;
+		}
+		ret = 0;
+	}
+done:
+	if (fd != -1)
+		close(fd);
+	free(data);
+	sshbuf_free(enc);
+	sshbuf_free(b);
+	return ret;
+}
+
+int
+sshkey_xmss_get_state(const struct sshkey *k, sshkey_printfn *pr)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	u_int32_t idx = 0;
+	char *filename = NULL;
+	char *statefile = NULL, *ostatefile = NULL, *lockfile = NULL;
+	int lockfd = -1, have_state = 0, have_ostate, tries = 0;
+	int ret = SSH_ERR_INVALID_ARGUMENT, r;
+
+	if (state == NULL)
+		goto done;
+	/*
+	 * If maxidx is set, then we are allowed a limited number
+	 * of signatures, but don't need to access the disk.
+	 * Otherwise we need to deal with the on-disk state.
+	 */
+	if (state->maxidx) {
+		/* xmss_sk always contains the current state */
+		idx = PEEK_U32(k->xmss_sk);
+		if (idx < state->maxidx) {
+			state->allow_update = 1;
+			return 0;
+		}
+		return SSH_ERR_INVALID_ARGUMENT;
+	}
+	if ((filename = k->xmss_filename) == NULL)
+		goto done;
+	if (asprintf(&lockfile, "%s.lock", filename) < 0 ||
+	    asprintf(&statefile, "%s.state", filename) < 0 ||
+	    asprintf(&ostatefile, "%s.ostate", filename) < 0) {
+		ret = SSH_ERR_ALLOC_FAIL;
+		goto done;
+	}
+	if ((lockfd = open(lockfile, O_CREAT|O_RDONLY, 0600)) < 0) {
+		ret = SSH_ERR_SYSTEM_ERROR;
+		PRINT("%s: cannot open/create: %s", __func__, lockfile);
+		goto done;
+	}
+	while (flock(lockfd, LOCK_EX|LOCK_NB) < 0) {
+		if (errno != EWOULDBLOCK) {
+			ret = SSH_ERR_SYSTEM_ERROR;
+			PRINT("%s: cannot lock: %s", __func__, lockfile);
+			goto done;
+		}
+		if (++tries > 10) {
+			ret = SSH_ERR_SYSTEM_ERROR;
+			PRINT("%s: giving up on: %s", __func__, lockfile);
+			goto done;
+		}
+		usleep(1000*100*tries);
+	}
+	/* XXX no longer const */
+	if ((r = sshkey_xmss_get_state_from_file((struct sshkey *)k,
+	    statefile, &have_state, pr)) != 0) {
+		if ((r = sshkey_xmss_get_state_from_file((struct sshkey *)k,
+		    ostatefile, &have_ostate, pr)) == 0) {
+			state->allow_update = 1;
+			r = sshkey_xmss_forward_state(k, 1);
+			state->idx = PEEK_U32(k->xmss_sk);
+			state->allow_update = 0;
+		}
+	}
+	if (!have_state && !have_ostate) {
+		/* check that bds state is initialized */
+		if (state->bds.auth == NULL)
+			goto done;
+		PRINT("%s: start from scratch idx 0: %u", __func__, state->idx);
+	} else if (r != 0) {
+		ret = r;
+		goto done;
+	}
+	if (state->idx + 1 < state->idx) {
+		PRINT("%s: state wrap: %u", __func__, state->idx);
+		goto done;
+	}
+	state->have_state = have_state;
+	state->lockfd = lockfd;
+	state->allow_update = 1;
+	lockfd = -1;
+	ret = 0;
+done:
+	if (lockfd != -1)
+		close(lockfd);
+	free(lockfile);
+	free(statefile);
+	free(ostatefile);
+	return ret;
+}
+
+int
+sshkey_xmss_forward_state(const struct sshkey *k, u_int32_t reserve)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	u_char *sig = NULL;
+	size_t required_siglen;
+	unsigned long long smlen;
+	u_char data;
+	int ret, r;
+
+	if (state == NULL || !state->allow_update)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (reserve == 0)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (state->idx + reserve <= state->idx)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = sshkey_xmss_siglen(k, &required_siglen)) != 0)
+		return r;
+	if ((sig = malloc(required_siglen)) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	while (reserve-- > 0) {
+		state->idx = PEEK_U32(k->xmss_sk);
+		smlen = required_siglen;
+		if ((ret = xmss_sign(k->xmss_sk, sshkey_xmss_bds_state(k),
+		    sig, &smlen, &data, 0, sshkey_xmss_params(k))) != 0) {
+			r = SSH_ERR_INVALID_ARGUMENT;
+			break;
+		}
+	}
+	free(sig);
+	return r;
+}
+
+int
+sshkey_xmss_update_state(const struct sshkey *k, sshkey_printfn *pr)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	struct sshbuf *b = NULL, *enc = NULL;
+	u_int32_t idx = 0;
+	unsigned char buf[4];
+	char *filename = NULL;
+	char *statefile = NULL, *ostatefile = NULL, *nstatefile = NULL;
+	int fd = -1;
+	int ret = SSH_ERR_INVALID_ARGUMENT;
+
+	if (state == NULL || !state->allow_update)
+		return ret;
+	if (state->maxidx) {
+		/* no update since the number of signatures is limited */
+		ret = 0;
+		goto done;
+	}
+	idx = PEEK_U32(k->xmss_sk);
+	if (idx == state->idx) {
+		/* no signature happened, no need to update */
+		ret = 0;
+		goto done;
+	} else if (idx != state->idx + 1) {
+		PRINT("%s: more than one signature happened: idx %u state %u",
+		     __func__, idx, state->idx);
+		goto done;
+	}
+	state->idx = idx;
+	if ((filename = k->xmss_filename) == NULL)
+		goto done;
+	if (asprintf(&statefile, "%s.state", filename) < 0 ||
+	    asprintf(&ostatefile, "%s.ostate", filename) < 0 ||
+	    asprintf(&nstatefile, "%s.nstate", filename) < 0) {
+		ret = SSH_ERR_ALLOC_FAIL;
+		goto done;
+	}
+	unlink(nstatefile);
+	if ((b = sshbuf_new()) == NULL) {
+		ret = SSH_ERR_ALLOC_FAIL;
+		goto done;
+	}
+	if ((ret = sshkey_xmss_serialize_state(k, b)) != 0) {
+		PRINT("%s: SERLIALIZE FAILED: %d", __func__, ret);
+		goto done;
+	}
+	if ((ret = sshkey_xmss_encrypt_state(k, b, &enc)) != 0) {
+		PRINT("%s: ENCRYPT FAILED: %d", __func__, ret);
+		goto done;
+	}
+	if ((fd = open(nstatefile, O_CREAT|O_WRONLY|O_EXCL, 0600)) < 0) {
+		ret = SSH_ERR_SYSTEM_ERROR;
+		PRINT("%s: open new state file: %s", __func__, nstatefile);
+		goto done;
+	}
+	POKE_U32(buf, sshbuf_len(enc));
+	if (atomicio(vwrite, fd, buf, sizeof(buf)) != sizeof(buf)) {
+		ret = SSH_ERR_SYSTEM_ERROR;
+		PRINT("%s: write new state file hdr: %s", __func__, nstatefile);
+		close(fd);
+		goto done;
+	}
+	if (atomicio(vwrite, fd, sshbuf_mutable_ptr(enc), sshbuf_len(enc)) !=
+	    sshbuf_len(enc)) {
+		ret = SSH_ERR_SYSTEM_ERROR;
+		PRINT("%s: write new state file data: %s", __func__, nstatefile);
+		close(fd);
+		goto done;
+	}
+	if (fsync(fd) < 0) {
+		ret = SSH_ERR_SYSTEM_ERROR;
+		PRINT("%s: sync new state file: %s", __func__, nstatefile);
+		close(fd);
+		goto done;
+	}
+	if (close(fd) < 0) {
+		ret = SSH_ERR_SYSTEM_ERROR;
+		PRINT("%s: close new state file: %s", __func__, nstatefile);
+		goto done;
+	}
+	if (state->have_state) {
+		unlink(ostatefile);
+		if (link(statefile, ostatefile)) {
+			ret = SSH_ERR_SYSTEM_ERROR;
+			PRINT("%s: backup state %s to %s", __func__, statefile,
+			    ostatefile);
+			goto done;
+		}
+	}
+	if (rename(nstatefile, statefile) < 0) {
+		ret = SSH_ERR_SYSTEM_ERROR;
+		PRINT("%s: rename %s to %s", __func__, nstatefile, statefile);
+		goto done;
+	}
+	ret = 0;
+done:
+	if (state->lockfd != -1) {
+		close(state->lockfd);
+		state->lockfd = -1;
+	}
+	if (nstatefile)
+		unlink(nstatefile);
+	free(statefile);
+	free(ostatefile);
+	free(nstatefile);
+	sshbuf_free(b);
+	sshbuf_free(enc);
+	return ret;
+}
+
+int
+sshkey_xmss_serialize_state(const struct sshkey *k, struct sshbuf *b)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	treehash_inst *th;
+	u_int32_t i, node;
+	int r;
+
+	if (state == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (state->stack == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	state->stackoffset = state->bds.stackoffset;	/* copy back */
+	if ((r = sshbuf_put_cstring(b, SSH_XMSS_K2_MAGIC)) != 0 ||
+	    (r = sshbuf_put_u32(b, state->idx)) != 0 ||
+	    (r = sshbuf_put_string(b, state->stack, num_stack(state))) != 0 ||
+	    (r = sshbuf_put_u32(b, state->stackoffset)) != 0 ||
+	    (r = sshbuf_put_string(b, state->stacklevels, num_stacklevels(state))) != 0 ||
+	    (r = sshbuf_put_string(b, state->auth, num_auth(state))) != 0 ||
+	    (r = sshbuf_put_string(b, state->keep, num_keep(state))) != 0 ||
+	    (r = sshbuf_put_string(b, state->th_nodes, num_th_nodes(state))) != 0 ||
+	    (r = sshbuf_put_string(b, state->retain, num_retain(state))) != 0 ||
+	    (r = sshbuf_put_u32(b, num_treehash(state))) != 0)
+		return r;
+	for (i = 0; i < num_treehash(state); i++) {
+		th = &state->treehash[i];
+		node = th->node - state->th_nodes;
+		if ((r = sshbuf_put_u32(b, th->h)) != 0 ||
+		    (r = sshbuf_put_u32(b, th->next_idx)) != 0 ||
+		    (r = sshbuf_put_u32(b, th->stackusage)) != 0 ||
+		    (r = sshbuf_put_u8(b, th->completed)) != 0 ||
+		    (r = sshbuf_put_u32(b, node)) != 0)
+			return r;
+	}
+	return 0;
+}
+
+int
+sshkey_xmss_serialize_state_opt(const struct sshkey *k, struct sshbuf *b,
+    enum sshkey_serialize_rep opts)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	int r = SSH_ERR_INVALID_ARGUMENT;
+
+	if (state == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = sshbuf_put_u8(b, opts)) != 0)
+		return r;
+	switch (opts) {
+	case SSHKEY_SERIALIZE_STATE:
+		r = sshkey_xmss_serialize_state(k, b);
+		break;
+	case SSHKEY_SERIALIZE_FULL:
+		if ((r = sshkey_xmss_serialize_enc_key(k, b)) != 0)
+			break;
+		r = sshkey_xmss_serialize_state(k, b);
+		break;
+	case SSHKEY_SERIALIZE_DEFAULT:
+		r = 0;
+		break;
+	default:
+		r = SSH_ERR_INVALID_ARGUMENT;
+		break;
+	}
+	return r;
+}
+
+int
+sshkey_xmss_deserialize_state(struct sshkey *k, struct sshbuf *b)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	treehash_inst *th;
+	u_int32_t i, lh, node;
+	size_t ls, lsl, la, lk, ln, lr;
+	char *magic;
+	int r;
+
+	if (state == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (k->xmss_sk == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((state->treehash = calloc(num_treehash(state),
+	    sizeof(treehash_inst))) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	if ((r = sshbuf_get_cstring(b, &magic, NULL)) != 0 ||
+	    (r = sshbuf_get_u32(b, &state->idx)) != 0 ||
+	    (r = sshbuf_get_string(b, &state->stack, &ls)) != 0 ||
+	    (r = sshbuf_get_u32(b, &state->stackoffset)) != 0 ||
+	    (r = sshbuf_get_string(b, &state->stacklevels, &lsl)) != 0 ||
+	    (r = sshbuf_get_string(b, &state->auth, &la)) != 0 ||
+	    (r = sshbuf_get_string(b, &state->keep, &lk)) != 0 ||
+	    (r = sshbuf_get_string(b, &state->th_nodes, &ln)) != 0 ||
+	    (r = sshbuf_get_string(b, &state->retain, &lr)) != 0 ||
+	    (r = sshbuf_get_u32(b, &lh)) != 0)
+		return r;
+	if (strcmp(magic, SSH_XMSS_K2_MAGIC) != 0)
+		return SSH_ERR_INVALID_ARGUMENT;
+	/* XXX check stackoffset */
+	if (ls != num_stack(state) ||
+	    lsl != num_stacklevels(state) ||
+	    la != num_auth(state) ||
+	    lk != num_keep(state) ||
+	    ln != num_th_nodes(state) ||
+	    lr != num_retain(state) ||
+	    lh != num_treehash(state))
+		return SSH_ERR_INVALID_ARGUMENT;
+	for (i = 0; i < num_treehash(state); i++) {
+		th = &state->treehash[i];
+		if ((r = sshbuf_get_u32(b, &th->h)) != 0 ||
+		    (r = sshbuf_get_u32(b, &th->next_idx)) != 0 ||
+		    (r = sshbuf_get_u32(b, &th->stackusage)) != 0 ||
+		    (r = sshbuf_get_u8(b, &th->completed)) != 0 ||
+		    (r = sshbuf_get_u32(b, &node)) != 0)
+			return r;
+		if (node < num_th_nodes(state))
+			th->node = &state->th_nodes[node];
+	}
+	POKE_U32(k->xmss_sk, state->idx);
+	xmss_set_bds_state(&state->bds, state->stack, state->stackoffset,
+	    state->stacklevels, state->auth, state->keep, state->treehash,
+	    state->retain, 0);
+	return 0;
+}
+
+int
+sshkey_xmss_deserialize_state_opt(struct sshkey *k, struct sshbuf *b)
+{
+	enum sshkey_serialize_rep opts;
+	u_char have_state;
+	int r;
+
+	if ((r = sshbuf_get_u8(b, &have_state)) != 0)
+		return r;
+
+	opts = have_state;
+	switch (opts) {
+	case SSHKEY_SERIALIZE_DEFAULT:
+		r = 0;
+		break;
+	case SSHKEY_SERIALIZE_STATE:
+		if ((r = sshkey_xmss_deserialize_state(k, b)) != 0)
+			return r;
+		break;
+	case SSHKEY_SERIALIZE_FULL:
+		if ((r = sshkey_xmss_deserialize_enc_key(k, b)) != 0 ||
+		    (r = sshkey_xmss_deserialize_state(k, b)) != 0)
+			return r;
+		break;
+	default:
+		r = SSH_ERR_INVALID_FORMAT;
+		break;
+	}
+	return r;
+}
+
+int
+sshkey_xmss_encrypt_state(const struct sshkey *k, struct sshbuf *b,
+   struct sshbuf **retp)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	struct sshbuf *encrypted = NULL, *encoded = NULL, *padded = NULL;
+	struct sshcipher_ctx *ciphercontext = NULL;
+	const struct sshcipher *cipher;
+	u_char *cp, *key, *iv = NULL;
+	size_t i, keylen, ivlen, blocksize, authlen, encrypted_len, aadlen;
+	int r = SSH_ERR_INTERNAL_ERROR;
+
+	if (retp != NULL)
+		*retp = NULL;
+	if (state == NULL ||
+	    state->enc_keyiv == NULL ||
+	    state->enc_ciphername == NULL)
+		return SSH_ERR_INTERNAL_ERROR;
+	if ((cipher = cipher_by_name(state->enc_ciphername)) == NULL) {
+		r = SSH_ERR_INTERNAL_ERROR;
+		goto out;
+	}
+	blocksize = cipher_blocksize(cipher);
+	keylen = cipher_keylen(cipher);
+	ivlen = cipher_ivlen(cipher);
+	authlen = cipher_authlen(cipher);
+	if (state->enc_keyiv_len != keylen + ivlen) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+	key = state->enc_keyiv;
+	if ((encrypted = sshbuf_new()) == NULL ||
+	    (encoded = sshbuf_new()) == NULL ||
+	    (padded = sshbuf_new()) == NULL ||
+	    (iv = malloc(ivlen)) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+
+	/* replace first 4 bytes of IV with index to ensure uniqueness */
+	memcpy(iv, key + keylen, ivlen);
+	POKE_U32(iv, state->idx);
+
+	if ((r = sshbuf_put(encoded, XMSS_MAGIC, sizeof(XMSS_MAGIC))) != 0 ||
+	    (r = sshbuf_put_u32(encoded, state->idx)) != 0)
+		goto out;
+
+	/* padded state will be encrypted */
+	if ((r = sshbuf_putb(padded, b)) != 0)
+		goto out;
+	i = 0;
+	while (sshbuf_len(padded) % blocksize) {
+		if ((r = sshbuf_put_u8(padded, ++i & 0xff)) != 0)
+			goto out;
+	}
+	encrypted_len = sshbuf_len(padded);
+
+	/* header including the length of state is used as AAD */
+	if ((r = sshbuf_put_u32(encoded, encrypted_len)) != 0)
+		goto out;
+	aadlen = sshbuf_len(encoded);
+
+	/* concat header and state */
+	if ((r = sshbuf_putb(encoded, padded)) != 0)
+		goto out;
+
+	/* reserve space for encryption of encoded data plus auth tag */
+	/* encrypt at offset addlen */
+	if ((r = sshbuf_reserve(encrypted,
+	    encrypted_len + aadlen + authlen, &cp)) != 0 ||
+	    (r = cipher_init(&ciphercontext, cipher, key, keylen,
+	    iv, ivlen, 1)) != 0 ||
+	    (r = cipher_crypt(ciphercontext, 0, cp, sshbuf_ptr(encoded),
+	    encrypted_len, aadlen, authlen)) != 0)
+		goto out;
+
+	/* success */
+	r = 0;
+ out:
+	if (retp != NULL) {
+		*retp = encrypted;
+		encrypted = NULL;
+	}
+	sshbuf_free(padded);
+	sshbuf_free(encoded);
+	sshbuf_free(encrypted);
+	cipher_free(ciphercontext);
+	free(iv);
+	return r;
+}
+
+int
+sshkey_xmss_decrypt_state(const struct sshkey *k, struct sshbuf *encoded,
+   struct sshbuf **retp)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	struct sshbuf *copy = NULL, *decrypted = NULL;
+	struct sshcipher_ctx *ciphercontext = NULL;
+	const struct sshcipher *cipher = NULL;
+	u_char *key, *iv = NULL, *dp;
+	size_t keylen, ivlen, authlen, aadlen;
+	u_int blocksize, encrypted_len, index;
+	int r = SSH_ERR_INTERNAL_ERROR;
+
+	if (retp != NULL)
+		*retp = NULL;
+	if (state == NULL ||
+	    state->enc_keyiv == NULL ||
+	    state->enc_ciphername == NULL)
+		return SSH_ERR_INTERNAL_ERROR;
+	if ((cipher = cipher_by_name(state->enc_ciphername)) == NULL) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+	blocksize = cipher_blocksize(cipher);
+	keylen = cipher_keylen(cipher);
+	ivlen = cipher_ivlen(cipher);
+	authlen = cipher_authlen(cipher);
+	if (state->enc_keyiv_len != keylen + ivlen) {
+		r = SSH_ERR_INTERNAL_ERROR;
+		goto out;
+	}
+	key = state->enc_keyiv;
+
+	if ((copy = sshbuf_fromb(encoded)) == NULL ||
+	    (decrypted = sshbuf_new()) == NULL ||
+	    (iv = malloc(ivlen)) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+
+	/* check magic */
+	if (sshbuf_len(encoded) < sizeof(XMSS_MAGIC) ||
+	    memcmp(sshbuf_ptr(encoded), XMSS_MAGIC, sizeof(XMSS_MAGIC))) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+	/* parse public portion */
+	if ((r = sshbuf_consume(encoded, sizeof(XMSS_MAGIC))) != 0 ||
+	    (r = sshbuf_get_u32(encoded, &index)) != 0 ||
+	    (r = sshbuf_get_u32(encoded, &encrypted_len)) != 0)
+		goto out;
+
+	/* check size of encrypted key blob */
+	if (encrypted_len < blocksize || (encrypted_len % blocksize) != 0) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+	/* check that an appropriate amount of auth data is present */
+	if (sshbuf_len(encoded) < encrypted_len + authlen) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+
+	aadlen = sshbuf_len(copy) - sshbuf_len(encoded);
+
+	/* replace first 4 bytes of IV with index to ensure uniqueness */
+	memcpy(iv, key + keylen, ivlen);
+	POKE_U32(iv, index);
+
+	/* decrypt private state of key */
+	if ((r = sshbuf_reserve(decrypted, aadlen + encrypted_len, &dp)) != 0 ||
+	    (r = cipher_init(&ciphercontext, cipher, key, keylen,
+	    iv, ivlen, 0)) != 0 ||
+	    (r = cipher_crypt(ciphercontext, 0, dp, sshbuf_ptr(copy),
+	    encrypted_len, aadlen, authlen)) != 0)
+		goto out;
+
+	/* there should be no trailing data */
+	if ((r = sshbuf_consume(encoded, encrypted_len + authlen)) != 0)
+		goto out;
+	if (sshbuf_len(encoded) != 0) {
+		r = SSH_ERR_INVALID_FORMAT;
+		goto out;
+	}
+
+	/* remove AAD */
+	if ((r = sshbuf_consume(decrypted, aadlen)) != 0)
+		goto out;
+	/* XXX encrypted includes unchecked padding */
+
+	/* success */
+	r = 0;
+	if (retp != NULL) {
+		*retp = decrypted;
+		decrypted = NULL;
+	}
+ out:
+	cipher_free(ciphercontext);
+	sshbuf_free(copy);
+	sshbuf_free(decrypted);
+	free(iv);
+	return r;
+}
+
+u_int32_t
+sshkey_xmss_signatures_left(const struct sshkey *k)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+	u_int32_t idx;
+
+	if (sshkey_type_plain(k->type) == KEY_XMSS && state &&
+	    state->maxidx) {
+		idx = k->xmss_sk ? PEEK_U32(k->xmss_sk) : state->idx;
+		if (idx < state->maxidx)
+			return state->maxidx - idx;
+	}
+	return 0;
+}
+
+int
+sshkey_xmss_enable_maxsign(struct sshkey *k, u_int32_t maxsign)
+{
+	struct ssh_xmss_state *state = k->xmss_state;
+
+	if (sshkey_type_plain(k->type) != KEY_XMSS)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (maxsign == 0)
+		return 0;
+	if (state->idx + maxsign < state->idx)
+		return SSH_ERR_INVALID_ARGUMENT;
+	state->maxidx = state->idx + maxsign;
+	return 0;
+}
+#endif /* WITH_XMSS */
diff --git a/sshkey-xmss.h b/sshkey-xmss.h
new file mode 100644
index 0000000..b9f8ead
--- /dev/null
+++ b/sshkey-xmss.h
@@ -0,0 +1,56 @@
+/* $OpenBSD: sshkey-xmss.h,v 1.1 2018/02/23 15:58:38 markus Exp $ */
+/*
+ * Copyright (c) 2017 Markus Friedl.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef SSHKEY_XMSS_H
+#define SSHKEY_XMSS_H
+
+#define XMSS_SHA2_256_W16_H10_NAME "XMSS_SHA2-256_W16_H10"
+#define XMSS_SHA2_256_W16_H16_NAME "XMSS_SHA2-256_W16_H16"
+#define XMSS_SHA2_256_W16_H20_NAME "XMSS_SHA2-256_W16_H20"
+#define XMSS_DEFAULT_NAME	   XMSS_SHA2_256_W16_H10_NAME
+
+size_t	 sshkey_xmss_pklen(const struct sshkey *);
+size_t	 sshkey_xmss_sklen(const struct sshkey *);
+int	 sshkey_xmss_init(struct sshkey *, const char *);
+void	 sshkey_xmss_free_state(struct sshkey *);
+int	 sshkey_xmss_generate_private_key(struct sshkey *, u_int);
+int	 sshkey_xmss_serialize_state(const struct sshkey *, struct sshbuf *);
+int	 sshkey_xmss_serialize_state_opt(const struct sshkey *, struct sshbuf *,
+            enum sshkey_serialize_rep);
+int	 sshkey_xmss_serialize_pk_info(const struct sshkey *, struct sshbuf *,
+	    enum sshkey_serialize_rep);
+int	 sshkey_xmss_deserialize_state(struct sshkey *, struct sshbuf *);
+int	 sshkey_xmss_deserialize_state_opt(struct sshkey *, struct sshbuf *);
+int	 sshkey_xmss_deserialize_pk_info(struct sshkey *, struct sshbuf *);
+
+int	 sshkey_xmss_siglen(const struct sshkey *, size_t *);
+void	*sshkey_xmss_params(const struct sshkey *);
+void	*sshkey_xmss_bds_state(const struct sshkey *);
+int	 sshkey_xmss_get_state(const struct sshkey *, sshkey_printfn *);
+int	 sshkey_xmss_enable_maxsign(struct sshkey *, u_int32_t);
+int	 sshkey_xmss_forward_state(const struct sshkey *, u_int32_t);
+int	 sshkey_xmss_update_state(const struct sshkey *, sshkey_printfn *);
+u_int32_t sshkey_xmss_signatures_left(const struct sshkey *);
+
+#endif /* SSHKEY_XMSS_H */
diff --git a/sshkey.c b/sshkey.c
index 724a526..27b23c7 100644
--- a/sshkey.c
+++ b/sshkey.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshkey.c,v 1.43 2017/02/17 02:31:14 dtucker Exp $ */
+/* $OpenBSD: sshkey.c,v 1.66 2018/07/03 13:20:25 djm Exp $ */
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2008 Alexander von Gernler.  All rights reserved.
@@ -51,13 +51,15 @@
 #include "ssherr.h"
 #include "misc.h"
 #include "sshbuf.h"
-#include "rsa.h"
 #include "cipher.h"
 #include "digest.h"
 #define SSHKEY_INTERNAL
 #include "sshkey.h"
+#include "sshkey-xmss.h"
 #include "match.h"
 
+#include "xmss_fast.h"
+
 /* openssh private key file format */
 #define MARK_BEGIN		"-----BEGIN OPENSSH PRIVATE KEY-----\n"
 #define MARK_END		"-----END OPENSSH PRIVATE KEY-----\n"
@@ -66,12 +68,14 @@
 #define KDFNAME			"bcrypt"
 #define AUTH_MAGIC		"openssh-key-v1"
 #define SALT_LEN		16
-#define DEFAULT_CIPHERNAME	"aes256-cbc"
+#define DEFAULT_CIPHERNAME	"aes256-ctr"
 #define	DEFAULT_ROUNDS		16
 
 /* Version identification string for SSH v1 identity files. */
 #define LEGACY_BEGIN		"SSH PRIVATE KEY FILE FORMAT 1.1\n"
 
+int	sshkey_private_serialize_opt(const struct sshkey *key,
+    struct sshbuf *buf, enum sshkey_serialize_rep);
 static int sshkey_from_blob_internal(struct sshbuf *buf,
     struct sshkey **keyp, int allow_cert);
 
@@ -79,44 +83,64 @@
 struct keytype {
 	const char *name;
 	const char *shortname;
+	const char *sigalg;
 	int type;
 	int nid;
 	int cert;
 	int sigonly;
 };
 static const struct keytype keytypes[] = {
-	{ "ssh-ed25519", "ED25519", KEY_ED25519, 0, 0, 0 },
-	{ "ssh-ed25519-cert-v01@openssh.com", "ED25519-CERT",
+	{ "ssh-ed25519", "ED25519", NULL, KEY_ED25519, 0, 0, 0 },
+	{ "ssh-ed25519-cert-v01@openssh.com", "ED25519-CERT", NULL,
 	    KEY_ED25519_CERT, 0, 1, 0 },
+#ifdef WITH_XMSS
+	{ "ssh-xmss@openssh.com", "XMSS", NULL, KEY_XMSS, 0, 0, 0 },
+	{ "ssh-xmss-cert-v01@openssh.com", "XMSS-CERT", NULL,
+	    KEY_XMSS_CERT, 0, 1, 0 },
+#endif /* WITH_XMSS */
 #ifdef WITH_OPENSSL
-# ifdef WITH_SSH1
-	{ NULL, "RSA1", KEY_RSA1, 0, 0, 0 },
-# endif
-	{ "ssh-rsa", "RSA", KEY_RSA, 0, 0, 0 },
-	{ "rsa-sha2-256", "RSA", KEY_RSA, 0, 0, 1 },
-	{ "rsa-sha2-512", "RSA", KEY_RSA, 0, 0, 1 },
-	{ "ssh-dss", "DSA", KEY_DSA, 0, 0, 0 },
+	{ "ssh-rsa", "RSA", NULL, KEY_RSA, 0, 0, 0 },
+	{ "rsa-sha2-256", "RSA", NULL, KEY_RSA, 0, 0, 1 },
+	{ "rsa-sha2-512", "RSA", NULL, KEY_RSA, 0, 0, 1 },
+	{ "ssh-dss", "DSA", NULL, KEY_DSA, 0, 0, 0 },
 # ifdef OPENSSL_HAS_ECC
-	{ "ecdsa-sha2-nistp256", "ECDSA", KEY_ECDSA, NID_X9_62_prime256v1, 0, 0 },
-	{ "ecdsa-sha2-nistp384", "ECDSA", KEY_ECDSA, NID_secp384r1, 0, 0 },
+	{ "ecdsa-sha2-nistp256", "ECDSA", NULL,
+	    KEY_ECDSA, NID_X9_62_prime256v1, 0, 0 },
+	{ "ecdsa-sha2-nistp384", "ECDSA", NULL,
+	    KEY_ECDSA, NID_secp384r1, 0, 0 },
 #  ifdef OPENSSL_HAS_NISTP521
-	{ "ecdsa-sha2-nistp521", "ECDSA", KEY_ECDSA, NID_secp521r1, 0, 0 },
+	{ "ecdsa-sha2-nistp521", "ECDSA", NULL,
+	    KEY_ECDSA, NID_secp521r1, 0, 0 },
 #  endif /* OPENSSL_HAS_NISTP521 */
 # endif /* OPENSSL_HAS_ECC */
-	{ "ssh-rsa-cert-v01@openssh.com", "RSA-CERT", KEY_RSA_CERT, 0, 1, 0 },
-	{ "ssh-dss-cert-v01@openssh.com", "DSA-CERT", KEY_DSA_CERT, 0, 1, 0 },
+	{ "ssh-rsa-cert-v01@openssh.com", "RSA-CERT", NULL,
+	    KEY_RSA_CERT, 0, 1, 0 },
+	{ "rsa-sha2-256-cert-v01@openssh.com", "RSA-CERT",
+	    "ssh-rsa-sha2-256", KEY_RSA_CERT, 0, 1, 1 },
+	{ "rsa-sha2-512-cert-v01@openssh.com", "RSA-CERT",
+	    "ssh-rsa-sha2-512", KEY_RSA_CERT, 0, 1, 1 },
+	{ "ssh-dss-cert-v01@openssh.com", "DSA-CERT", NULL,
+	    KEY_DSA_CERT, 0, 1, 0 },
+	{ "ssh-rsa-cert-v01@openssh.com", "RSA-CERT", NULL,
+	    KEY_RSA_CERT, 0, 1, 0 },
+	{ "rsa-sha2-256-cert-v01@openssh.com", "RSA-CERT",
+	    "ssh-rsa-sha2-256", KEY_RSA_CERT, 0, 1, 1 },
+	{ "rsa-sha2-512-cert-v01@openssh.com", "RSA-CERT",
+	    "ssh-rsa-sha2-512", KEY_RSA_CERT, 0, 1, 1 },
+	{ "ssh-dss-cert-v01@openssh.com", "DSA-CERT", NULL,
+	    KEY_DSA_CERT, 0, 1, 0 },
 # ifdef OPENSSL_HAS_ECC
-	{ "ecdsa-sha2-nistp256-cert-v01@openssh.com", "ECDSA-CERT",
+	{ "ecdsa-sha2-nistp256-cert-v01@openssh.com", "ECDSA-CERT", NULL,
 	    KEY_ECDSA_CERT, NID_X9_62_prime256v1, 1, 0 },
-	{ "ecdsa-sha2-nistp384-cert-v01@openssh.com", "ECDSA-CERT",
+	{ "ecdsa-sha2-nistp384-cert-v01@openssh.com", "ECDSA-CERT", NULL,
 	    KEY_ECDSA_CERT, NID_secp384r1, 1, 0 },
 #  ifdef OPENSSL_HAS_NISTP521
-	{ "ecdsa-sha2-nistp521-cert-v01@openssh.com", "ECDSA-CERT",
-	    KEY_ECDSA_CERT, NID_secp521r1, 1, 0 },
+	{ "ecdsa-sha2-nistp521-cert-v01@openssh.com", "ECDSA-CERT", NULL,
+	   KEY_ECDSA_CERT, NID_secp521r1, 1, 0 },
 #  endif /* OPENSSL_HAS_NISTP521 */
 # endif /* OPENSSL_HAS_ECC */
 #endif /* WITH_OPENSSL */
-	{ NULL, NULL, -1, -1, 0, 0 }
+	{ NULL, NULL, NULL, -1, -1, 0, 0 }
 };
 
 const char *
@@ -197,14 +221,16 @@
 }
 
 char *
-sshkey_alg_list(int certs_only, int plain_only, char sep)
+sshkey_alg_list(int certs_only, int plain_only, int include_sigonly, char sep)
 {
 	char *tmp, *ret = NULL;
 	size_t nlen, rlen = 0;
 	const struct keytype *kt;
 
 	for (kt = keytypes; kt->type != -1; kt++) {
-		if (kt->name == NULL || kt->sigonly)
+		if (kt->name == NULL)
+			continue;
+		if (!include_sigonly && kt->sigonly)
 			continue;
 		if ((certs_only && !kt->cert) || (plain_only && kt->cert))
 			continue;
@@ -236,10 +262,6 @@
 	for ((p = strsep(&cp, ",")); p && *p != '\0';
 	    (p = strsep(&cp, ","))) {
 		type = sshkey_type_from_name(p);
-		if (type == KEY_RSA1) {
-			free(s);
-			return 0;
-		}
 		if (type == KEY_UNSPEC) {
 			if (allow_wildcard) {
 				/*
@@ -248,8 +270,6 @@
 				 * the component is accepted.
 				 */
 				for (kt = keytypes; kt->type != -1; kt++) {
-					if (kt->type == KEY_RSA1)
-						continue;
 					if (match_pattern_list(kt->name,
 					    p, 0) != 0)
 						break;
@@ -270,7 +290,6 @@
 {
 	switch (k->type) {
 #ifdef WITH_OPENSSL
-	case KEY_RSA1:
 	case KEY_RSA:
 	case KEY_RSA_CERT:
 		return BN_num_bits(k->rsa->n);
@@ -283,6 +302,8 @@
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
 	case KEY_ED25519_CERT:
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
 		return 256;	/* XXX */
 	}
 	return 0;
@@ -296,6 +317,7 @@
 	case KEY_DSA:
 	case KEY_ECDSA:
 	case KEY_ED25519:
+	case KEY_XMSS:
 		return 1;
 	default:
 		return 0;
@@ -323,6 +345,8 @@
 		return KEY_ECDSA;
 	case KEY_ED25519_CERT:
 		return KEY_ED25519;
+	case KEY_XMSS_CERT:
+		return KEY_XMSS;
 	default:
 		return type;
 	}
@@ -429,8 +453,7 @@
 		free(cert->principals[i]);
 	free(cert->principals);
 	sshkey_free(cert->signature_key);
-	explicit_bzero(cert, sizeof(*cert));
-	free(cert);
+	freezero(cert, sizeof(*cert));
 }
 
 static struct sshkey_cert *
@@ -471,16 +494,16 @@
 	k->cert = NULL;
 	k->ed25519_sk = NULL;
 	k->ed25519_pk = NULL;
+	k->xmss_sk = NULL;
+	k->xmss_pk = NULL;
 	switch (k->type) {
 #ifdef WITH_OPENSSL
-	case KEY_RSA1:
 	case KEY_RSA:
 	case KEY_RSA_CERT:
 		if ((rsa = RSA_new()) == NULL ||
 		    (rsa->n = BN_new()) == NULL ||
 		    (rsa->e = BN_new()) == NULL) {
-			if (rsa != NULL)
-				RSA_free(rsa);
+			RSA_free(rsa);
 			free(k);
 			return NULL;
 		}
@@ -493,8 +516,7 @@
 		    (dsa->q = BN_new()) == NULL ||
 		    (dsa->g = BN_new()) == NULL ||
 		    (dsa->pub_key = BN_new()) == NULL) {
-			if (dsa != NULL)
-				DSA_free(dsa);
+			DSA_free(dsa);
 			free(k);
 			return NULL;
 		}
@@ -507,6 +529,8 @@
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
 	case KEY_ED25519_CERT:
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
 		/* no need to prealloc */
 		break;
 	case KEY_UNSPEC:
@@ -531,7 +555,6 @@
 {
 	switch (k->type) {
 #ifdef WITH_OPENSSL
-	case KEY_RSA1:
 	case KEY_RSA:
 	case KEY_RSA_CERT:
 #define bn_maybe_alloc_failed(p) (p == NULL && (p = BN_new()) == NULL)
@@ -556,6 +579,8 @@
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
 	case KEY_ED25519_CERT:
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
 		/* no need to prealloc */
 		break;
 	case KEY_UNSPEC:
@@ -587,41 +612,45 @@
 		return;
 	switch (k->type) {
 #ifdef WITH_OPENSSL
-	case KEY_RSA1:
 	case KEY_RSA:
 	case KEY_RSA_CERT:
-		if (k->rsa != NULL)
-			RSA_free(k->rsa);
+		RSA_free(k->rsa);
 		k->rsa = NULL;
 		break;
 	case KEY_DSA:
 	case KEY_DSA_CERT:
-		if (k->dsa != NULL)
-			DSA_free(k->dsa);
+		DSA_free(k->dsa);
 		k->dsa = NULL;
 		break;
 # ifdef OPENSSL_HAS_ECC
 	case KEY_ECDSA:
 	case KEY_ECDSA_CERT:
-		if (k->ecdsa != NULL)
-			EC_KEY_free(k->ecdsa);
+		EC_KEY_free(k->ecdsa);
 		k->ecdsa = NULL;
 		break;
 # endif /* OPENSSL_HAS_ECC */
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
 	case KEY_ED25519_CERT:
-		if (k->ed25519_pk) {
-			explicit_bzero(k->ed25519_pk, ED25519_PK_SZ);
-			free(k->ed25519_pk);
-			k->ed25519_pk = NULL;
-		}
-		if (k->ed25519_sk) {
-			explicit_bzero(k->ed25519_sk, ED25519_SK_SZ);
-			free(k->ed25519_sk);
-			k->ed25519_sk = NULL;
-		}
+		freezero(k->ed25519_pk, ED25519_PK_SZ);
+		k->ed25519_pk = NULL;
+		freezero(k->ed25519_sk, ED25519_SK_SZ);
+		k->ed25519_sk = NULL;
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
+		freezero(k->xmss_pk, sshkey_xmss_pklen(k));
+		k->xmss_pk = NULL;
+		freezero(k->xmss_sk, sshkey_xmss_sklen(k));
+		k->xmss_sk = NULL;
+		sshkey_xmss_free_state(k);
+		free(k->xmss_name);
+		k->xmss_name = NULL;
+		free(k->xmss_filename);
+		k->xmss_filename = NULL;
+		break;
+#endif /* WITH_XMSS */
 	case KEY_UNSPEC:
 		break;
 	default:
@@ -629,8 +658,7 @@
 	}
 	if (sshkey_is_cert(k))
 		cert_free(k->cert);
-	explicit_bzero(k, sizeof(*k));
-	free(k);
+	freezero(k, sizeof(*k));
 }
 
 static int
@@ -665,7 +693,6 @@
 
 	switch (a->type) {
 #ifdef WITH_OPENSSL
-	case KEY_RSA1:
 	case KEY_RSA_CERT:
 	case KEY_RSA:
 		return a->rsa != NULL && b->rsa != NULL &&
@@ -703,6 +730,13 @@
 	case KEY_ED25519_CERT:
 		return a->ed25519_pk != NULL && b->ed25519_pk != NULL &&
 		    memcmp(a->ed25519_pk, b->ed25519_pk, ED25519_PK_SZ) == 0;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
+		return a->xmss_pk != NULL && b->xmss_pk != NULL &&
+		    sshkey_xmss_pklen(a) == sshkey_xmss_pklen(b) &&
+		    memcmp(a->xmss_pk, b->xmss_pk, sshkey_xmss_pklen(a)) == 0;
+#endif /* WITH_XMSS */
 	default:
 		return 0;
 	}
@@ -722,7 +756,8 @@
 }
 
 static int
-to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain)
+to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain,
+  enum sshkey_serialize_rep opts)
 {
 	int type, ret = SSH_ERR_INTERNAL_ERROR;
 	const char *typename;
@@ -746,6 +781,9 @@
 	case KEY_RSA_CERT:
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519_CERT:
+#ifdef WITH_XMSS
+	case KEY_XMSS_CERT:
+#endif /* WITH_XMSS */
 		/* Use the existing blob */
 		/* XXX modified flag? */
 		if ((ret = sshbuf_putb(b, key->cert->certblob)) != 0)
@@ -790,6 +828,19 @@
 		    key->ed25519_pk, ED25519_PK_SZ)) != 0)
 			return ret;
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+		if (key->xmss_name == NULL || key->xmss_pk == NULL ||
+		    sshkey_xmss_pklen(key) == 0)
+			return SSH_ERR_INVALID_ARGUMENT;
+		if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
+		    (ret = sshbuf_put_cstring(b, key->xmss_name)) != 0 ||
+		    (ret = sshbuf_put_string(b,
+		    key->xmss_pk, sshkey_xmss_pklen(key))) != 0 ||
+		    (ret = sshkey_xmss_serialize_pk_info(key, b, opts)) != 0)
+			return ret;
+		break;
+#endif /* WITH_XMSS */
 	default:
 		return SSH_ERR_KEY_TYPE_UNKNOWN;
 	}
@@ -799,18 +850,19 @@
 int
 sshkey_putb(const struct sshkey *key, struct sshbuf *b)
 {
-	return to_blob_buf(key, b, 0);
+	return to_blob_buf(key, b, 0, SSHKEY_SERIALIZE_DEFAULT);
 }
 
 int
-sshkey_puts(const struct sshkey *key, struct sshbuf *b)
+sshkey_puts_opts(const struct sshkey *key, struct sshbuf *b,
+    enum sshkey_serialize_rep opts)
 {
 	struct sshbuf *tmp;
 	int r;
 
 	if ((tmp = sshbuf_new()) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
-	r = to_blob_buf(key, tmp, 0);
+	r = to_blob_buf(key, tmp, 0, opts);
 	if (r == 0)
 		r = sshbuf_put_stringb(b, tmp);
 	sshbuf_free(tmp);
@@ -818,13 +870,20 @@
 }
 
 int
+sshkey_puts(const struct sshkey *key, struct sshbuf *b)
+{
+	return sshkey_puts_opts(key, b, SSHKEY_SERIALIZE_DEFAULT);
+}
+
+int
 sshkey_putb_plain(const struct sshkey *key, struct sshbuf *b)
 {
-	return to_blob_buf(key, b, 1);
+	return to_blob_buf(key, b, 1, SSHKEY_SERIALIZE_DEFAULT);
 }
 
 static int
-to_blob(const struct sshkey *key, u_char **blobp, size_t *lenp, int force_plain)
+to_blob(const struct sshkey *key, u_char **blobp, size_t *lenp, int force_plain,
+    enum sshkey_serialize_rep opts)
 {
 	int ret = SSH_ERR_INTERNAL_ERROR;
 	size_t len;
@@ -836,7 +895,7 @@
 		*blobp = NULL;
 	if ((b = sshbuf_new()) == NULL)
 		return SSH_ERR_ALLOC_FAIL;
-	if ((ret = to_blob_buf(key, b, force_plain)) != 0)
+	if ((ret = to_blob_buf(key, b, force_plain, opts)) != 0)
 		goto out;
 	len = sshbuf_len(b);
 	if (lenp != NULL)
@@ -857,13 +916,13 @@
 int
 sshkey_to_blob(const struct sshkey *key, u_char **blobp, size_t *lenp)
 {
-	return to_blob(key, blobp, lenp, 0);
+	return to_blob(key, blobp, lenp, 0, SSHKEY_SERIALIZE_DEFAULT);
 }
 
 int
 sshkey_plain_to_blob(const struct sshkey *key, u_char **blobp, size_t *lenp)
 {
-	return to_blob(key, blobp, lenp, 1);
+	return to_blob(key, blobp, lenp, 1, SSHKEY_SERIALIZE_DEFAULT);
 }
 
 int
@@ -882,25 +941,8 @@
 		r = SSH_ERR_INVALID_ARGUMENT;
 		goto out;
 	}
-
-	if (k->type == KEY_RSA1) {
-#ifdef WITH_OPENSSL
-		int nlen = BN_num_bytes(k->rsa->n);
-		int elen = BN_num_bytes(k->rsa->e);
-
-		if (nlen < 0 || elen < 0 || nlen >= INT_MAX - elen) {
-			r = SSH_ERR_INVALID_FORMAT;
-			goto out;
-		}
-		blob_len = nlen + elen;
-		if ((blob = malloc(blob_len)) == NULL) {
-			r = SSH_ERR_ALLOC_FAIL;
-			goto out;
-		}
-		BN_bn2bin(k->rsa->n, blob);
-		BN_bn2bin(k->rsa->e, blob + nlen);
-#endif /* WITH_OPENSSL */
-	} else if ((r = to_blob(k, &blob, &blob_len, 1)) != 0)
+	if ((r = to_blob(k, &blob, &blob_len, 1, SSHKEY_SERIALIZE_DEFAULT))
+	    != 0)
 		goto out;
 	if ((ret = calloc(1, SSH_DIGEST_MAX_LENGTH)) == NULL) {
 		r = SSH_ERR_ALLOC_FAIL;
@@ -942,8 +984,7 @@
 		return ret;
 	if ((r = b64_ntop(dgst_raw, dgst_raw_len,
 	    ret + plen, rlen - plen)) == -1) {
-		explicit_bzero(ret, rlen);
-		free(ret);
+		freezero(ret, rlen);
 		return NULL;
 	}
 	/* Trim padding characters from end */
@@ -1192,75 +1233,38 @@
 	return retval;
 }
 
-#ifdef WITH_SSH1
-/*
- * Reads a multiple-precision integer in decimal from the buffer, and advances
- * the pointer.  The integer must already be initialized.  This function is
- * permitted to modify the buffer.  This leaves *cpp to point just beyond the
- * last processed character.
- */
 static int
-read_decimal_bignum(char **cpp, BIGNUM *v)
+peek_type_nid(const char *s, size_t l, int *nid)
 {
-	char *cp;
-	size_t e;
-	int skip = 1;	/* skip white space */
+	const struct keytype *kt;
 
-	cp = *cpp;
-	while (*cp == ' ' || *cp == '\t')
-		cp++;
-	e = strspn(cp, "0123456789");
-	if (e == 0)
-		return SSH_ERR_INVALID_FORMAT;
-	if (e > SSHBUF_MAX_BIGNUM * 3)
-		return SSH_ERR_BIGNUM_TOO_LARGE;
-	if (cp[e] == '\0')
-		skip = 0;
-	else if (strchr(" \t\r\n", cp[e]) == NULL)
-		return SSH_ERR_INVALID_FORMAT;
-	cp[e] = '\0';
-	if (BN_dec2bn(&v, cp) <= 0)
-		return SSH_ERR_INVALID_FORMAT;
-	*cpp = cp + e + skip;
-	return 0;
+	for (kt = keytypes; kt->type != -1; kt++) {
+		if (kt->name == NULL || strlen(kt->name) != l)
+			continue;
+		if (memcmp(s, kt->name, l) == 0) {
+			*nid = -1;
+			if (kt->type == KEY_ECDSA || kt->type == KEY_ECDSA_CERT)
+				*nid = kt->nid;
+			return kt->type;
+		}
+	}
+	return KEY_UNSPEC;
 }
-#endif /* WITH_SSH1 */
 
-/* returns 0 ok, and < 0 error */
+/* XXX this can now be made const char * */
 int
 sshkey_read(struct sshkey *ret, char **cpp)
 {
 	struct sshkey *k;
-	int retval = SSH_ERR_INVALID_FORMAT;
-	char *ep, *cp, *space;
+	char *cp, *blobcopy;
+	size_t space;
 	int r, type, curve_nid = -1;
 	struct sshbuf *blob;
-#ifdef WITH_SSH1
-	u_long bits;
-#endif /* WITH_SSH1 */
 
-	cp = *cpp;
+	if (ret == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
 
 	switch (ret->type) {
-	case KEY_RSA1:
-#ifdef WITH_SSH1
-		/* Get number of bits. */
-		bits = strtoul(cp, &ep, 10);
-		if (*cp == '\0' || strchr(" \t\r\n", *ep) == NULL ||
-		    bits == 0 || bits > SSHBUF_MAX_BIGNUM * 8)
-			return SSH_ERR_INVALID_FORMAT;	/* Bad bit count... */
-		/* Get public exponent, public modulus. */
-		if ((r = read_decimal_bignum(&ep, ret->rsa->e)) < 0)
-			return r;
-		if ((r = read_decimal_bignum(&ep, ret->rsa->n)) < 0)
-			return r;
-		/* validate the claimed number of bits */
-		if (BN_num_bits(ret->rsa->n) != (int)bits)
-			return SSH_ERR_KEY_BITS_MISMATCH;
-		*cpp = ep;
-		retval = 0;
-#endif /* WITH_SSH1 */
-		break;
 	case KEY_UNSPEC:
 	case KEY_RSA:
 	case KEY_DSA:
@@ -1270,120 +1274,147 @@
 	case KEY_ECDSA_CERT:
 	case KEY_RSA_CERT:
 	case KEY_ED25519_CERT:
-		space = strchr(cp, ' ');
-		if (space == NULL)
-			return SSH_ERR_INVALID_FORMAT;
-		*space = '\0';
-		type = sshkey_type_from_name(cp);
-		if (sshkey_type_plain(type) == KEY_ECDSA &&
-		    (curve_nid = sshkey_ecdsa_nid_from_name(cp)) == -1)
-			return SSH_ERR_EC_CURVE_INVALID;
-		*space = ' ';
-		if (type == KEY_UNSPEC)
-			return SSH_ERR_INVALID_FORMAT;
-		cp = space+1;
-		if (*cp == '\0')
-			return SSH_ERR_INVALID_FORMAT;
-		if (ret->type != KEY_UNSPEC && ret->type != type)
-			return SSH_ERR_KEY_TYPE_MISMATCH;
-		if ((blob = sshbuf_new()) == NULL)
-			return SSH_ERR_ALLOC_FAIL;
-		/* trim comment */
-		space = strchr(cp, ' ');
-		if (space) {
-			/* advance 'space': skip whitespace */
-			*space++ = '\0';
-			while (*space == ' ' || *space == '\t')
-				space++;
-			ep = space;
-		} else
-			ep = cp + strlen(cp);
-		if ((r = sshbuf_b64tod(blob, cp)) != 0) {
-			sshbuf_free(blob);
-			return r;
-		}
-		if ((r = sshkey_from_blob(sshbuf_ptr(blob),
-		    sshbuf_len(blob), &k)) != 0) {
-			sshbuf_free(blob);
-			return r;
-		}
-		sshbuf_free(blob);
-		if (k->type != type) {
-			sshkey_free(k);
-			return SSH_ERR_KEY_TYPE_MISMATCH;
-		}
-		if (sshkey_type_plain(type) == KEY_ECDSA &&
-		    curve_nid != k->ecdsa_nid) {
-			sshkey_free(k);
-			return SSH_ERR_EC_CURVE_MISMATCH;
-		}
-		ret->type = type;
-		if (sshkey_is_cert(ret)) {
-			if (!sshkey_is_cert(k)) {
-				sshkey_free(k);
-				return SSH_ERR_EXPECTED_CERT;
-			}
-			if (ret->cert != NULL)
-				cert_free(ret->cert);
-			ret->cert = k->cert;
-			k->cert = NULL;
-		}
-		switch (sshkey_type_plain(ret->type)) {
-#ifdef WITH_OPENSSL
-		case KEY_RSA:
-			if (ret->rsa != NULL)
-				RSA_free(ret->rsa);
-			ret->rsa = k->rsa;
-			k->rsa = NULL;
-#ifdef DEBUG_PK
-			RSA_print_fp(stderr, ret->rsa, 8);
-#endif
-			break;
-		case KEY_DSA:
-			if (ret->dsa != NULL)
-				DSA_free(ret->dsa);
-			ret->dsa = k->dsa;
-			k->dsa = NULL;
-#ifdef DEBUG_PK
-			DSA_print_fp(stderr, ret->dsa, 8);
-#endif
-			break;
-# ifdef OPENSSL_HAS_ECC
-		case KEY_ECDSA:
-			if (ret->ecdsa != NULL)
-				EC_KEY_free(ret->ecdsa);
-			ret->ecdsa = k->ecdsa;
-			ret->ecdsa_nid = k->ecdsa_nid;
-			k->ecdsa = NULL;
-			k->ecdsa_nid = -1;
-#ifdef DEBUG_PK
-			sshkey_dump_ec_key(ret->ecdsa);
-#endif
-			break;
-# endif /* OPENSSL_HAS_ECC */
-#endif /* WITH_OPENSSL */
-		case KEY_ED25519:
-			free(ret->ed25519_pk);
-			ret->ed25519_pk = k->ed25519_pk;
-			k->ed25519_pk = NULL;
-#ifdef DEBUG_PK
-			/* XXX */
-#endif
-			break;
-		}
-		*cpp = ep;
-		retval = 0;
-/*XXXX*/
-		sshkey_free(k);
-		if (retval != 0)
-			break;
-		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
+#endif /* WITH_XMSS */
+		break; /* ok */
 	default:
 		return SSH_ERR_INVALID_ARGUMENT;
 	}
-	return retval;
+
+	/* Decode type */
+	cp = *cpp;
+	space = strcspn(cp, " \t");
+	if (space == strlen(cp))
+		return SSH_ERR_INVALID_FORMAT;
+	if ((type = peek_type_nid(cp, space, &curve_nid)) == KEY_UNSPEC)
+		return SSH_ERR_INVALID_FORMAT;
+
+	/* skip whitespace */
+	for (cp += space; *cp == ' ' || *cp == '\t'; cp++)
+		;
+	if (*cp == '\0')
+		return SSH_ERR_INVALID_FORMAT;
+	if (ret->type != KEY_UNSPEC && ret->type != type)
+		return SSH_ERR_KEY_TYPE_MISMATCH;
+	if ((blob = sshbuf_new()) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+
+	/* find end of keyblob and decode */
+	space = strcspn(cp, " \t");
+	if ((blobcopy = strndup(cp, space)) == NULL) {
+		sshbuf_free(blob);
+		return SSH_ERR_ALLOC_FAIL;
+	}
+	if ((r = sshbuf_b64tod(blob, blobcopy)) != 0) {
+		free(blobcopy);
+		sshbuf_free(blob);
+		return r;
+	}
+	free(blobcopy);
+	if ((r = sshkey_fromb(blob, &k)) != 0) {
+		sshbuf_free(blob);
+		return r;
+	}
+	sshbuf_free(blob);
+
+	/* skip whitespace and leave cp at start of comment */
+	for (cp += space; *cp == ' ' || *cp == '\t'; cp++)
+		;
+
+	/* ensure type of blob matches type at start of line */
+	if (k->type != type) {
+		sshkey_free(k);
+		return SSH_ERR_KEY_TYPE_MISMATCH;
+	}
+	if (sshkey_type_plain(type) == KEY_ECDSA && curve_nid != k->ecdsa_nid) {
+		sshkey_free(k);
+		return SSH_ERR_EC_CURVE_MISMATCH;
+	}
+
+	/* Fill in ret from parsed key */
+	ret->type = type;
+	if (sshkey_is_cert(ret)) {
+		if (!sshkey_is_cert(k)) {
+			sshkey_free(k);
+			return SSH_ERR_EXPECTED_CERT;
+		}
+		if (ret->cert != NULL)
+			cert_free(ret->cert);
+		ret->cert = k->cert;
+		k->cert = NULL;
+	}
+	switch (sshkey_type_plain(ret->type)) {
+#ifdef WITH_OPENSSL
+	case KEY_RSA:
+		RSA_free(ret->rsa);
+		ret->rsa = k->rsa;
+		k->rsa = NULL;
+#ifdef DEBUG_PK
+		RSA_print_fp(stderr, ret->rsa, 8);
+#endif
+		break;
+	case KEY_DSA:
+		DSA_free(ret->dsa);
+		ret->dsa = k->dsa;
+		k->dsa = NULL;
+#ifdef DEBUG_PK
+		DSA_print_fp(stderr, ret->dsa, 8);
+#endif
+		break;
+# ifdef OPENSSL_HAS_ECC
+	case KEY_ECDSA:
+		EC_KEY_free(ret->ecdsa);
+		ret->ecdsa = k->ecdsa;
+		ret->ecdsa_nid = k->ecdsa_nid;
+		k->ecdsa = NULL;
+		k->ecdsa_nid = -1;
+#ifdef DEBUG_PK
+		sshkey_dump_ec_key(ret->ecdsa);
+#endif
+		break;
+# endif /* OPENSSL_HAS_ECC */
+#endif /* WITH_OPENSSL */
+	case KEY_ED25519:
+		freezero(ret->ed25519_pk, ED25519_PK_SZ);
+		ret->ed25519_pk = k->ed25519_pk;
+		k->ed25519_pk = NULL;
+#ifdef DEBUG_PK
+		/* XXX */
+#endif
+		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+		free(ret->xmss_pk);
+		ret->xmss_pk = k->xmss_pk;
+		k->xmss_pk = NULL;
+		free(ret->xmss_state);
+		ret->xmss_state = k->xmss_state;
+		k->xmss_state = NULL;
+		free(ret->xmss_name);
+		ret->xmss_name = k->xmss_name;
+		k->xmss_name = NULL;
+		free(ret->xmss_filename);
+		ret->xmss_filename = k->xmss_filename;
+		k->xmss_filename = NULL;
+#ifdef DEBUG_PK
+		/* XXX */
+#endif
+		break;
+#endif /* WITH_XMSS */
+	default:
+		sshkey_free(k);
+		return SSH_ERR_INTERNAL_ERROR;
+	}
+	sshkey_free(k);
+
+	/* success */
+	*cpp = cp;
+	return 0;
 }
 
+
 int
 sshkey_to_base64(const struct sshkey *key, char **b64p)
 {
@@ -1413,61 +1444,17 @@
 	return r;
 }
 
-static int
-sshkey_format_rsa1(const struct sshkey *key, struct sshbuf *b)
-{
-	int r = SSH_ERR_INTERNAL_ERROR;
-#ifdef WITH_SSH1
-	u_int bits = 0;
-	char *dec_e = NULL, *dec_n = NULL;
-
-	if (key->rsa == NULL || key->rsa->e == NULL ||
-	    key->rsa->n == NULL) {
-		r = SSH_ERR_INVALID_ARGUMENT;
-		goto out;
-	}
-	if ((dec_e = BN_bn2dec(key->rsa->e)) == NULL ||
-	    (dec_n = BN_bn2dec(key->rsa->n)) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-	/* size of modulus 'n' */
-	if ((bits = BN_num_bits(key->rsa->n)) <= 0) {
-		r = SSH_ERR_INVALID_ARGUMENT;
-		goto out;
-	}
-	if ((r = sshbuf_putf(b, "%u %s %s", bits, dec_e, dec_n)) != 0)
-		goto out;
-
-	/* Success */
-	r = 0;
- out:
-	if (dec_e != NULL)
-		OPENSSL_free(dec_e);
-	if (dec_n != NULL)
-		OPENSSL_free(dec_n);
-#endif /* WITH_SSH1 */
-
-	return r;
-}
-
-static int
+int
 sshkey_format_text(const struct sshkey *key, struct sshbuf *b)
 {
 	int r = SSH_ERR_INTERNAL_ERROR;
 	char *uu = NULL;
 
-	if (key->type == KEY_RSA1) {
-		if ((r = sshkey_format_rsa1(key, b)) != 0)
-			goto out;
-	} else {
-		/* Unsupported key types handled in sshkey_to_base64() */
-		if ((r = sshkey_to_base64(key, &uu)) != 0)
-			goto out;
-		if ((r = sshbuf_putf(b, "%s %s",
-		    sshkey_ssh_name(key), uu)) != 0)
-			goto out;
-	}
+	if ((r = sshkey_to_base64(key, &uu)) != 0)
+		goto out;
+	if ((r = sshbuf_putf(b, "%s %s",
+	    sshkey_ssh_name(key), uu)) != 0)
+		goto out;
 	r = 0;
  out:
 	free(uu);
@@ -1518,10 +1505,11 @@
 	BIGNUM *f4 = NULL;
 	int ret = SSH_ERR_INTERNAL_ERROR;
 
-	if (rsap == NULL ||
-	    bits < SSH_RSA_MINIMUM_MODULUS_SIZE ||
-	    bits > SSHBUF_MAX_BIGNUM * 8)
+	if (rsap == NULL)
 		return SSH_ERR_INVALID_ARGUMENT;
+	if (bits < SSH_RSA_MINIMUM_MODULUS_SIZE ||
+	    bits > SSHBUF_MAX_BIGNUM * 8)
+		return SSH_ERR_KEY_LENGTH;
 	*rsap = NULL;
 	if ((private = RSA_new()) == NULL || (f4 = BN_new()) == NULL) {
 		ret = SSH_ERR_ALLOC_FAIL;
@@ -1536,10 +1524,8 @@
 	private = NULL;
 	ret = 0;
  out:
-	if (private != NULL)
-		RSA_free(private);
-	if (f4 != NULL)
-		BN_free(f4);
+	RSA_free(private);
+	BN_free(f4);
 	return ret;
 }
 
@@ -1549,8 +1535,10 @@
 	DSA *private;
 	int ret = SSH_ERR_INTERNAL_ERROR;
 
-	if (dsap == NULL || bits != 1024)
+	if (dsap == NULL)
 		return SSH_ERR_INVALID_ARGUMENT;
+	if (bits != 1024)
+		return SSH_ERR_KEY_LENGTH;
 	if ((private = DSA_new()) == NULL) {
 		ret = SSH_ERR_ALLOC_FAIL;
 		goto out;
@@ -1565,8 +1553,7 @@
 	private = NULL;
 	ret = 0;
  out:
-	if (private != NULL)
-		DSA_free(private);
+	DSA_free(private);
 	return ret;
 }
 
@@ -1627,9 +1614,10 @@
 	EC_KEY *private;
 	int ret = SSH_ERR_INTERNAL_ERROR;
 
-	if (nid == NULL || ecdsap == NULL ||
-	    (*nid = sshkey_ecdsa_bits_to_nid(bits)) == -1)
+	if (nid == NULL || ecdsap == NULL)
 		return SSH_ERR_INVALID_ARGUMENT;
+	if ((*nid = sshkey_ecdsa_bits_to_nid(bits)) == -1)
+		return SSH_ERR_KEY_LENGTH;
 	*ecdsap = NULL;
 	if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL) {
 		ret = SSH_ERR_ALLOC_FAIL;
@@ -1644,8 +1632,7 @@
 	private = NULL;
 	ret = 0;
  out:
-	if (private != NULL)
-		EC_KEY_free(private);
+	EC_KEY_free(private);
 	return ret;
 }
 # endif /* OPENSSL_HAS_ECC */
@@ -1672,6 +1659,11 @@
 		crypto_sign_ed25519_keypair(k->ed25519_pk, k->ed25519_sk);
 		ret = 0;
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+		ret = sshkey_xmss_generate_private_key(k, bits);
+		break;
+#endif /* WITH_XMSS */
 #ifdef WITH_OPENSSL
 	case KEY_DSA:
 		ret = dsa_generate_private_key(bits, &k->dsa);
@@ -1683,7 +1675,6 @@
 		break;
 # endif /* OPENSSL_HAS_ECC */
 	case KEY_RSA:
-	case KEY_RSA1:
 		ret = rsa_generate_private_key(bits, &k->rsa);
 		break;
 #endif /* WITH_OPENSSL */
@@ -1794,7 +1785,6 @@
 		break;
 # endif /* OPENSSL_HAS_ECC */
 	case KEY_RSA:
-	case KEY_RSA1:
 	case KEY_RSA_CERT:
 		if ((n = sshkey_new(k->type)) == NULL)
 			return SSH_ERR_ALLOC_FAIL;
@@ -1817,6 +1807,29 @@
 			memcpy(n->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
 		}
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
+		if ((n = sshkey_new(k->type)) == NULL)
+			return SSH_ERR_ALLOC_FAIL;
+		if ((ret = sshkey_xmss_init(n, k->xmss_name)) != 0) {
+			sshkey_free(n);
+			return ret;
+		}
+		if (k->xmss_pk != NULL) {
+			size_t pklen = sshkey_xmss_pklen(k);
+			if (pklen == 0 || sshkey_xmss_pklen(n) != pklen) {
+				sshkey_free(n);
+				return SSH_ERR_INTERNAL_ERROR;
+			}
+			if ((n->xmss_pk = malloc(pklen)) == NULL) {
+				sshkey_free(n);
+				return SSH_ERR_ALLOC_FAIL;
+			}
+			memcpy(n->xmss_pk, k->xmss_pk, pklen);
+		}
+		break;
+#endif /* WITH_XMSS */
 	default:
 		return SSH_ERR_KEY_TYPE_UNKNOWN;
 	}
@@ -1888,8 +1901,9 @@
 			goto out;
 		}
 		oprincipals = key->cert->principals;
-		key->cert->principals = reallocarray(key->cert->principals,
-		    key->cert->nprincipals + 1, sizeof(*key->cert->principals));
+		key->cert->principals = recallocarray(key->cert->principals,
+		    key->cert->nprincipals, key->cert->nprincipals + 1,
+		    sizeof(*key->cert->principals));
 		if (key->cert->principals == NULL) {
 			free(principal);
 			key->cert->principals = oprincipals;
@@ -1938,7 +1952,7 @@
 		goto out;
 	}
 	if ((ret = sshkey_verify(key->cert->signature_key, sig, slen,
-	    sshbuf_ptr(key->cert->certblob), signed_len, 0)) != 0)
+	    sshbuf_ptr(key->cert->certblob), signed_len, NULL, 0)) != 0)
 		goto out;
 
 	/* Success */
@@ -1957,7 +1971,7 @@
     int allow_cert)
 {
 	int type, ret = SSH_ERR_INTERNAL_ERROR;
-	char *ktype = NULL, *curve = NULL;
+	char *ktype = NULL, *curve = NULL, *xmss_name = NULL;
 	struct sshkey *key = NULL;
 	size_t len;
 	u_char *pk = NULL;
@@ -2004,6 +2018,10 @@
 			ret = SSH_ERR_INVALID_FORMAT;
 			goto out;
 		}
+		if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
+			ret = SSH_ERR_KEY_LENGTH;
+			goto out;
+		}
 #ifdef DEBUG_PK
 		RSA_print_fp(stderr, key->rsa, 8);
 #endif
@@ -2053,8 +2071,7 @@
 			ret = SSH_ERR_EC_CURVE_MISMATCH;
 			goto out;
 		}
-		if (key->ecdsa != NULL)
-			EC_KEY_free(key->ecdsa);
+		EC_KEY_free(key->ecdsa);
 		if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid))
 		    == NULL) {
 			ret = SSH_ERR_EC_CURVE_INVALID;
@@ -2105,12 +2122,37 @@
 		key->ed25519_pk = pk;
 		pk = NULL;
 		break;
-	case KEY_UNSPEC:
+#ifdef WITH_XMSS
+	case KEY_XMSS_CERT:
+		/* Skip nonce */
+		if (sshbuf_get_string_direct(b, NULL, NULL) != 0) {
+			ret = SSH_ERR_INVALID_FORMAT;
+			goto out;
+		}
+		/* FALLTHROUGH */
+	case KEY_XMSS:
+		if ((ret = sshbuf_get_cstring(b, &xmss_name, NULL)) != 0)
+			goto out;
 		if ((key = sshkey_new(type)) == NULL) {
 			ret = SSH_ERR_ALLOC_FAIL;
 			goto out;
 		}
+		if ((ret = sshkey_xmss_init(key, xmss_name)) != 0)
+			goto out;
+		if ((ret = sshbuf_get_string(b, &pk, &len)) != 0)
+			goto out;
+		if (len == 0 || len != sshkey_xmss_pklen(key)) {
+			ret = SSH_ERR_INVALID_FORMAT;
+			goto out;
+		}
+		key->xmss_pk = pk;
+		pk = NULL;
+		if (type != KEY_XMSS_CERT &&
+		    (ret = sshkey_xmss_deserialize_pk_info(key, b)) != 0)
+			goto out;
 		break;
+#endif /* WITH_XMSS */
+	case KEY_UNSPEC:
 	default:
 		ret = SSH_ERR_KEY_TYPE_UNKNOWN;
 		goto out;
@@ -2132,12 +2174,12 @@
  out:
 	sshbuf_free(copy);
 	sshkey_free(key);
+	free(xmss_name);
 	free(ktype);
 	free(curve);
 	free(pk);
 #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
-	if (q != NULL)
-		EC_POINT_free(q);
+	EC_POINT_free(q);
 #endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
 	return ret;
 }
@@ -2174,6 +2216,75 @@
 	return r;
 }
 
+static int
+get_sigtype(const u_char *sig, size_t siglen, char **sigtypep)
+{
+	int r;
+	struct sshbuf *b = NULL;
+	char *sigtype = NULL;
+
+	if (sigtypep != NULL)
+		*sigtypep = NULL;
+	if ((b = sshbuf_from(sig, siglen)) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	if ((r = sshbuf_get_cstring(b, &sigtype, NULL)) != 0)
+		goto out;
+	/* success */
+	if (sigtypep != NULL) {
+		*sigtypep = sigtype;
+		sigtype = NULL;
+	}
+	r = 0;
+ out:
+	free(sigtype);
+	sshbuf_free(b);
+	return r;
+}
+
+/*
+ * Returns the expected signature algorithm for a given public key algorithm.
+ */
+const char *
+sshkey_sigalg_by_name(const char *name)
+{
+	const struct keytype *kt;
+
+	for (kt = keytypes; kt->type != -1; kt++) {
+		if (strcmp(kt->name, name) != 0)
+			continue;
+		if (kt->sigalg != NULL)
+			return kt->sigalg;
+		if (!kt->cert)
+			return kt->name;
+		return sshkey_ssh_name_from_type_nid(
+		    sshkey_type_plain(kt->type), kt->nid);
+	}
+	return NULL;
+}
+
+/*
+ * Verifies that the signature algorithm appearing inside the signature blob
+ * matches that which was requested.
+ */
+int
+sshkey_check_sigtype(const u_char *sig, size_t siglen,
+    const char *requested_alg)
+{
+	const char *expected_alg;
+	char *sigtype = NULL;
+	int r;
+
+	if (requested_alg == NULL)
+		return 0;
+	if ((expected_alg = sshkey_sigalg_by_name(requested_alg)) == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((r = get_sigtype(sig, siglen, &sigtype)) != 0)
+		return r;
+	r = strcmp(expected_alg, sigtype) == 0;
+	free(sigtype);
+	return r ? 0 : SSH_ERR_SIGN_ALG_UNSUPPORTED;
+}
+
 int
 sshkey_sign(const struct sshkey *key,
     u_char **sigp, size_t *lenp,
@@ -2202,6 +2313,11 @@
 	case KEY_ED25519:
 	case KEY_ED25519_CERT:
 		return ssh_ed25519_sign(key, sigp, lenp, data, datalen, compat);
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
+		return ssh_xmss_sign(key, sigp, lenp, data, datalen, compat);
+#endif /* WITH_XMSS */
 	default:
 		return SSH_ERR_KEY_TYPE_UNKNOWN;
 	}
@@ -2209,11 +2325,12 @@
 
 /*
  * ssh_key_verify returns 0 for a correct signature  and < 0 on error.
+ * If "alg" specified, then the signature must use that algorithm.
  */
 int
 sshkey_verify(const struct sshkey *key,
     const u_char *sig, size_t siglen,
-    const u_char *data, size_t dlen, u_int compat)
+    const u_char *data, size_t dlen, const char *alg, u_int compat)
 {
 	if (siglen == 0 || dlen > SSH_KEY_MAX_SIGN_DATA_SIZE)
 		return SSH_ERR_INVALID_ARGUMENT;
@@ -2229,11 +2346,16 @@
 # endif /* OPENSSL_HAS_ECC */
 	case KEY_RSA_CERT:
 	case KEY_RSA:
-		return ssh_rsa_verify(key, sig, siglen, data, dlen);
+		return ssh_rsa_verify(key, sig, siglen, data, dlen, alg);
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
 	case KEY_ED25519_CERT:
 		return ssh_ed25519_verify(key, sig, siglen, data, dlen, compat);
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+	case KEY_XMSS_CERT:
+		return ssh_xmss_verify(key, sig, siglen, data, dlen, compat);
+#endif /* WITH_XMSS */
 	default:
 		return SSH_ERR_KEY_TYPE_UNKNOWN;
 	}
@@ -2257,6 +2379,8 @@
 	pk->rsa = NULL;
 	pk->ed25519_pk = NULL;
 	pk->ed25519_sk = NULL;
+	pk->xmss_pk = NULL;
+	pk->xmss_sk = NULL;
 
 	switch (k->type) {
 #ifdef WITH_OPENSSL
@@ -2264,7 +2388,6 @@
 		if ((ret = sshkey_cert_copy(k, pk)) != 0)
 			goto fail;
 		/* FALLTHROUGH */
-	case KEY_RSA1:
 	case KEY_RSA:
 		if ((pk->rsa = RSA_new()) == NULL ||
 		    (pk->rsa->e = BN_dup(k->rsa->e)) == NULL ||
@@ -2319,6 +2442,29 @@
 			memcpy(pk->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
 		}
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS_CERT:
+		if ((ret = sshkey_cert_copy(k, pk)) != 0)
+			goto fail;
+		/* FALLTHROUGH */
+	case KEY_XMSS:
+		if ((ret = sshkey_xmss_init(pk, k->xmss_name)) != 0)
+			goto fail;
+		if (k->xmss_pk != NULL) {
+			size_t pklen = sshkey_xmss_pklen(k);
+
+			if (pklen == 0 || sshkey_xmss_pklen(pk) != pklen) {
+				ret = SSH_ERR_INTERNAL_ERROR;
+				goto fail;
+			}
+			if ((pk->xmss_pk = malloc(pklen)) == NULL) {
+				ret = SSH_ERR_ALLOC_FAIL;
+				goto fail;
+			}
+			memcpy(pk->xmss_pk, k->xmss_pk, pklen);
+		}
+		break;
+#endif /* WITH_XMSS */
 	default:
 		ret = SSH_ERR_KEY_TYPE_UNKNOWN;
  fail:
@@ -2350,6 +2496,11 @@
 	case KEY_ED25519:
 		newtype = KEY_ED25519_CERT;
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+		newtype = KEY_XMSS_CERT;
+		break;
+#endif /* WITH_XMSS */
 	default:
 		return SSH_ERR_INVALID_ARGUMENT;
 	}
@@ -2373,7 +2524,8 @@
 
 /* Sign a certified key, (re-)generating the signed certblob. */
 int
-sshkey_certify(struct sshkey *k, struct sshkey *ca, const char *alg)
+sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg,
+    sshkey_certify_signer *signer, void *signer_ctx)
 {
 	struct sshbuf *principals = NULL;
 	u_char *ca_blob = NULL, *sig_blob = NULL, nonce[32];
@@ -2433,6 +2585,18 @@
 		    k->ed25519_pk, ED25519_PK_SZ)) != 0)
 			goto out;
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS_CERT:
+		if (k->xmss_name == NULL) {
+			ret = SSH_ERR_INVALID_ARGUMENT;
+			goto out;
+		}
+		if ((ret = sshbuf_put_cstring(cert, k->xmss_name)) ||
+		    (ret = sshbuf_put_string(cert,
+		    k->xmss_pk, sshkey_xmss_pklen(k))) != 0)
+			goto out;
+		break;
+#endif /* WITH_XMSS */
 	default:
 		ret = SSH_ERR_INVALID_ARGUMENT;
 		goto out;
@@ -2462,8 +2626,8 @@
 		goto out;
 
 	/* Sign the whole mess */
-	if ((ret = sshkey_sign(ca, &sig_blob, &sig_len, sshbuf_ptr(cert),
-	    sshbuf_len(cert), alg, 0)) != 0)
+	if ((ret = signer(ca, &sig_blob, &sig_len, sshbuf_ptr(cert),
+	    sshbuf_len(cert), alg, 0, signer_ctx)) != 0)
 		goto out;
 
 	/* Append signature and we are done */
@@ -2479,6 +2643,22 @@
 	return ret;
 }
 
+static int
+default_key_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
+    const u_char *data, size_t datalen,
+    const char *alg, u_int compat, void *ctx)
+{
+	if (ctx != NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	return sshkey_sign(key, sigp, lenp, data, datalen, alg, compat);
+}
+
+int
+sshkey_certify(struct sshkey *k, struct sshkey *ca, const char *alg)
+{
+	return sshkey_certify_custom(k, ca, alg, default_key_sign, NULL);
+}
+
 int
 sshkey_cert_check_authority(const struct sshkey *k,
     int want_host, int require_principal,
@@ -2574,7 +2754,8 @@
 }
 
 int
-sshkey_private_serialize(const struct sshkey *key, struct sshbuf *b)
+sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
+    enum sshkey_serialize_rep opts)
 {
 	int r = SSH_ERR_INTERNAL_ERROR;
 
@@ -2660,6 +2841,36 @@
 		    ED25519_SK_SZ)) != 0)
 			goto out;
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+		if (key->xmss_name == NULL) {
+			r = SSH_ERR_INVALID_ARGUMENT;
+			goto out;
+		}
+		if ((r = sshbuf_put_cstring(b, key->xmss_name)) != 0 ||
+		    (r = sshbuf_put_string(b, key->xmss_pk,
+		    sshkey_xmss_pklen(key))) != 0 ||
+		    (r = sshbuf_put_string(b, key->xmss_sk,
+		    sshkey_xmss_sklen(key))) != 0 ||
+		    (r = sshkey_xmss_serialize_state_opt(key, b, opts)) != 0)
+			goto out;
+		break;
+	case KEY_XMSS_CERT:
+		if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0 ||
+		    key->xmss_name == NULL) {
+			r = SSH_ERR_INVALID_ARGUMENT;
+			goto out;
+		}
+		if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
+		    (r = sshbuf_put_cstring(b, key->xmss_name)) != 0 ||
+		    (r = sshbuf_put_string(b, key->xmss_pk,
+		    sshkey_xmss_pklen(key))) != 0 ||
+		    (r = sshbuf_put_string(b, key->xmss_sk,
+		    sshkey_xmss_sklen(key))) != 0 ||
+		    (r = sshkey_xmss_serialize_state_opt(key, b, opts)) != 0)
+			goto out;
+		break;
+#endif /* WITH_XMSS */
 	default:
 		r = SSH_ERR_INVALID_ARGUMENT;
 		goto out;
@@ -2671,13 +2882,21 @@
 }
 
 int
+sshkey_private_serialize(const struct sshkey *key, struct sshbuf *b)
+{
+	return sshkey_private_serialize_opt(key, b,
+	    SSHKEY_SERIALIZE_DEFAULT);
+}
+
+int
 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
 {
-	char *tname = NULL, *curve = NULL;
+	char *tname = NULL, *curve = NULL, *xmss_name = NULL;
 	struct sshkey *k = NULL;
 	size_t pklen = 0, sklen = 0;
 	int type, r = SSH_ERR_INTERNAL_ERROR;
 	u_char *ed25519_pk = NULL, *ed25519_sk = NULL;
+	u_char *xmss_pk = NULL, *xmss_sk = NULL;
 #ifdef WITH_OPENSSL
 	BIGNUM *exponent = NULL;
 #endif /* WITH_OPENSSL */
@@ -2770,8 +2989,12 @@
 		    (r = sshbuf_get_bignum2(buf, k->rsa->iqmp)) != 0 ||
 		    (r = sshbuf_get_bignum2(buf, k->rsa->p)) != 0 ||
 		    (r = sshbuf_get_bignum2(buf, k->rsa->q)) != 0 ||
-		    (r = rsa_generate_additional_parameters(k->rsa)) != 0)
+		    (r = ssh_rsa_generate_additional_parameters(k)) != 0)
 			goto out;
+		if (BN_num_bits(k->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
+			r = SSH_ERR_KEY_LENGTH;
+			goto out;
+		}
 		break;
 	case KEY_RSA_CERT:
 		if ((r = sshkey_froms(buf, &k)) != 0 ||
@@ -2780,8 +3003,12 @@
 		    (r = sshbuf_get_bignum2(buf, k->rsa->iqmp)) != 0 ||
 		    (r = sshbuf_get_bignum2(buf, k->rsa->p)) != 0 ||
 		    (r = sshbuf_get_bignum2(buf, k->rsa->q)) != 0 ||
-		    (r = rsa_generate_additional_parameters(k->rsa)) != 0)
+		    (r = ssh_rsa_generate_additional_parameters(k)) != 0)
 			goto out;
+		if (BN_num_bits(k->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
+			r = SSH_ERR_KEY_LENGTH;
+			goto out;
+		}
 		break;
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
@@ -2814,6 +3041,53 @@
 		k->ed25519_sk = ed25519_sk;
 		ed25519_pk = ed25519_sk = NULL;
 		break;
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+		if ((k = sshkey_new_private(type)) == NULL) {
+			r = SSH_ERR_ALLOC_FAIL;
+			goto out;
+		}
+		if ((r = sshbuf_get_cstring(buf, &xmss_name, NULL)) != 0 ||
+		    (r = sshkey_xmss_init(k, xmss_name)) != 0 ||
+		    (r = sshbuf_get_string(buf, &xmss_pk, &pklen)) != 0 ||
+		    (r = sshbuf_get_string(buf, &xmss_sk, &sklen)) != 0)
+			goto out;
+		if (pklen != sshkey_xmss_pklen(k) ||
+		    sklen != sshkey_xmss_sklen(k)) {
+			r = SSH_ERR_INVALID_FORMAT;
+			goto out;
+		}
+		k->xmss_pk = xmss_pk;
+		k->xmss_sk = xmss_sk;
+		xmss_pk = xmss_sk = NULL;
+		/* optional internal state */
+		if ((r = sshkey_xmss_deserialize_state_opt(k, buf)) != 0)
+			goto out;
+		break;
+	case KEY_XMSS_CERT:
+		if ((r = sshkey_froms(buf, &k)) != 0 ||
+		    (r = sshkey_add_private(k)) != 0 ||
+		    (r = sshbuf_get_cstring(buf, &xmss_name, NULL)) != 0 ||
+		    (r = sshbuf_get_string(buf, &xmss_pk, &pklen)) != 0 ||
+		    (r = sshbuf_get_string(buf, &xmss_sk, &sklen)) != 0)
+			goto out;
+		if (strcmp(xmss_name, k->xmss_name)) {
+			r = SSH_ERR_INVALID_FORMAT;
+			goto out;
+		}
+		if (pklen != sshkey_xmss_pklen(k) ||
+		    sklen != sshkey_xmss_sklen(k)) {
+			r = SSH_ERR_INVALID_FORMAT;
+			goto out;
+		}
+		k->xmss_pk = xmss_pk;
+		k->xmss_sk = xmss_sk;
+		xmss_pk = xmss_sk = NULL;
+		/* optional internal state */
+		if ((r = sshkey_xmss_deserialize_state_opt(k, buf)) != 0)
+			goto out;
+		break;
+#endif /* WITH_XMSS */
 	default:
 		r = SSH_ERR_KEY_TYPE_UNKNOWN;
 		goto out;
@@ -2823,7 +3097,6 @@
 	switch (k->type) {
 	case KEY_RSA:
 	case KEY_RSA_CERT:
-	case KEY_RSA1:
 		if (RSA_blinding_on(k->rsa, NULL) != 1) {
 			r = SSH_ERR_LIBCRYPTO_ERROR;
 			goto out;
@@ -2841,18 +3114,14 @@
 	free(tname);
 	free(curve);
 #ifdef WITH_OPENSSL
-	if (exponent != NULL)
-		BN_clear_free(exponent);
+	BN_clear_free(exponent);
 #endif /* WITH_OPENSSL */
 	sshkey_free(k);
-	if (ed25519_pk != NULL) {
-		explicit_bzero(ed25519_pk, pklen);
-		free(ed25519_pk);
-	}
-	if (ed25519_sk != NULL) {
-		explicit_bzero(ed25519_sk, sklen);
-		free(ed25519_sk);
-	}
+	freezero(ed25519_pk, pklen);
+	freezero(ed25519_sk, sklen);
+	free(xmss_name);
+	freezero(xmss_pk, pklen);
+	freezero(xmss_sk, sklen);
 	return r;
 }
 
@@ -2930,8 +3199,7 @@
 	ret = 0;
  out:
 	BN_CTX_free(bnctx);
-	if (nq != NULL)
-		EC_POINT_free(nq);
+	EC_POINT_free(nq);
 	return ret;
 }
 
@@ -3052,12 +3320,8 @@
 		kdfname = "none";
 	} else if (ciphername == NULL)
 		ciphername = DEFAULT_CIPHERNAME;
-	else if (cipher_number(ciphername) != SSH_CIPHER_SSH2) {
-		r = SSH_ERR_INVALID_ARGUMENT;
-		goto out;
-	}
 	if ((cipher = cipher_by_name(ciphername)) == NULL) {
-		r = SSH_ERR_INTERNAL_ERROR;
+		r = SSH_ERR_INVALID_ARGUMENT;
 		goto out;
 	}
 
@@ -3112,7 +3376,8 @@
 		goto out;
 
 	/* append private key and comment*/
-	if ((r = sshkey_private_serialize(prv, encrypted)) != 0 ||
+	if ((r = sshkey_private_serialize_opt(prv, encrypted,
+	     SSHKEY_SERIALIZE_FULL)) != 0 ||
 	    (r = sshbuf_put_cstring(encrypted, comment)) != 0)
 		goto out;
 
@@ -3399,105 +3664,6 @@
 	return r;
 }
 
-#if WITH_SSH1
-/*
- * Serialises the authentication (private) key to a blob, encrypting it with
- * passphrase.  The identification of the blob (lowest 64 bits of n) will
- * precede the key to provide identification of the key without needing a
- * passphrase.
- */
-static int
-sshkey_private_rsa1_to_blob(struct sshkey *key, struct sshbuf *blob,
-    const char *passphrase, const char *comment)
-{
-	struct sshbuf *buffer = NULL, *encrypted = NULL;
-	u_char buf[8];
-	int r, cipher_num;
-	struct sshcipher_ctx *ciphercontext = NULL;
-	const struct sshcipher *cipher;
-	u_char *cp;
-
-	/*
-	 * If the passphrase is empty, use SSH_CIPHER_NONE to ease converting
-	 * to another cipher; otherwise use SSH_AUTHFILE_CIPHER.
-	 */
-	cipher_num = (strcmp(passphrase, "") == 0) ?
-	    SSH_CIPHER_NONE : SSH_CIPHER_3DES;
-	if ((cipher = cipher_by_number(cipher_num)) == NULL)
-		return SSH_ERR_INTERNAL_ERROR;
-
-	/* This buffer is used to build the secret part of the private key. */
-	if ((buffer = sshbuf_new()) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-
-	/* Put checkbytes for checking passphrase validity. */
-	if ((r = sshbuf_reserve(buffer, 4, &cp)) != 0)
-		goto out;
-	arc4random_buf(cp, 2);
-	memcpy(cp + 2, cp, 2);
-
-	/*
-	 * Store the private key (n and e will not be stored because they
-	 * will be stored in plain text, and storing them also in encrypted
-	 * format would just give known plaintext).
-	 * Note: q and p are stored in reverse order to SSL.
-	 */
-	if ((r = sshbuf_put_bignum1(buffer, key->rsa->d)) != 0 ||
-	    (r = sshbuf_put_bignum1(buffer, key->rsa->iqmp)) != 0 ||
-	    (r = sshbuf_put_bignum1(buffer, key->rsa->q)) != 0 ||
-	    (r = sshbuf_put_bignum1(buffer, key->rsa->p)) != 0)
-		goto out;
-
-	/* Pad the part to be encrypted to a size that is a multiple of 8. */
-	explicit_bzero(buf, 8);
-	if ((r = sshbuf_put(buffer, buf, 8 - (sshbuf_len(buffer) % 8))) != 0)
-		goto out;
-
-	/* This buffer will be used to contain the data in the file. */
-	if ((encrypted = sshbuf_new()) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-
-	/* First store keyfile id string. */
-	if ((r = sshbuf_put(encrypted, LEGACY_BEGIN,
-	    sizeof(LEGACY_BEGIN))) != 0)
-		goto out;
-
-	/* Store cipher type and "reserved" field. */
-	if ((r = sshbuf_put_u8(encrypted, cipher_num)) != 0 ||
-	    (r = sshbuf_put_u32(encrypted, 0)) != 0)
-		goto out;
-
-	/* Store public key.  This will be in plain text. */
-	if ((r = sshbuf_put_u32(encrypted, BN_num_bits(key->rsa->n))) != 0 ||
-	    (r = sshbuf_put_bignum1(encrypted, key->rsa->n)) != 0 ||
-	    (r = sshbuf_put_bignum1(encrypted, key->rsa->e)) != 0 ||
-	    (r = sshbuf_put_cstring(encrypted, comment)) != 0)
-		goto out;
-
-	/* Allocate space for the private part of the key in the buffer. */
-	if ((r = sshbuf_reserve(encrypted, sshbuf_len(buffer), &cp)) != 0)
-		goto out;
-
-	if ((r = cipher_set_key_string(&ciphercontext, cipher, passphrase,
-	    CIPHER_ENCRYPT)) != 0)
-		goto out;
-	if ((r = cipher_crypt(ciphercontext, 0, cp,
-	    sshbuf_ptr(buffer), sshbuf_len(buffer), 0, 0)) != 0)
-		goto out;
-
-	r = sshbuf_putb(blob, encrypted);
-
- out:
-	cipher_free(ciphercontext);
-	explicit_bzero(buf, sizeof(buf));
-	sshbuf_free(buffer);
-	sshbuf_free(encrypted);
-
-	return r;
-}
-#endif /* WITH_SSH1 */
 
 #ifdef WITH_OPENSSL
 /* convert SSH v2 key in OpenSSL PEM format */
@@ -3508,12 +3674,8 @@
 	int success, r;
 	int blen, len = strlen(_passphrase);
 	u_char *passphrase = (len > 0) ? (u_char *)_passphrase : NULL;
-#if (OPENSSL_VERSION_NUMBER < 0x00907000L)
-	const EVP_CIPHER *cipher = (len > 0) ? EVP_des_ede3_cbc() : NULL;
-#else
- 	const EVP_CIPHER *cipher = (len > 0) ? EVP_aes_128_cbc() : NULL;
-#endif
-	const u_char *bptr;
+	const EVP_CIPHER *cipher = (len > 0) ? EVP_aes_128_cbc() : NULL;
+	char *bptr;
 	BIO *bio = NULL;
 
 	if (len > 0 && len <= 4)
@@ -3564,11 +3726,6 @@
     int force_new_format, const char *new_format_cipher, int new_format_rounds)
 {
 	switch (key->type) {
-#ifdef WITH_SSH1
-	case KEY_RSA1:
-		return sshkey_private_rsa1_to_blob(key, blob,
-		    passphrase, comment);
-#endif /* WITH_SSH1 */
 #ifdef WITH_OPENSSL
 	case KEY_DSA:
 	case KEY_ECDSA:
@@ -3581,6 +3738,9 @@
 		    passphrase, comment);
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+#endif /* WITH_XMSS */
 		return sshkey_private_to_blob2(key, blob, passphrase,
 		    comment, new_format_cipher, new_format_rounds);
 	default:
@@ -3588,185 +3748,73 @@
 	}
 }
 
-#ifdef WITH_SSH1
-/*
- * Parse the public, unencrypted portion of a RSA1 key.
- */
-int
-sshkey_parse_public_rsa1_fileblob(struct sshbuf *blob,
-    struct sshkey **keyp, char **commentp)
-{
-	int r;
-	struct sshkey *pub = NULL;
-	struct sshbuf *copy = NULL;
-
-	if (keyp != NULL)
-		*keyp = NULL;
-	if (commentp != NULL)
-		*commentp = NULL;
-
-	/* Check that it is at least big enough to contain the ID string. */
-	if (sshbuf_len(blob) < sizeof(LEGACY_BEGIN))
-		return SSH_ERR_INVALID_FORMAT;
-
-	/*
-	 * Make sure it begins with the id string.  Consume the id string
-	 * from the buffer.
-	 */
-	if (memcmp(sshbuf_ptr(blob), LEGACY_BEGIN, sizeof(LEGACY_BEGIN)) != 0)
-		return SSH_ERR_INVALID_FORMAT;
-	/* Make a working copy of the keyblob and skip past the magic */
-	if ((copy = sshbuf_fromb(blob)) == NULL)
-		return SSH_ERR_ALLOC_FAIL;
-	if ((r = sshbuf_consume(copy, sizeof(LEGACY_BEGIN))) != 0)
-		goto out;
-
-	/* Skip cipher type, reserved data and key bits. */
-	if ((r = sshbuf_get_u8(copy, NULL)) != 0 ||	/* cipher type */
-	    (r = sshbuf_get_u32(copy, NULL)) != 0 ||	/* reserved */
-	    (r = sshbuf_get_u32(copy, NULL)) != 0)	/* key bits */
-		goto out;
-
-	/* Read the public key from the buffer. */
-	if ((pub = sshkey_new(KEY_RSA1)) == NULL ||
-	    (r = sshbuf_get_bignum1(copy, pub->rsa->n)) != 0 ||
-	    (r = sshbuf_get_bignum1(copy, pub->rsa->e)) != 0)
-		goto out;
-
-	/* Finally, the comment */
-	if ((r = sshbuf_get_string(copy, (u_char**)commentp, NULL)) != 0)
-		goto out;
-
-	/* The encrypted private part is not parsed by this function. */
-
-	r = 0;
-	if (keyp != NULL) {
-		*keyp = pub;
-		pub = NULL;
-	}
- out:
-	sshbuf_free(copy);
-	sshkey_free(pub);
-	return r;
-}
-
-static int
-sshkey_parse_private_rsa1(struct sshbuf *blob, const char *passphrase,
-    struct sshkey **keyp, char **commentp)
-{
-	int r;
-	u_int16_t check1, check2;
-	u_int8_t cipher_type;
-	struct sshbuf *decrypted = NULL, *copy = NULL;
-	u_char *cp;
-	char *comment = NULL;
-	struct sshcipher_ctx *ciphercontext = NULL;
-	const struct sshcipher *cipher;
-	struct sshkey *prv = NULL;
-
-	if (keyp != NULL)
-		*keyp = NULL;
-	if (commentp != NULL)
-		*commentp = NULL;
-
-	/* Check that it is at least big enough to contain the ID string. */
-	if (sshbuf_len(blob) < sizeof(LEGACY_BEGIN))
-		return SSH_ERR_INVALID_FORMAT;
-
-	/*
-	 * Make sure it begins with the id string.  Consume the id string
-	 * from the buffer.
-	 */
-	if (memcmp(sshbuf_ptr(blob), LEGACY_BEGIN, sizeof(LEGACY_BEGIN)) != 0)
-		return SSH_ERR_INVALID_FORMAT;
-
-	if ((prv = sshkey_new_private(KEY_RSA1)) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-	if ((copy = sshbuf_fromb(blob)) == NULL ||
-	    (decrypted = sshbuf_new()) == NULL) {
-		r = SSH_ERR_ALLOC_FAIL;
-		goto out;
-	}
-	if ((r = sshbuf_consume(copy, sizeof(LEGACY_BEGIN))) != 0)
-		goto out;
-
-	/* Read cipher type. */
-	if ((r = sshbuf_get_u8(copy, &cipher_type)) != 0 ||
-	    (r = sshbuf_get_u32(copy, NULL)) != 0)	/* reserved */
-		goto out;
-
-	/* Read the public key and comment from the buffer. */
-	if ((r = sshbuf_get_u32(copy, NULL)) != 0 ||	/* key bits */
-	    (r = sshbuf_get_bignum1(copy, prv->rsa->n)) != 0 ||
-	    (r = sshbuf_get_bignum1(copy, prv->rsa->e)) != 0 ||
-	    (r = sshbuf_get_cstring(copy, &comment, NULL)) != 0)
-		goto out;
-
-	/* Check that it is a supported cipher. */
-	cipher = cipher_by_number(cipher_type);
-	if (cipher == NULL) {
-		r = SSH_ERR_KEY_UNKNOWN_CIPHER;
-		goto out;
-	}
-	/* Initialize space for decrypted data. */
-	if ((r = sshbuf_reserve(decrypted, sshbuf_len(copy), &cp)) != 0)
-		goto out;
-
-	/* Rest of the buffer is encrypted.  Decrypt it using the passphrase. */
-	if ((r = cipher_set_key_string(&ciphercontext, cipher, passphrase,
-	    CIPHER_DECRYPT)) != 0)
-		goto out;
-	if ((r = cipher_crypt(ciphercontext, 0, cp,
-	    sshbuf_ptr(copy), sshbuf_len(copy), 0, 0)) != 0)
-		goto out;
-
-	if ((r = sshbuf_get_u16(decrypted, &check1)) != 0 ||
-	    (r = sshbuf_get_u16(decrypted, &check2)) != 0)
-		goto out;
-	if (check1 != check2) {
-		r = SSH_ERR_KEY_WRONG_PASSPHRASE;
-		goto out;
-	}
-
-	/* Read the rest of the private key. */
-	if ((r = sshbuf_get_bignum1(decrypted, prv->rsa->d)) != 0 ||
-	    (r = sshbuf_get_bignum1(decrypted, prv->rsa->iqmp)) != 0 ||
-	    (r = sshbuf_get_bignum1(decrypted, prv->rsa->q)) != 0 ||
-	    (r = sshbuf_get_bignum1(decrypted, prv->rsa->p)) != 0)
-		goto out;
-
-	/* calculate p-1 and q-1 */
-	if ((r = rsa_generate_additional_parameters(prv->rsa)) != 0)
-		goto out;
-
-	/* enable blinding */
-	if (RSA_blinding_on(prv->rsa, NULL) != 1) {
-		r = SSH_ERR_LIBCRYPTO_ERROR;
-		goto out;
-	}
-	r = 0;
-	if (keyp != NULL) {
-		*keyp = prv;
-		prv = NULL;
-	}
-	if (commentp != NULL) {
-		*commentp = comment;
-		comment = NULL;
-	}
- out:
-	cipher_free(ciphercontext);
-	free(comment);
-	sshkey_free(prv);
-	sshbuf_free(copy);
-	sshbuf_free(decrypted);
-	return r;
-}
-#endif /* WITH_SSH1 */
 
 #ifdef WITH_OPENSSL
 static int
+translate_libcrypto_error(unsigned long pem_err)
+{
+	int pem_reason = ERR_GET_REASON(pem_err);
+
+	switch (ERR_GET_LIB(pem_err)) {
+	case ERR_LIB_PEM:
+		switch (pem_reason) {
+		case PEM_R_BAD_PASSWORD_READ:
+#ifdef PEM_R_PROBLEMS_GETTING_PASSWORD
+		case PEM_R_PROBLEMS_GETTING_PASSWORD:
+#endif
+		case PEM_R_BAD_DECRYPT:
+			return SSH_ERR_KEY_WRONG_PASSPHRASE;
+		default:
+			return SSH_ERR_INVALID_FORMAT;
+		}
+	case ERR_LIB_EVP:
+		switch (pem_reason) {
+#ifdef EVP_R_BAD_DECRYPT
+		case EVP_R_BAD_DECRYPT:
+			return SSH_ERR_KEY_WRONG_PASSPHRASE;
+#endif
+#ifdef EVP_R_BN_DECODE_ERROR
+		case EVP_R_BN_DECODE_ERROR:
+#endif
+		case EVP_R_DECODE_ERROR:
+#ifdef EVP_R_PRIVATE_KEY_DECODE_ERROR
+		case EVP_R_PRIVATE_KEY_DECODE_ERROR:
+#endif
+			return SSH_ERR_INVALID_FORMAT;
+		default:
+			return SSH_ERR_LIBCRYPTO_ERROR;
+		}
+	case ERR_LIB_ASN1:
+		return SSH_ERR_INVALID_FORMAT;
+	}
+	return SSH_ERR_LIBCRYPTO_ERROR;
+}
+
+static void
+clear_libcrypto_errors(void)
+{
+	while (ERR_get_error() != 0)
+		;
+}
+
+/*
+ * Translate OpenSSL error codes to determine whether
+ * passphrase is required/incorrect.
+ */
+static int
+convert_libcrypto_error(void)
+{
+	/*
+	 * Some password errors are reported at the beginning
+	 * of the error queue.
+	 */
+	if (translate_libcrypto_error(ERR_peek_error()) ==
+	    SSH_ERR_KEY_WRONG_PASSPHRASE)
+		return SSH_ERR_KEY_WRONG_PASSPHRASE;
+	return translate_libcrypto_error(ERR_peek_last_error());
+}
+
+static int
 sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
     const char *passphrase, struct sshkey **keyp)
 {
@@ -3786,54 +3834,10 @@
 		goto out;
 	}
 
+	clear_libcrypto_errors();
 	if ((pk = PEM_read_bio_PrivateKey(bio, NULL, NULL,
 	    (char *)passphrase)) == NULL) {
-		unsigned long pem_err = ERR_peek_last_error();
-		int pem_reason = ERR_GET_REASON(pem_err);
-
-		/*
-		 * Translate OpenSSL error codes to determine whether
-		 * passphrase is required/incorrect.
-		 */
-		switch (ERR_GET_LIB(pem_err)) {
-		case ERR_LIB_PEM:
-			switch (pem_reason) {
-			case PEM_R_BAD_PASSWORD_READ:
-#ifdef PEM_R_PROBLEMS_GETTING_PASSWORD
-			case PEM_R_PROBLEMS_GETTING_PASSWORD:
-#endif
-			case PEM_R_BAD_DECRYPT:
-				r = SSH_ERR_KEY_WRONG_PASSPHRASE;
-				goto out;
-			default:
-				r = SSH_ERR_INVALID_FORMAT;
-				goto out;
-			}
-		case ERR_LIB_EVP:
-			switch (pem_reason) {
-#ifdef EVP_R_BAD_DECRYPT
-			case EVP_R_BAD_DECRYPT:
-				r = SSH_ERR_KEY_WRONG_PASSPHRASE;
-				goto out;
-#endif
-#ifdef EVP_R_BN_DECODE_ERROR
-			case EVP_R_BN_DECODE_ERROR:
-#endif
-			case EVP_R_DECODE_ERROR:
-#ifdef EVP_R_PRIVATE_KEY_DECODE_ERROR
-			case EVP_R_PRIVATE_KEY_DECODE_ERROR:
-#endif
-				r = SSH_ERR_INVALID_FORMAT;
-				goto out;
-			default:
-				r = SSH_ERR_LIBCRYPTO_ERROR;
-				goto out;
-			}
-		case ERR_LIB_ASN1:
-			r = SSH_ERR_INVALID_FORMAT;
-			goto out;
-		}
-		r = SSH_ERR_LIBCRYPTO_ERROR;
+		r = convert_libcrypto_error();
 		goto out;
 	}
 	if (pk->type == EVP_PKEY_RSA &&
@@ -3851,6 +3855,10 @@
 			r = SSH_ERR_LIBCRYPTO_ERROR;
 			goto out;
 		}
+		if (BN_num_bits(prv->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
+			r = SSH_ERR_KEY_LENGTH;
+			goto out;
+		}
 	} else if (pk->type == EVP_PKEY_DSA &&
 	    (type == KEY_UNSPEC || type == KEY_DSA)) {
 		if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
@@ -3896,8 +3904,7 @@
 	}
  out:
 	BIO_free(bio);
-	if (pk != NULL)
-		EVP_PKEY_free(pk);
+	EVP_PKEY_free(pk);
 	sshkey_free(prv);
 	return r;
 }
@@ -3915,11 +3922,6 @@
 		*commentp = NULL;
 
 	switch (type) {
-#ifdef WITH_SSH1
-	case KEY_RSA1:
-		return sshkey_parse_private_rsa1(blob, passphrase,
-		    keyp, commentp);
-#endif /* WITH_SSH1 */
 #ifdef WITH_OPENSSL
 	case KEY_DSA:
 	case KEY_ECDSA:
@@ -3928,6 +3930,9 @@
 		    passphrase, keyp);
 #endif /* WITH_OPENSSL */
 	case KEY_ED25519:
+#ifdef WITH_XMSS
+	case KEY_XMSS:
+#endif /* WITH_XMSS */
 		return sshkey_parse_private2(blob, type, passphrase,
 		    keyp, commentp);
 	case KEY_UNSPEC:
@@ -3956,13 +3961,93 @@
 	if (commentp != NULL)
 		*commentp = NULL;
 
-#ifdef WITH_SSH1
-	/* it's a SSH v1 key if the public key part is readable */
-	if (sshkey_parse_public_rsa1_fileblob(buffer, NULL, NULL) == 0) {
-		return sshkey_parse_private_fileblob_type(buffer, KEY_RSA1,
-		    passphrase, keyp, commentp);
-	}
-#endif /* WITH_SSH1 */
 	return sshkey_parse_private_fileblob_type(buffer, KEY_UNSPEC,
 	    passphrase, keyp, commentp);
 }
+
+#ifdef WITH_XMSS
+/*
+ * serialize the key with the current state and forward the state
+ * maxsign times.
+ */
+int
+sshkey_private_serialize_maxsign(const struct sshkey *k, struct sshbuf *b,
+    u_int32_t maxsign, sshkey_printfn *pr)
+{
+	int r, rupdate;
+
+	if (maxsign == 0 ||
+	    sshkey_type_plain(k->type) != KEY_XMSS)
+		return sshkey_private_serialize_opt(k, b,
+		    SSHKEY_SERIALIZE_DEFAULT);
+	if ((r = sshkey_xmss_get_state(k, pr)) != 0 ||
+	    (r = sshkey_private_serialize_opt(k, b,
+	    SSHKEY_SERIALIZE_STATE)) != 0 ||
+	    (r = sshkey_xmss_forward_state(k, maxsign)) != 0)
+		goto out;
+	r = 0;
+out:
+	if ((rupdate = sshkey_xmss_update_state(k, pr)) != 0) {
+		if (r == 0)
+			r = rupdate;
+	}
+	return r;
+}
+
+u_int32_t
+sshkey_signatures_left(const struct sshkey *k)
+{
+	if (sshkey_type_plain(k->type) == KEY_XMSS)
+		return sshkey_xmss_signatures_left(k);
+	return 0;
+}
+
+int
+sshkey_enable_maxsign(struct sshkey *k, u_int32_t maxsign)
+{
+	if (sshkey_type_plain(k->type) != KEY_XMSS)
+		return SSH_ERR_INVALID_ARGUMENT;
+	return sshkey_xmss_enable_maxsign(k, maxsign);
+}
+
+int
+sshkey_set_filename(struct sshkey *k, const char *filename)
+{
+	if (k == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if (sshkey_type_plain(k->type) != KEY_XMSS)
+		return 0;
+	if (filename == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	if ((k->xmss_filename = strdup(filename)) == NULL)
+		return SSH_ERR_ALLOC_FAIL;
+	return 0;
+}
+#else
+int
+sshkey_private_serialize_maxsign(const struct sshkey *k, struct sshbuf *b,
+    u_int32_t maxsign, sshkey_printfn *pr)
+{
+	return sshkey_private_serialize_opt(k, b, SSHKEY_SERIALIZE_DEFAULT);
+}
+
+u_int32_t
+sshkey_signatures_left(const struct sshkey *k)
+{
+	return 0;
+}
+
+int
+sshkey_enable_maxsign(struct sshkey *k, u_int32_t maxsign)
+{
+	return SSH_ERR_INVALID_ARGUMENT;
+}
+
+int
+sshkey_set_filename(struct sshkey *k, const char *filename)
+{
+	if (k == NULL)
+		return SSH_ERR_INVALID_ARGUMENT;
+	return 0;
+}
+#endif /* WITH_XMSS */
diff --git a/sshkey.h b/sshkey.h
index f393638..9060b2e 100644
--- a/sshkey.h
+++ b/sshkey.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshkey.h,v 1.14 2016/09/12 23:31:27 djm Exp $ */
+/* $OpenBSD: sshkey.h,v 1.26 2018/07/03 13:20:25 djm Exp $ */
 
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
@@ -46,14 +46,13 @@
 # define EC_POINT	void
 #endif /* WITH_OPENSSL */
 
-#define SSH_RSA_MINIMUM_MODULUS_SIZE	768
+#define SSH_RSA_MINIMUM_MODULUS_SIZE	1024
 #define SSH_KEY_MAX_SIGN_DATA_SIZE	(1 << 20)
 
 struct sshbuf;
 
 /* Key types */
 enum sshkey_types {
-	KEY_RSA1,
 	KEY_RSA,
 	KEY_DSA,
 	KEY_ECDSA,
@@ -62,6 +61,8 @@
 	KEY_DSA_CERT,
 	KEY_ECDSA_CERT,
 	KEY_ED25519_CERT,
+	KEY_XMSS,
+	KEY_XMSS_CERT,
 	KEY_UNSPEC
 };
 
@@ -77,6 +78,14 @@
 	SSH_FP_RANDOMART
 };
 
+/* Private key serialisation formats, used on the wire */
+enum sshkey_serialize_rep {
+	SSHKEY_SERIALIZE_DEFAULT = 0,
+	SSHKEY_SERIALIZE_STATE = 1,
+	SSHKEY_SERIALIZE_FULL = 2,
+	SSHKEY_SERIALIZE_INFO = 254,
+};
+
 /* key is stored in external hardware */
 #define SSHKEY_FLAG_EXT		0x0001
 
@@ -105,6 +114,11 @@
 	EC_KEY	*ecdsa;
 	u_char	*ed25519_sk;
 	u_char	*ed25519_pk;
+	char	*xmss_name;
+	char	*xmss_filename;	/* for state file updates */
+	void	*xmss_state;	/* depends on xmss_name, opaque */
+	u_char	*xmss_sk;
+	u_char	*xmss_pk;
 	struct sshkey_cert *cert;
 };
 
@@ -125,6 +139,7 @@
     int, u_char **retp, size_t *lenp);
 const char	*sshkey_type(const struct sshkey *);
 const char	*sshkey_cert_type(const struct sshkey *);
+int		 sshkey_format_text(const struct sshkey *, struct sshbuf *);
 int		 sshkey_write(const struct sshkey *, FILE *);
 int		 sshkey_read(struct sshkey *, char **);
 u_int		 sshkey_size(const struct sshkey *);
@@ -137,13 +152,19 @@
 int	 sshkey_type_plain(int);
 int	 sshkey_to_certified(struct sshkey *);
 int	 sshkey_drop_cert(struct sshkey *);
-int	 sshkey_certify(struct sshkey *, struct sshkey *, const char *);
 int	 sshkey_cert_copy(const struct sshkey *, struct sshkey *);
 int	 sshkey_cert_check_authority(const struct sshkey *, int, int,
     const char *, const char **);
 size_t	 sshkey_format_cert_validity(const struct sshkey_cert *,
     char *, size_t) __attribute__((__bounded__(__string__, 2, 3)));
 
+int	 sshkey_certify(struct sshkey *, struct sshkey *, const char *);
+/* Variant allowing use of a custom signature function (e.g. for ssh-agent) */
+typedef int sshkey_certify_signer(const struct sshkey *, u_char **, size_t *,
+    const u_char *, size_t, const char *, u_int, void *);
+int	 sshkey_certify_custom(struct sshkey *, struct sshkey *, const char *,
+    sshkey_certify_signer *, void *);
+
 int		 sshkey_ecdsa_nid_from_name(const char *);
 int		 sshkey_curve_name_to_nid(const char *);
 const char *	 sshkey_curve_nid_to_name(int);
@@ -156,7 +177,7 @@
 const char	*sshkey_ssh_name(const struct sshkey *);
 const char	*sshkey_ssh_name_plain(const struct sshkey *);
 int		 sshkey_names_valid2(const char *, int);
-char		*sshkey_alg_list(int, int, char);
+char		*sshkey_alg_list(int, int, int, char);
 
 int	 sshkey_from_blob(const u_char *, size_t, struct sshkey **);
 int	 sshkey_fromb(struct sshbuf *, struct sshkey **);
@@ -165,13 +186,17 @@
 int	 sshkey_to_base64(const struct sshkey *, char **);
 int	 sshkey_putb(const struct sshkey *, struct sshbuf *);
 int	 sshkey_puts(const struct sshkey *, struct sshbuf *);
+int	 sshkey_puts_opts(const struct sshkey *, struct sshbuf *,
+    enum sshkey_serialize_rep);
 int	 sshkey_plain_to_blob(const struct sshkey *, u_char **, size_t *);
 int	 sshkey_putb_plain(const struct sshkey *, struct sshbuf *);
 
 int	 sshkey_sign(const struct sshkey *, u_char **, size_t *,
     const u_char *, size_t, const char *, u_int);
 int	 sshkey_verify(const struct sshkey *, const u_char *, size_t,
-    const u_char *, size_t, u_int);
+    const u_char *, size_t, const char *, u_int);
+int	 sshkey_check_sigtype(const u_char *, size_t, const char *);
+const char *sshkey_sigalg_by_name(const char *);
 
 /* for debug */
 void	sshkey_dump_ec_point(const EC_GROUP *, const EC_POINT *);
@@ -179,25 +204,42 @@
 
 /* private key parsing and serialisation */
 int	sshkey_private_serialize(const struct sshkey *key, struct sshbuf *buf);
+int	sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *buf,
+    enum sshkey_serialize_rep);
 int	sshkey_private_deserialize(struct sshbuf *buf,  struct sshkey **keyp);
 
 /* private key file format parsing and serialisation */
 int	sshkey_private_to_fileblob(struct sshkey *key, struct sshbuf *blob,
     const char *passphrase, const char *comment,
     int force_new_format, const char *new_format_cipher, int new_format_rounds);
-int	sshkey_parse_public_rsa1_fileblob(struct sshbuf *blob,
-    struct sshkey **keyp, char **commentp);
 int	sshkey_parse_private_fileblob(struct sshbuf *buffer,
     const char *passphrase, struct sshkey **keyp, char **commentp);
 int	sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type,
     const char *passphrase, struct sshkey **keyp, char **commentp);
 
+/* XXX should be internal, but used by ssh-keygen */
+int ssh_rsa_generate_additional_parameters(struct sshkey *);
+
+/* stateful keys (e.g. XMSS) */
+#ifdef NO_ATTRIBUTE_ON_PROTOTYPE_ARGS
+typedef void sshkey_printfn(const char *, ...);
+#else
+typedef void sshkey_printfn(const char *, ...) __attribute__((format(printf, 1, 2)));
+#endif
+int	 sshkey_set_filename(struct sshkey *, const char *);
+int	 sshkey_enable_maxsign(struct sshkey *, u_int32_t);
+u_int32_t sshkey_signatures_left(const struct sshkey *);
+int	 sshkey_forward_state(const struct sshkey *, u_int32_t, sshkey_printfn *);
+int	 sshkey_private_serialize_maxsign(const struct sshkey *key, struct sshbuf *buf,
+    u_int32_t maxsign, sshkey_printfn *pr);
+
 #ifdef SSHKEY_INTERNAL
 int ssh_rsa_sign(const struct sshkey *key,
     u_char **sigp, size_t *lenp, const u_char *data, size_t datalen,
     const char *ident);
 int ssh_rsa_verify(const struct sshkey *key,
-    const u_char *sig, size_t siglen, const u_char *data, size_t datalen);
+    const u_char *sig, size_t siglen, const u_char *data, size_t datalen,
+    const char *alg);
 int ssh_dss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
     const u_char *data, size_t datalen, u_int compat);
 int ssh_dss_verify(const struct sshkey *key,
@@ -213,6 +255,11 @@
 int ssh_ed25519_verify(const struct sshkey *key,
     const u_char *signature, size_t signaturelen,
     const u_char *data, size_t datalen, u_int compat);
+int ssh_xmss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
+    const u_char *data, size_t datalen, u_int compat);
+int ssh_xmss_verify(const struct sshkey *key,
+    const u_char *signature, size_t signaturelen,
+    const u_char *data, size_t datalen, u_int compat);
 #endif
 
 #if !defined(WITH_OPENSSL)
diff --git a/sshlogin.c b/sshlogin.c
index cea3e76..1b2ee5f 100644
--- a/sshlogin.c
+++ b/sshlogin.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshlogin.c,v 1.32 2015/12/26 20:51:35 guenther Exp $ */
+/* $OpenBSD: sshlogin.c,v 1.33 2018/07/09 21:26:02 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -55,13 +55,15 @@
 #include <unistd.h>
 #include <limits.h>
 
+#include "sshlogin.h"
+#include "ssherr.h"
 #include "loginrec.h"
 #include "log.h"
-#include "buffer.h"
+#include "sshbuf.h"
 #include "misc.h"
 #include "servconf.h"
 
-extern Buffer loginmsg;
+extern struct sshbuf *loginmsg;
 extern ServerOptions options;
 
 /*
@@ -88,8 +90,9 @@
 store_lastlog_message(const char *user, uid_t uid)
 {
 #ifndef NO_SSH_LASTLOG
-	char *time_string, hostname[HOST_NAME_MAX+1] = "", buf[512];
+	char *time_string, hostname[HOST_NAME_MAX+1] = "";
 	time_t last_login_time;
+	int r;
 
 	if (!options.print_lastlog)
 		return;
@@ -97,7 +100,9 @@
 # ifdef CUSTOM_SYS_AUTH_GET_LASTLOGIN_MSG
 	time_string = sys_auth_get_lastlogin_msg(user, uid);
 	if (time_string != NULL) {
-		buffer_append(&loginmsg, time_string, strlen(time_string));
+		if ((r = sshbuf_put(loginmsg,
+		    time_string, strlen(time_string))) != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 		free(time_string);
 	}
 # else
@@ -108,12 +113,13 @@
 		time_string = ctime(&last_login_time);
 		time_string[strcspn(time_string, "\n")] = '\0';
 		if (strcmp(hostname, "") == 0)
-			snprintf(buf, sizeof(buf), "Last login: %s\r\n",
+			r = sshbuf_putf(loginmsg, "Last login: %s\r\n",
 			    time_string);
 		else
-			snprintf(buf, sizeof(buf), "Last login: %s from %s\r\n",
+			r = sshbuf_putf(loginmsg, "Last login: %s from %s\r\n",
 			    time_string, hostname);
-		buffer_append(&loginmsg, buf, strlen(buf));
+		if (r != 0)
+			fatal("%s: buffer error: %s", __func__, ssh_err(r));
 	}
 # endif /* CUSTOM_SYS_AUTH_GET_LASTLOGIN_MSG */
 #endif /* NO_SSH_LASTLOG */
diff --git a/sshpty.c b/sshpty.c
index 76efba2..c088992 100644
--- a/sshpty.c
+++ b/sshpty.c
@@ -120,30 +120,6 @@
 {
 	int fd;
 
-#ifdef _UNICOS
-	if (setsid() < 0)
-		error("setsid: %.100s", strerror(errno));
-
-	fd = open(tty, O_RDWR|O_NOCTTY);
-	if (fd != -1) {
-		signal(SIGHUP, SIG_IGN);
-		ioctl(fd, TCVHUP, (char *)NULL);
-		signal(SIGHUP, SIG_DFL);
-		setpgid(0, 0);
-		close(fd);
-	} else {
-		error("Failed to disconnect from controlling tty.");
-	}
-
-	debug("Setting controlling tty using TCSETCTTY.");
-	ioctl(*ttyfd, TCSETCTTY, NULL);
-	fd = open("/dev/tty", O_RDWR);
-	if (fd < 0)
-		error("%.100s: %.100s", tty, strerror(errno));
-	close(*ttyfd);
-	*ttyfd = fd;
-#else /* _UNICOS */
-
 	/* First disconnect from the old controlling tty. */
 #ifdef TIOCNOTTY
 	fd = open(_PATH_TTY, O_RDWR | O_NOCTTY);
@@ -187,7 +163,6 @@
 		    strerror(errno));
 	else
 		close(fd);
-#endif /* _UNICOS */
 }
 
 /* Changes the window size associated with the pty. */
diff --git a/ttymodes.c b/ttymodes.c
index db772c3..f0c2a5d 100644
--- a/ttymodes.c
+++ b/ttymodes.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ttymodes.c,v 1.30 2016/05/04 14:22:33 markus Exp $ */
+/* $OpenBSD: ttymodes.c,v 1.34 2018/07/09 21:20:26 markus Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -55,16 +55,15 @@
 #include "packet.h"
 #include "log.h"
 #include "compat.h"
-#include "buffer.h"
+#include "sshbuf.h"
+#include "ssherr.h"
 
 #define TTY_OP_END		0
 /*
- * uint32 (u_int) follows speed in SSH1 and SSH2
+ * uint32 (u_int) follows speed.
  */
-#define TTY_OP_ISPEED_PROTO1	192
-#define TTY_OP_OSPEED_PROTO1	193
-#define TTY_OP_ISPEED_PROTO2	128
-#define TTY_OP_OSPEED_PROTO2	129
+#define TTY_OP_ISPEED	128
+#define TTY_OP_OSPEED	129
 
 /*
  * Converts POSIX speed_t to a baud rate.  The values of the
@@ -277,28 +276,18 @@
  * being constructed.
  */
 void
-tty_make_modes(int fd, struct termios *tiop)
+ssh_tty_make_modes(struct ssh *ssh, int fd, struct termios *tiop)
 {
 	struct termios tio;
-	int baud;
-	Buffer buf;
-	int tty_op_ospeed, tty_op_ispeed;
-	void (*put_arg)(Buffer *, u_int);
+	struct sshbuf *buf;
+	int r, ibaud, obaud;
 
-	buffer_init(&buf);
-	if (compat20) {
-		tty_op_ospeed = TTY_OP_OSPEED_PROTO2;
-		tty_op_ispeed = TTY_OP_ISPEED_PROTO2;
-		put_arg = buffer_put_int;
-	} else {
-		tty_op_ospeed = TTY_OP_OSPEED_PROTO1;
-		tty_op_ispeed = TTY_OP_ISPEED_PROTO1;
-		put_arg = (void (*)(Buffer *, u_int)) buffer_put_char;
-	}
+	if ((buf = sshbuf_new()) == NULL)
+		fatal("%s: sshbuf_new failed", __func__);
 
 	if (tiop == NULL) {
 		if (fd == -1) {
-			debug("tty_make_modes: no fd or tio");
+			debug("%s: no fd or tio", __func__);
 			goto end;
 		}
 		if (tcgetattr(fd, &tio) == -1) {
@@ -309,21 +298,29 @@
 		tio = *tiop;
 
 	/* Store input and output baud rates. */
-	baud = speed_to_baud(cfgetospeed(&tio));
-	buffer_put_char(&buf, tty_op_ospeed);
-	buffer_put_int(&buf, baud);
-	baud = speed_to_baud(cfgetispeed(&tio));
-	buffer_put_char(&buf, tty_op_ispeed);
-	buffer_put_int(&buf, baud);
+	obaud = speed_to_baud(cfgetospeed(&tio));
+	ibaud = speed_to_baud(cfgetispeed(&tio));
+	if ((r = sshbuf_put_u8(buf, TTY_OP_OSPEED)) != 0 ||
+	    (r = sshbuf_put_u32(buf, obaud)) != 0 ||
+	    (r = sshbuf_put_u8(buf, TTY_OP_ISPEED)) != 0 ||
+	    (r = sshbuf_put_u32(buf, ibaud)) != 0)
+		fatal("%s: buffer error: %s", __func__, ssh_err(r));
 
 	/* Store values of mode flags. */
 #define TTYCHAR(NAME, OP) \
-	buffer_put_char(&buf, OP); \
-	put_arg(&buf, special_char_encode(tio.c_cc[NAME]));
+	if ((r = sshbuf_put_u8(buf, OP)) != 0 || \
+	    (r = sshbuf_put_u32(buf, \
+	    special_char_encode(tio.c_cc[NAME]))) != 0) \
+		fatal("%s: buffer error: %s", __func__, ssh_err(r)); \
+
+#define SSH_TTYMODE_IUTF8 42  /* for SSH_BUG_UTF8TTYMODE */
 
 #define TTYMODE(NAME, FIELD, OP) \
-	buffer_put_char(&buf, OP); \
-	put_arg(&buf, ((tio.FIELD & NAME) != 0));
+	if (OP == SSH_TTYMODE_IUTF8 && (datafellows & SSH_BUG_UTF8TTYMODE)) { \
+		debug3("%s: SSH_BUG_UTF8TTYMODE", __func__); \
+	} else if ((r = sshbuf_put_u8(buf, OP)) != 0 || \
+	    (r = sshbuf_put_u32(buf, ((tio.FIELD & NAME) != 0))) != 0) \
+		fatal("%s: buffer error: %s", __func__, ssh_err(r)); \
 
 #include "ttymodes.h"
 
@@ -332,12 +329,10 @@
 
 end:
 	/* Mark end of mode data. */
-	buffer_put_char(&buf, TTY_OP_END);
-	if (compat20)
-		packet_put_string(buffer_ptr(&buf), buffer_len(&buf));
-	else
-		packet_put_raw(buffer_ptr(&buf), buffer_len(&buf));
-	buffer_free(&buf);
+	if ((r = sshbuf_put_u8(buf, TTY_OP_END)) != 0 ||
+	    (r = sshpkt_put_stringb(ssh, buf)) != 0)
+		fatal("%s: packet error: %s", __func__, ssh_err(r));
+	sshbuf_free(buf);
 }
 
 /*
@@ -345,24 +340,23 @@
  * manner from a packet being read.
  */
 void
-tty_parse_modes(int fd, int *n_bytes_ptr)
+ssh_tty_parse_modes(struct ssh *ssh, int fd)
 {
 	struct termios tio;
-	int opcode, baud;
-	int n_bytes = 0;
-	int failure = 0;
-	u_int (*get_arg)(void);
-	int arg_size;
+	struct sshbuf *buf;
+	const u_char *data;
+	u_char opcode;
+	u_int baud, u;
+	int r, failure = 0;
+	size_t len;
 
-	if (compat20) {
-		*n_bytes_ptr = packet_get_int();
-		if (*n_bytes_ptr == 0)
-			return;
-		get_arg = packet_get_int;
-		arg_size = 4;
-	} else {
-		get_arg = packet_get_char;
-		arg_size = 1;
+	if ((r = sshpkt_get_string_direct(ssh, &data, &len)) != 0)
+		fatal("%s: packet error: %s", __func__, ssh_err(r));
+	if (len == 0)
+		return;
+	if ((buf = sshbuf_from(data, len)) == NULL) {
+		error("%s: sshbuf_from failed", __func__);
+		return;
 	}
 
 	/*
@@ -375,46 +369,48 @@
 		failure = -1;
 	}
 
-	for (;;) {
-		n_bytes += 1;
-		opcode = packet_get_char();
+	while (sshbuf_len(buf) > 0) {
+		if ((r = sshbuf_get_u8(buf, &opcode)) != 0)
+			fatal("%s: packet error: %s", __func__, ssh_err(r));
 		switch (opcode) {
 		case TTY_OP_END:
 			goto set;
 
-		/* XXX: future conflict possible */
-		case TTY_OP_ISPEED_PROTO1:
-		case TTY_OP_ISPEED_PROTO2:
-			n_bytes += 4;
-			baud = packet_get_int();
+		case TTY_OP_ISPEED:
+			if ((r = sshbuf_get_u32(buf, &baud)) != 0)
+				fatal("%s: packet error: %s",
+				    __func__, ssh_err(r));
 			if (failure != -1 &&
 			    cfsetispeed(&tio, baud_to_speed(baud)) == -1)
 				error("cfsetispeed failed for %d", baud);
 			break;
 
-		/* XXX: future conflict possible */
-		case TTY_OP_OSPEED_PROTO1:
-		case TTY_OP_OSPEED_PROTO2:
-			n_bytes += 4;
-			baud = packet_get_int();
+		case TTY_OP_OSPEED:
+			if ((r = sshbuf_get_u32(buf, &baud)) != 0)
+				fatal("%s: packet error: %s",
+				    __func__, ssh_err(r));
 			if (failure != -1 &&
 			    cfsetospeed(&tio, baud_to_speed(baud)) == -1)
 				error("cfsetospeed failed for %d", baud);
 			break;
 
 #define TTYCHAR(NAME, OP) \
-	case OP: \
-	  n_bytes += arg_size; \
-	  tio.c_cc[NAME] = special_char_decode(get_arg()); \
-	  break;
+		case OP: \
+			if ((r = sshbuf_get_u32(buf, &u)) != 0) \
+				fatal("%s: packet error: %s", __func__, \
+				    ssh_err(r)); \
+			tio.c_cc[NAME] = special_char_decode(u); \
+			break;
 #define TTYMODE(NAME, FIELD, OP) \
-	case OP: \
-	  n_bytes += arg_size; \
-	  if (get_arg()) \
-	    tio.FIELD |= NAME; \
-	  else \
-	    tio.FIELD &= ~NAME;	\
-	  break;
+		case OP: \
+			if ((r = sshbuf_get_u32(buf, &u)) != 0) \
+				fatal("%s: packet error: %s", __func__, \
+				    ssh_err(r)); \
+			if (u) \
+				tio.FIELD |= NAME; \
+			else \
+				tio.FIELD &= ~NAME; \
+			break;
 
 #include "ttymodes.h"
 
@@ -424,60 +420,31 @@
 		default:
 			debug("Ignoring unsupported tty mode opcode %d (0x%x)",
 			    opcode, opcode);
-			if (!compat20) {
-				/*
-				 * SSH1:
-				 * Opcodes 1 to 127 are defined to have
-				 * a one-byte argument.
-				 * Opcodes 128 to 159 are defined to have
-				 * an integer argument.
-				 */
-				if (opcode > 0 && opcode < 128) {
-					n_bytes += 1;
-					(void) packet_get_char();
-					break;
-				} else if (opcode >= 128 && opcode < 160) {
-					n_bytes += 4;
-					(void) packet_get_int();
-					break;
-				} else {
-					/*
-					 * It is a truly undefined opcode (160 to 255).
-					 * We have no idea about its arguments.  So we
-					 * must stop parsing.  Note that some data
-					 * may be left in the packet; hopefully there
-					 * is nothing more coming after the mode data.
-					 */
-					logit("parse_tty_modes: unknown opcode %d",
-					    opcode);
-					goto set;
-				}
+			/*
+			 * SSH2:
+			 * Opcodes 1 to 159 are defined to have a uint32
+			 * argument.
+			 * Opcodes 160 to 255 are undefined and cause parsing
+			 * to stop.
+			 */
+			if (opcode > 0 && opcode < 160) {
+				if ((r = sshbuf_get_u32(buf, NULL)) != 0)
+					fatal("%s: packet error: %s", __func__,
+					    ssh_err(r));
+				break;
 			} else {
-				/*
-				 * SSH2:
-				 * Opcodes 1 to 159 are defined to have
-				 * a uint32 argument.
-				 * Opcodes 160 to 255 are undefined and
-				 * cause parsing to stop.
-				 */
-				if (opcode > 0 && opcode < 160) {
-					n_bytes += 4;
-					(void) packet_get_int();
-					break;
-				} else {
-					logit("parse_tty_modes: unknown opcode %d",
-					    opcode);
-					goto set;
-				}
+				logit("%s: unknown opcode %d", __func__,
+				    opcode);
+				goto set;
 			}
 		}
 	}
 
 set:
-	if (*n_bytes_ptr != n_bytes) {
-		*n_bytes_ptr = n_bytes;
-		logit("parse_tty_modes: n_bytes_ptr != n_bytes: %d %d",
-		    *n_bytes_ptr, n_bytes);
+	len = sshbuf_len(buf);
+	sshbuf_free(buf);
+	if (len > 0) {
+		logit("%s: %zu bytes left", __func__, len);
 		return;		/* Don't process bytes passed */
 	}
 	if (failure == -1)
diff --git a/ttymodes.h b/ttymodes.h
index 14e177c..24f0756 100644
--- a/ttymodes.h
+++ b/ttymodes.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ttymodes.h,v 1.15 2016/05/03 09:03:49 dtucker Exp $ */
+/* $OpenBSD: ttymodes.h,v 1.16 2017/04/30 23:26:54 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -38,22 +38,13 @@
  */
 
 /*
- * SSH1:
- * The tty mode description is a stream of bytes.  The stream consists of
+ * The tty mode description is a string, consisting of
  * opcode-arguments pairs.  It is terminated by opcode TTY_OP_END (0).
- * Opcodes 1-127 have one-byte arguments.  Opcodes 128-159 have integer
- * arguments.  Opcodes 160-255 are not yet defined, and cause parsing to
- * stop (they should only be used after any other data).
+ * Opcodes 1-159 have uint32 arguments.
+ * Opcodes 160-255 are not yet defined and cause parsing to stop (they
+ * should only be used after any other data).
  *
- * SSH2:
- * Differences between SSH1 and SSH2 terminal mode encoding include:
- * 1. Encoded terminal modes are represented as a string, and a stream
- *    of bytes within that string.
- * 2. Opcode arguments are uint32 (1-159); 160-255 remain undefined.
- * 3. The values for TTY_OP_ISPEED and TTY_OP_OSPEED are different;
- *    128 and 129 vs. 192 and 193 respectively.
- *
- * The client puts in the stream any modes it knows about, and the
+ * The client puts in the string any modes it knows about, and the
  * server ignores any modes it does not know about.  This allows some degree
  * of machine-independence, at least between systems that use a posix-like
  * tty interface.  The protocol can support other systems as well, but might
diff --git a/uidswap.c b/uidswap.c
index 8bf6b24..49f76d8 100644
--- a/uidswap.c
+++ b/uidswap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uidswap.c,v 1.39 2015/06/24 01:49:19 dtucker Exp $ */
+/* $OpenBSD: uidswap.c,v 1.41 2018/07/18 11:34:04 dtucker Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -49,6 +49,7 @@
 /* Saved effective uid. */
 static int	privileged = 0;
 static int	temporarily_use_uid_effective = 0;
+static uid_t	user_groups_uid;
 static gid_t	*saved_egroups = NULL, *user_groups = NULL;
 static int	saved_egroupslen = -1, user_groupslen = -1;
 
@@ -92,10 +93,11 @@
 			fatal("getgroups: %.100s", strerror(errno));
 	} else { /* saved_egroupslen == 0 */
 		free(saved_egroups);
+		saved_egroups = NULL;
 	}
 
 	/* set and save the user's groups */
-	if (user_groupslen == -1) {
+	if (user_groupslen == -1 || user_groups_uid != pw->pw_uid) {
 		if (initgroups(pw->pw_name, pw->pw_gid) < 0)
 			fatal("initgroups: %s: %.100s", pw->pw_name,
 			    strerror(errno));
@@ -110,7 +112,9 @@
 				fatal("getgroups: %.100s", strerror(errno));
 		} else { /* user_groupslen == 0 */
 			free(user_groups);
+			user_groups = NULL;
 		}
+		user_groups_uid = pw->pw_uid;
 	}
 	/* Set the effective uid to the given (unprivileged) uid. */
 	if (setgroups(user_groupslen, user_groups) < 0)
@@ -131,37 +135,6 @@
 		    strerror(errno));
 }
 
-void
-permanently_drop_suid(uid_t uid)
-{
-#ifndef NO_UID_RESTORATION_TEST
-	uid_t old_uid = getuid();
-#endif
-
-	debug("permanently_drop_suid: %u", (u_int)uid);
-	if (setresuid(uid, uid, uid) < 0)
-		fatal("setresuid %u: %.100s", (u_int)uid, strerror(errno));
-
-#ifndef NO_UID_RESTORATION_TEST
-	/*
-	 * Try restoration of UID if changed (test clearing of saved uid).
-	 *
-	 * Note that we don't do this on Cygwin, or on Solaris-based platforms
-	 * where fine-grained privileges are available (the user might be
-	 * deliberately allowed the right to setuid back to root).
-	 */
-	if (old_uid != uid &&
-	    (setuid(old_uid) != -1 || seteuid(old_uid) != -1))
-		fatal("%s: was able to restore old [e]uid", __func__);
-#endif
-
-	/* Verify UID drop was successful */
-	if (getuid() != uid || geteuid() != uid) {
-		fatal("%s: euid incorrect uid:%u euid:%u (should be %u)",
-		    __func__, (u_int)getuid(), (u_int)geteuid(), (u_int)uid);
-	}
-}
-
 /*
  * Restores to the original (privileged) uid.
  */
diff --git a/uidswap.h b/uidswap.h
index 1c1163d..4ac91aa 100644
--- a/uidswap.h
+++ b/uidswap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: uidswap.h,v 1.13 2006/08/03 03:34:42 deraadt Exp $ */
+/* $OpenBSD: uidswap.h,v 1.14 2018/07/18 11:34:05 dtucker Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -15,4 +15,3 @@
 void	 temporarily_use_uid(struct passwd *);
 void	 restore_uid(void);
 void	 permanently_set_uid(struct passwd *);
-void	 permanently_drop_suid(uid_t);
diff --git a/umac.c b/umac.c
index 6eb55b2..ccae39f 100644
--- a/umac.c
+++ b/umac.c
@@ -1,6 +1,6 @@
-/* $OpenBSD: umac.c,v 1.11 2014/07/22 07:13:42 guenther Exp $ */
+/* $OpenBSD: umac.c,v 1.17 2018/04/10 00:10:49 djm Exp $ */
 /* -----------------------------------------------------------------------
- * 
+ *
  * umac.c -- C Implementation UMAC Message Authentication
  *
  * Version 0.93b of rfc4418.txt -- 2006 July 18
@@ -10,7 +10,7 @@
  * Please report bugs and suggestions to the UMAC webpage.
  *
  * Copyright (c) 1999-2006 Ted Krovetz
- *                                                                 
+ *
  * Permission to use, copy, modify, and distribute this software and
  * its documentation for any purpose and with or without fee, is hereby
  * granted provided that the above copyright notice appears in all copies
@@ -18,10 +18,10 @@
  * holder not be used in advertising or publicity pertaining to
  * distribution of the software without specific, written prior permission.
  *
- * Comments should be directed to Ted Krovetz (tdk@acm.org)                                        
- *                                                                   
+ * Comments should be directed to Ted Krovetz (tdk@acm.org)
+ *
  * ---------------------------------------------------------------------- */
- 
+
  /* ////////////////////// IMPORTANT NOTES /////////////////////////////////
   *
   * 1) This version does not work properly on messages larger than 16MB
@@ -47,7 +47,7 @@
   * produced under gcc with optimizations set -O3 or higher. Dunno why.
   *
   /////////////////////////////////////////////////////////////////////// */
- 
+
 /* ---------------------------------------------------------------------- */
 /* --- User Switches ---------------------------------------------------- */
 /* ---------------------------------------------------------------------- */
@@ -65,7 +65,7 @@
 /* #define AES_IMPLEMENTAION   1  1 = OpenSSL, 2 = Barreto, 3 = Gladman   */
 /* #define SSE2                0  Is SSE2 is available?                   */
 /* #define RUN_TESTS           0  Run basic correctness/speed tests       */
-/* #define UMAC_AE_SUPPORT     0  Enable auhthenticated encrytion         */
+/* #define UMAC_AE_SUPPORT     0  Enable authenticated encryption         */
 
 /* ---------------------------------------------------------------------- */
 /* -- Global Includes --------------------------------------------------- */
@@ -187,11 +187,11 @@
     UINT8 out_buf[AES_BLOCK_LEN];
     UINT8 *dst_buf = (UINT8 *)bufp;
     int i;
-    
+
     /* Setup the initial value */
     in_buf[AES_BLOCK_LEN-9] = ndx;
     in_buf[AES_BLOCK_LEN-1] = i = 1;
-        
+
     while (nbytes >= AES_BLOCK_LEN) {
         aes_encryption(in_buf, out_buf, key);
         memcpy(dst_buf,out_buf,AES_BLOCK_LEN);
@@ -203,10 +203,12 @@
         aes_encryption(in_buf, out_buf, key);
         memcpy(dst_buf,out_buf,nbytes);
     }
+    explicit_bzero(in_buf, sizeof(in_buf));
+    explicit_bzero(out_buf, sizeof(out_buf));
 }
 
 /* The final UHASH result is XOR'd with the output of a pseudorandom
- * function. Here, we use AES to generate random output and 
+ * function. Here, we use AES to generate random output and
  * xor the appropriate bytes depending on the last bits of nonce.
  * This scheme is optimized for sequential, increasing big-endian nonces.
  */
@@ -220,13 +222,14 @@
 static void pdf_init(pdf_ctx *pc, aes_int_key prf_key)
 {
     UINT8 buf[UMAC_KEY_LEN];
-    
+
     kdf(buf, prf_key, 0, UMAC_KEY_LEN);
     aes_key_setup(buf, pc->prf_key);
-    
+
     /* Initialize pdf and cache */
     memset(pc->nonce, 0, sizeof(pc->nonce));
     aes_encryption(pc->nonce, pc->cache, pc->prf_key);
+    explicit_bzero(buf, sizeof(buf));
 }
 
 static void pdf_gen_xor(pdf_ctx *pc, const UINT8 nonce[8], UINT8 buf[8])
@@ -235,7 +238,7 @@
      * of the AES output. If last time around we returned the ndx-1st
      * element, then we may have the result in the cache already.
      */
-     
+
 #if (UMAC_OUTPUT_LEN == 4)
 #define LOW_BIT_MASK 3
 #elif (UMAC_OUTPUT_LEN == 8)
@@ -252,7 +255,7 @@
 #endif
     *(UINT32 *)t.tmp_nonce_lo = ((const UINT32 *)nonce)[1];
     t.tmp_nonce_lo[3] &= ~LOW_BIT_MASK; /* zero last bit */
-    
+
     if ( (((UINT32 *)t.tmp_nonce_lo)[0] != ((UINT32 *)pc->nonce)[1]) ||
          (((const UINT32 *)nonce)[0] != ((UINT32 *)pc->nonce)[0]) )
     {
@@ -260,7 +263,7 @@
         ((UINT32 *)pc->nonce)[1] = ((UINT32 *)t.tmp_nonce_lo)[0];
         aes_encryption(pc->nonce, pc->cache, pc->prf_key);
     }
-    
+
 #if (UMAC_OUTPUT_LEN == 4)
     *((UINT32 *)buf) ^= ((UINT32 *)pc->cache)[ndx];
 #elif (UMAC_OUTPUT_LEN == 8)
@@ -281,28 +284,28 @@
 /* ---------------------------------------------------------------------- */
 
 /* The NH-based hash functions used in UMAC are described in the UMAC paper
- * and specification, both of which can be found at the UMAC website.     
- * The interface to this implementation has two         
+ * and specification, both of which can be found at the UMAC website.
+ * The interface to this implementation has two
  * versions, one expects the entire message being hashed to be passed
  * in a single buffer and returns the hash result immediately. The second
- * allows the message to be passed in a sequence of buffers. In the          
- * muliple-buffer interface, the client calls the routine nh_update() as     
- * many times as necessary. When there is no more data to be fed to the   
- * hash, the client calls nh_final() which calculates the hash output.    
- * Before beginning another hash calculation the nh_reset() routine       
- * must be called. The single-buffer routine, nh(), is equivalent to  
- * the sequence of calls nh_update() and nh_final(); however it is        
- * optimized and should be prefered whenever the multiple-buffer interface
- * is not necessary. When using either interface, it is the client's         
- * responsability to pass no more than L1_KEY_LEN bytes per hash result.            
- *                                                                        
- * The routine nh_init() initializes the nh_ctx data structure and        
- * must be called once, before any other PDF routine.                     
+ * allows the message to be passed in a sequence of buffers. In the
+ * muliple-buffer interface, the client calls the routine nh_update() as
+ * many times as necessary. When there is no more data to be fed to the
+ * hash, the client calls nh_final() which calculates the hash output.
+ * Before beginning another hash calculation the nh_reset() routine
+ * must be called. The single-buffer routine, nh(), is equivalent to
+ * the sequence of calls nh_update() and nh_final(); however it is
+ * optimized and should be preferred whenever the multiple-buffer interface
+ * is not necessary. When using either interface, it is the client's
+ * responsibility to pass no more than L1_KEY_LEN bytes per hash result.
+ *
+ * The routine nh_init() initializes the nh_ctx data structure and
+ * must be called once, before any other PDF routine.
  */
- 
+
  /* The "nh_aux" routines do the actual NH hashing work. They
   * expect buffers to be multiples of L1_PAD_BOUNDARY. These routines
-  * produce output for all STREAMS NH iterations in one call, 
+  * produce output for all STREAMS NH iterations in one call,
   * allowing the parallel implementation of the streams.
   */
 
@@ -316,8 +319,8 @@
 typedef struct {
     UINT8  nh_key [L1_KEY_LEN + L1_KEY_SHIFT * (STREAMS - 1)]; /* NH Key */
     UINT8  data   [HASH_BUF_BYTES];    /* Incoming data buffer           */
-    int next_data_empty;    /* Bookeeping variable for data buffer.       */
-    int bytes_hashed;        /* Bytes (out of L1_KEY_LEN) incorperated.   */
+    int next_data_empty;    /* Bookkeeping variable for data buffer.     */
+    int bytes_hashed;       /* Bytes (out of L1_KEY_LEN) incorporated.   */
     UINT64 state[STREAMS];               /* on-line state     */
 } nh_ctx;
 
@@ -325,10 +328,10 @@
 #if (UMAC_OUTPUT_LEN == 4)
 
 static void nh_aux(void *kp, const void *dp, void *hp, UINT32 dlen)
-/* NH hashing primitive. Previous (partial) hash result is loaded and     
+/* NH hashing primitive. Previous (partial) hash result is loaded and
 * then stored via hp pointer. The length of the data pointed at by "dp",
 * "dlen", is guaranteed to be divisible by L1_PAD_BOUNDARY (32).  Key
-* is expected to be endian compensated in memory at key setup.    
+* is expected to be endian compensated in memory at key setup.
 */
 {
     UINT64 h;
@@ -337,7 +340,7 @@
     const UINT32 *d = (const UINT32 *)dp;
     UINT32 d0,d1,d2,d3,d4,d5,d6,d7;
     UINT32 k0,k1,k2,k3,k4,k5,k6,k7;
-    
+
     h = *((UINT64 *)hp);
     do {
         d0 = LOAD_UINT32_LITTLE(d+0); d1 = LOAD_UINT32_LITTLE(d+1);
@@ -350,7 +353,7 @@
         h += MUL64((k1 + d1), (k5 + d5));
         h += MUL64((k2 + d2), (k6 + d6));
         h += MUL64((k3 + d3), (k7 + d7));
-        
+
         d += 8;
         k += 8;
     } while (--c);
@@ -418,7 +421,7 @@
     UINT32 d0,d1,d2,d3,d4,d5,d6,d7;
     UINT32 k0,k1,k2,k3,k4,k5,k6,k7,
         k8,k9,k10,k11,k12,k13,k14,k15;
-    
+
     h1 = *((UINT64 *)hp);
     h2 = *((UINT64 *)hp + 1);
     h3 = *((UINT64 *)hp + 2);
@@ -431,26 +434,26 @@
         d6 = LOAD_UINT32_LITTLE(d+6); d7 = LOAD_UINT32_LITTLE(d+7);
         k8 = *(k+8); k9 = *(k+9); k10 = *(k+10); k11 = *(k+11);
         k12 = *(k+12); k13 = *(k+13); k14 = *(k+14); k15 = *(k+15);
-        
+
         h1 += MUL64((k0 + d0), (k4 + d4));
         h2 += MUL64((k4 + d0), (k8 + d4));
         h3 += MUL64((k8 + d0), (k12 + d4));
-        
+
         h1 += MUL64((k1 + d1), (k5 + d5));
         h2 += MUL64((k5 + d1), (k9 + d5));
         h3 += MUL64((k9 + d1), (k13 + d5));
-        
+
         h1 += MUL64((k2 + d2), (k6 + d6));
         h2 += MUL64((k6 + d2), (k10 + d6));
         h3 += MUL64((k10 + d2), (k14 + d6));
-        
+
         h1 += MUL64((k3 + d3), (k7 + d7));
         h2 += MUL64((k7 + d3), (k11 + d7));
         h3 += MUL64((k11 + d3), (k15 + d7));
-        
+
         k0 = k8; k1 = k9; k2 = k10; k3 = k11;
         k4 = k12; k5 = k13; k6 = k14; k7 = k15;
-        
+
         d += 8;
         k += 8;
     } while (--c);
@@ -474,7 +477,7 @@
     UINT32 k0,k1,k2,k3,k4,k5,k6,k7,
         k8,k9,k10,k11,k12,k13,k14,k15,
         k16,k17,k18,k19;
-    
+
     h1 = *((UINT64 *)hp);
     h2 = *((UINT64 *)hp + 1);
     h3 = *((UINT64 *)hp + 2);
@@ -489,31 +492,31 @@
         k8 = *(k+8); k9 = *(k+9); k10 = *(k+10); k11 = *(k+11);
         k12 = *(k+12); k13 = *(k+13); k14 = *(k+14); k15 = *(k+15);
         k16 = *(k+16); k17 = *(k+17); k18 = *(k+18); k19 = *(k+19);
-        
+
         h1 += MUL64((k0 + d0), (k4 + d4));
         h2 += MUL64((k4 + d0), (k8 + d4));
         h3 += MUL64((k8 + d0), (k12 + d4));
         h4 += MUL64((k12 + d0), (k16 + d4));
-        
+
         h1 += MUL64((k1 + d1), (k5 + d5));
         h2 += MUL64((k5 + d1), (k9 + d5));
         h3 += MUL64((k9 + d1), (k13 + d5));
         h4 += MUL64((k13 + d1), (k17 + d5));
-        
+
         h1 += MUL64((k2 + d2), (k6 + d6));
         h2 += MUL64((k6 + d2), (k10 + d6));
         h3 += MUL64((k10 + d2), (k14 + d6));
         h4 += MUL64((k14 + d2), (k18 + d6));
-        
+
         h1 += MUL64((k3 + d3), (k7 + d7));
         h2 += MUL64((k7 + d3), (k11 + d7));
         h3 += MUL64((k11 + d3), (k15 + d7));
         h4 += MUL64((k15 + d3), (k19 + d7));
-        
+
         k0 = k8; k1 = k9; k2 = k10; k3 = k11;
         k4 = k12; k5 = k13; k6 = k14; k7 = k15;
         k8 = k16; k9 = k17; k10 = k18; k11 = k19;
-        
+
         d += 8;
         k += 8;
     } while (--c);
@@ -538,7 +541,7 @@
  */
 {
     UINT8 *key;
-  
+
     key = hc->nh_key + hc->bytes_hashed;
     nh_aux(key, buf, hc->state, nbytes);
 }
@@ -610,7 +613,7 @@
 /* even multiple of HASH_BUF_BYTES.                                       */
 {
     UINT32 i,j;
-    
+
     j = hc->next_data_empty;
     if ((j + nbytes) >= HASH_BUF_BYTES) {
         if (j) {
@@ -674,12 +677,12 @@
     if (hc->next_data_empty != 0) {
         nh_len = ((hc->next_data_empty + (L1_PAD_BOUNDARY - 1)) &
                                                 ~(L1_PAD_BOUNDARY - 1));
-        zero_pad(hc->data + hc->next_data_empty, 
+        zero_pad(hc->data + hc->next_data_empty,
                                           nh_len - hc->next_data_empty);
         nh_transform(hc, hc->data, nh_len);
         hc->bytes_hashed += hc->next_data_empty;
     } else if (hc->bytes_hashed == 0) {
-    	nh_len = L1_PAD_BOUNDARY;
+	nh_len = L1_PAD_BOUNDARY;
         zero_pad(hc->data, L1_PAD_BOUNDARY);
         nh_transform(hc, hc->data, nh_len);
     }
@@ -708,10 +711,10 @@
  */
 {
     UINT32 nbits;
-    
+
     /* Initialize the hash state */
     nbits = (unpadded_len << 3);
-    
+
     ((UINT64 *)result)[0] = nbits;
 #if (UMAC_OUTPUT_LEN >= 8)
     ((UINT64 *)result)[1] = nbits;
@@ -722,7 +725,7 @@
 #if (UMAC_OUTPUT_LEN == 16)
     ((UINT64 *)result)[3] = nbits;
 #endif
-    
+
     nh_aux(hc->nh_key, buf, result, padded_len);
 }
 
@@ -741,16 +744,16 @@
  * buffers are presented sequentially. In the sequential interface, the
  * UHASH client calls the routine uhash_update() as many times as necessary.
  * When there is no more data to be fed to UHASH, the client calls
- * uhash_final() which          
- * calculates the UHASH output. Before beginning another UHASH calculation    
- * the uhash_reset() routine must be called. The all-at-once UHASH routine,   
- * uhash(), is equivalent to the sequence of calls uhash_update() and         
- * uhash_final(); however it is optimized and should be                     
- * used whenever the sequential interface is not necessary.              
- *                                                                        
- * The routine uhash_init() initializes the uhash_ctx data structure and    
+ * uhash_final() which
+ * calculates the UHASH output. Before beginning another UHASH calculation
+ * the uhash_reset() routine must be called. The all-at-once UHASH routine,
+ * uhash(), is equivalent to the sequence of calls uhash_update() and
+ * uhash_final(); however it is optimized and should be
+ * used whenever the sequential interface is not necessary.
+ *
+ * The routine uhash_init() initializes the uhash_ctx data structure and
  * must be called once, before any other UHASH routine.
- */                                                        
+ */
 
 /* ---------------------------------------------------------------------- */
 /* ----- Constants and uhash_ctx ---------------------------------------- */
@@ -799,13 +802,13 @@
            x_lo,
            x_hi;
     UINT64 X,T,res;
-    
+
     X =  MUL64(key_hi, cur_lo) + MUL64(cur_hi, key_lo);
     x_lo = (UINT32)X;
     x_hi = (UINT32)(X >> 32);
-    
+
     res = (MUL64(key_hi, cur_hi) + x_hi) * 59 + MUL64(key_lo, cur_lo);
-     
+
     T = ((UINT64)x_lo << 32);
     res += T;
     if (res < T)
@@ -829,10 +832,10 @@
 {
     int i;
     UINT64 *data=(UINT64*)data_in;
-    
+
     for (i = 0; i < STREAMS; i++) {
         if ((UINT32)(data[i] >> 32) == 0xfffffffful) {
-            hc->poly_accum[i] = poly64(hc->poly_accum[i], 
+            hc->poly_accum[i] = poly64(hc->poly_accum[i],
                                        hc->poly_key_8[i], p64 - 1);
             hc->poly_accum[i] = poly64(hc->poly_accum[i],
                                        hc->poly_key_8[i], (data[i] - 59));
@@ -848,7 +851,7 @@
 
 
 /* The final step in UHASH is an inner-product hash. The poly hash
- * produces a result not neccesarily WORD_LEN bytes long. The inner-
+ * produces a result not necessarily WORD_LEN bytes long. The inner-
  * product hash breaks the polyhash output into 16-bit chunks and
  * multiplies each with a 36 bit key.
  */
@@ -859,7 +862,7 @@
     t = t + ipkp[1] * (UINT64)(UINT16)(data >> 32);
     t = t + ipkp[2] * (UINT64)(UINT16)(data >> 16);
     t = t + ipkp[3] * (UINT64)(UINT16)(data);
-    
+
     return t;
 }
 
@@ -867,7 +870,7 @@
 {
 /* Divisionless modular reduction */
     UINT64 ret;
-    
+
     ret = (t & m36) + 5 * (t >> 36);
     if (ret >= p36)
         ret -= p36;
@@ -885,7 +888,7 @@
 {
     UINT64 t;
     UINT64 *nhp = (UINT64 *)nh_res;
-    
+
     t  = ip_aux(0,ahc->ip_keys, nhp[0]);
     STORE_UINT32_BIG((UINT32 *)res+0, ip_reduce_p36(t) ^ ahc->ip_trans[0]);
 #if (UMAC_OUTPUT_LEN >= 8)
@@ -916,7 +919,7 @@
         if (ahc->poly_accum[i] >= p64)
             ahc->poly_accum[i] -= p64;
         t  = ip_aux(0,ahc->ip_keys+(i*4), ahc->poly_accum[i]);
-        STORE_UINT32_BIG((UINT32 *)res+i, 
+        STORE_UINT32_BIG((UINT32 *)res+i,
                          ip_reduce_p36(t) ^ ahc->ip_trans[i]);
     }
 }
@@ -955,13 +958,13 @@
 {
     int i;
     UINT8 buf[(8*STREAMS+4)*sizeof(UINT64)];
-    
+
     /* Zero the entire uhash context */
     memset(ahc, 0, sizeof(uhash_ctx));
 
     /* Initialize the L1 hash */
     nh_init(&ahc->hash, prf_key);
-    
+
     /* Setup L2 hash variables */
     kdf(buf, prf_key, 2, sizeof(buf));    /* Fill buffer with index 1 key */
     for (i = 0; i < STREAMS; i++) {
@@ -975,22 +978,23 @@
         ahc->poly_key_8[i] &= ((UINT64)0x01ffffffu << 32) + 0x01ffffffu;
         ahc->poly_accum[i] = 1;  /* Our polyhash prepends a non-zero word */
     }
-    
+
     /* Setup L3-1 hash variables */
     kdf(buf, prf_key, 3, sizeof(buf)); /* Fill buffer with index 2 key */
     for (i = 0; i < STREAMS; i++)
           memcpy(ahc->ip_keys+4*i, buf+(8*i+4)*sizeof(UINT64),
                                                  4*sizeof(UINT64));
-    endian_convert_if_le(ahc->ip_keys, sizeof(UINT64), 
+    endian_convert_if_le(ahc->ip_keys, sizeof(UINT64),
                                                   sizeof(ahc->ip_keys));
     for (i = 0; i < STREAMS*4; i++)
         ahc->ip_keys[i] %= p36;  /* Bring into Z_p36 */
-    
+
     /* Setup L3-2 hash variables    */
     /* Fill buffer with index 4 key */
     kdf(ahc->ip_trans, prf_key, 4, STREAMS * sizeof(UINT32));
     endian_convert_if_le(ahc->ip_trans, sizeof(UINT32),
                          STREAMS * sizeof(UINT32));
+    explicit_bzero(buf, sizeof(buf));
 }
 
 /* ---------------------------------------------------------------------- */
@@ -1002,7 +1006,7 @@
     uhash_ctx_t ctx;
     u_char bytes_to_add;
     aes_int_key prf_key;
-    
+
     ctx = (uhash_ctx_t)malloc(sizeof(uhash_ctx)+ALLOC_BOUNDARY);
     if (ctx) {
         if (ALLOC_BOUNDARY) {
@@ -1025,7 +1029,7 @@
 {
 /* Free memory allocated by uhash_alloc */
     u_char bytes_to_sub;
-    
+
     if (ctx) {
         if (ALLOC_BOUNDARY) {
             bytes_to_sub = *((u_char *)ctx - 1);
@@ -1046,12 +1050,12 @@
     UWORD bytes_hashed, bytes_remaining;
     UINT64 result_buf[STREAMS];
     UINT8 *nh_result = (UINT8 *)&result_buf;
-    
+
     if (ctx->msg_len + len <= L1_KEY_LEN) {
         nh_update(&ctx->hash, (const UINT8 *)input, len);
         ctx->msg_len += len;
     } else {
-    
+
          bytes_hashed = ctx->msg_len % L1_KEY_LEN;
          if (ctx->msg_len == L1_KEY_LEN)
              bytes_hashed = L1_KEY_LEN;
@@ -1124,15 +1128,15 @@
     UINT8 nh_result[STREAMS*sizeof(UINT64)];
     UINT32 nh_len;
     int extra_zeroes_needed;
-        
+
     /* If the message to be hashed is no longer than L1_HASH_LEN, we skip
      * the polyhash.
      */
     if (len <= L1_KEY_LEN) {
-    	if (len == 0)                  /* If zero length messages will not */
-    		nh_len = L1_PAD_BOUNDARY;  /* be seen, comment out this case   */ 
-    	else
-        	nh_len = ((len + (L1_PAD_BOUNDARY - 1)) & ~(L1_PAD_BOUNDARY - 1));
+	if (len == 0)                  /* If zero length messages will not */
+		nh_len = L1_PAD_BOUNDARY;  /* be seen, comment out this case   */
+	else
+		nh_len = ((len + (L1_PAD_BOUNDARY - 1)) & ~(L1_PAD_BOUNDARY - 1));
         extra_zeroes_needed = nh_len - len;
         zero_pad((UINT8 *)msg + len, extra_zeroes_needed);
         nh(&ahc->hash, (UINT8 *)msg, nh_len, len, nh_result);
@@ -1157,7 +1161,7 @@
 
         ip_long(ahc, res);
     }
-    
+
     uhash_reset(ahc);
     return 1;
 }
@@ -1171,9 +1175,9 @@
 
 /* The UMAC interface has two interfaces, an all-at-once interface where
  * the entire message to be authenticated is passed to UMAC in one buffer,
- * and a sequential interface where the message is presented a little at a   
+ * and a sequential interface where the message is presented a little at a
  * time. The all-at-once is more optimaized than the sequential version and
- * should be preferred when the sequential interface is not required. 
+ * should be preferred when the sequential interface is not required.
  */
 struct umac_ctx {
     uhash_ctx hash;          /* Hash function for message compression    */
@@ -1200,6 +1204,7 @@
     if (ctx) {
         if (ALLOC_BOUNDARY)
             ctx = (struct umac_ctx *)ctx->free_ptr;
+        explicit_bzero(ctx, sizeof(*ctx) + ALLOC_BOUNDARY);
         free(ctx);
     }
     return (1);
@@ -1208,14 +1213,14 @@
 /* ---------------------------------------------------------------------- */
 
 struct umac_ctx *umac_new(const u_char key[])
-/* Dynamically allocate a umac_ctx struct, initialize variables, 
+/* Dynamically allocate a umac_ctx struct, initialize variables,
  * generate subkeys from key. Align to 16-byte boundary.
  */
 {
     struct umac_ctx *ctx, *octx;
     size_t bytes_to_add;
     aes_int_key prf_key;
-    
+
     octx = ctx = xcalloc(1, sizeof(*ctx) + ALLOC_BOUNDARY);
     if (ctx) {
         if (ALLOC_BOUNDARY) {
@@ -1227,8 +1232,9 @@
         aes_key_setup(key, prf_key);
         pdf_init(&ctx->pdf, prf_key);
         uhash_init(&ctx->hash, prf_key);
+        explicit_bzero(prf_key, sizeof(prf_key));
     }
-        
+
     return (ctx);
 }
 
@@ -1239,7 +1245,7 @@
 {
     uhash_final(&ctx->hash, (u_char *)tag);
     pdf_gen_xor(&ctx->pdf, (const UINT8 *)nonce, (UINT8 *)tag);
-    
+
     return (1);
 }
 
@@ -1257,14 +1263,14 @@
 /* ---------------------------------------------------------------------- */
 
 #if 0
-int umac(struct umac_ctx *ctx, u_char *input, 
+int umac(struct umac_ctx *ctx, u_char *input,
          long len, u_char tag[],
          u_char nonce[8])
 /* All-in-one version simply calls umac_update() and umac_final().        */
 {
     uhash(&ctx->hash, input, len, (u_char *)tag);
     pdf_gen_xor(&ctx->pdf, (UINT8 *)nonce, (UINT8 *)tag);
-    
+
     return (1);
 }
 #endif
diff --git a/umac128.c b/umac128.c
new file mode 100644
index 0000000..f717925
--- /dev/null
+++ b/umac128.c
@@ -0,0 +1,10 @@
+/* $OpenBSD: umac128.c,v 1.2 2018/02/08 04:12:32 dtucker Exp $ */
+
+#define UMAC_OUTPUT_LEN	16
+#define umac_new	umac128_new
+#define umac_update	umac128_update
+#define umac_final	umac128_final
+#define umac_delete	umac128_delete
+#define umac_ctx	umac128_ctx
+
+#include "umac.c"
diff --git a/utf8.c b/utf8.c
index f2c89a2..db7cb8f 100644
--- a/utf8.c
+++ b/utf8.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: utf8.c,v 1.5 2017/02/19 00:10:57 djm Exp $ */
+/* $OpenBSD: utf8.c,v 1.8 2018/08/21 13:56:27 schwarze Exp $ */
 /*
  * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -53,6 +53,8 @@
  * For state-dependent encodings, recovery is impossible.
  * For arbitrary encodings, replacement of non-printable
  * characters would be non-trivial and too fragile.
+ * The comments indicate what nl_langinfo(CODESET)
+ * returns for US-ASCII on various operating systems.
  */
 
 static int
@@ -60,8 +62,12 @@
 	char	*loc;
 
 	loc = nl_langinfo(CODESET);
-	return strcmp(loc, "US-ASCII") != 0 && strcmp(loc, "UTF-8") != 0 &&
-	    strcmp(loc, "ANSI_X3.4-1968") != 0;
+	return strcmp(loc, "UTF-8") != 0 &&
+	    strcmp(loc, "US-ASCII") != 0 &&		/* OpenBSD */
+	    strcmp(loc, "ANSI_X3.4-1968") != 0 &&	/* Linux */
+	    strcmp(loc, "ISO8859-1") != 0 &&		/* AIX */
+	    strcmp(loc, "646") != 0 &&			/* Solaris, NetBSD */
+	    strcmp(loc, "") != 0;			/* Solaris 6 */
 }
 
 static int
@@ -75,7 +81,7 @@
 	tsz = *sz + 128;
 	if (tsz > maxsz)
 		tsz = maxsz;
-	if ((tp = realloc(*dst, tsz)) == NULL)
+	if ((tp = recallocarray(*dst, *sz, tsz, 1)) == NULL)
 		return -1;
 	*dp = tp + (*dp - *dst);
 	*dst = tp;
diff --git a/version.h b/version.h
index 269ebcd..f1bbf00 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
-/* $OpenBSD: version.h,v 1.78 2016/12/19 04:55:51 djm Exp $ */
+/* $OpenBSD: version.h,v 1.82 2018/07/03 11:42:12 djm Exp $ */
 
-#define SSH_VERSION	"OpenSSH_7.4"
+#define SSH_VERSION	"OpenSSH_7.8"
 
 #define SSH_PORTABLE	"p1"
 #define SSH_RELEASE	SSH_VERSION SSH_PORTABLE
diff --git a/xmalloc.c b/xmalloc.c
index b583236..5cc0310 100644
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: xmalloc.c,v 1.33 2016/02/15 09:47:49 dtucker Exp $ */
+/* $OpenBSD: xmalloc.c,v 1.34 2017/05/31 09:15:42 deraadt Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -77,6 +77,18 @@
 	return new_ptr;
 }
 
+void *
+xrecallocarray(void *ptr, size_t onmemb, size_t nmemb, size_t size)
+{
+	void *new_ptr;
+
+	new_ptr = recallocarray(ptr, onmemb, nmemb, size);
+	if (new_ptr == NULL)
+		fatal("xrecallocarray: out of memory (%zu elements of %zu bytes)",
+		    nmemb, size);
+	return new_ptr;
+}
+
 char *
 xstrdup(const char *str)
 {
diff --git a/xmalloc.h b/xmalloc.h
index e499289..cf38ddf 100644
--- a/xmalloc.h
+++ b/xmalloc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: xmalloc.h,v 1.16 2016/02/15 09:47:49 dtucker Exp $ */
+/* $OpenBSD: xmalloc.h,v 1.17 2017/05/31 09:15:42 deraadt Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -20,6 +20,7 @@
 void	*xmalloc(size_t);
 void	*xcalloc(size_t, size_t);
 void	*xreallocarray(void *, size_t, size_t);
+void	*xrecallocarray(void *, size_t, size_t, size_t);
 char	*xstrdup(const char *);
 int	 xasprintf(char **, const char *, ...)
                 __attribute__((__format__ (printf, 2, 3)))
diff --git a/xmss_commons.c b/xmss_commons.c
new file mode 100644
index 0000000..59486ae
--- /dev/null
+++ b/xmss_commons.c
@@ -0,0 +1,36 @@
+/* $OpenBSD: xmss_commons.c,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */
+/*
+xmss_commons.c 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#include "includes.h"
+#ifdef WITH_XMSS
+
+#include "xmss_commons.h"
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+void to_byte(unsigned char *out, unsigned long long in, uint32_t bytes)
+{
+  int32_t i;
+  for (i = bytes-1; i >= 0; i--) {
+    out[i] = in & 0xff;
+    in = in >> 8;
+  }
+}
+
+#if 0
+void hexdump(const unsigned char *a, size_t len)
+{
+  size_t i;
+  for (i = 0; i < len; i++)
+    printf("%02x", a[i]);
+}
+#endif
+#endif /* WITH_XMSS */
diff --git a/xmss_commons.h b/xmss_commons.h
new file mode 100644
index 0000000..a98e479
--- /dev/null
+++ b/xmss_commons.h
@@ -0,0 +1,21 @@
+#ifdef WITH_XMSS
+/* $OpenBSD: xmss_commons.h,v 1.3 2018/02/26 03:56:44 dtucker Exp $ */
+/*
+xmss_commons.h 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+#ifndef XMSS_COMMONS_H
+#define XMSS_COMMONS_H
+
+#include <stdlib.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#endif
+void to_byte(unsigned char *output, unsigned long long in, uint32_t bytes);
+#if 0
+void hexdump(const unsigned char *a, size_t len);
+#endif
+#endif /* WITH_XMSS */
diff --git a/xmss_fast.c b/xmss_fast.c
new file mode 100644
index 0000000..e37447f
--- /dev/null
+++ b/xmss_fast.c
@@ -0,0 +1,1106 @@
+/* $OpenBSD: xmss_fast.c,v 1.3 2018/03/22 07:06:11 markus Exp $ */
+/*
+xmss_fast.c version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#include "includes.h"
+#ifdef WITH_XMSS
+
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#include "xmss_fast.h"
+#include "crypto_api.h"
+#include "xmss_wots.h"
+#include "xmss_hash.h"
+
+#include "xmss_commons.h"
+#include "xmss_hash_address.h"
+// For testing
+#include "stdio.h"
+
+
+
+/**
+ * Used for pseudorandom keygeneration,
+ * generates the seed for the WOTS keypair at address addr
+ *
+ * takes n byte sk_seed and returns n byte seed using 32 byte address addr.
+ */
+static void get_seed(unsigned char *seed, const unsigned char *sk_seed, int n, uint32_t addr[8])
+{
+  unsigned char bytes[32];
+  // Make sure that chain addr, hash addr, and key bit are 0!
+  setChainADRS(addr,0);
+  setHashADRS(addr,0);
+  setKeyAndMask(addr,0);
+  // Generate pseudorandom value
+  addr_to_byte(bytes, addr);
+  prf(seed, bytes, sk_seed, n);
+}
+
+/**
+ * Initialize xmss params struct
+ * parameter names are the same as in the draft
+ * parameter k is K as used in the BDS algorithm
+ */
+int xmss_set_params(xmss_params *params, int n, int h, int w, int k)
+{
+  if (k >= h || k < 2 || (h - k) % 2) {
+    fprintf(stderr, "For BDS traversal, H - K must be even, with H > K >= 2!\n");
+    return 1;
+  }
+  params->h = h;
+  params->n = n;
+  params->k = k;
+  wots_params wots_par;
+  wots_set_params(&wots_par, n, w);
+  params->wots_par = wots_par;
+  return 0;
+}
+
+/**
+ * Initialize BDS state struct
+ * parameter names are the same as used in the description of the BDS traversal
+ */
+void xmss_set_bds_state(bds_state *state, unsigned char *stack, int stackoffset, unsigned char *stacklevels, unsigned char *auth, unsigned char *keep, treehash_inst *treehash, unsigned char *retain, int next_leaf)
+{
+  state->stack = stack;
+  state->stackoffset = stackoffset;
+  state->stacklevels = stacklevels;
+  state->auth = auth;
+  state->keep = keep;
+  state->treehash = treehash;
+  state->retain = retain;
+  state->next_leaf = next_leaf;
+}
+
+/**
+ * Initialize xmssmt_params struct
+ * parameter names are the same as in the draft
+ *
+ * Especially h is the total tree height, i.e. the XMSS trees have height h/d
+ */
+int xmssmt_set_params(xmssmt_params *params, int n, int h, int d, int w, int k)
+{
+  if (h % d) {
+    fprintf(stderr, "d must divide h without remainder!\n");
+    return 1;
+  }
+  params->h = h;
+  params->d = d;
+  params->n = n;
+  params->index_len = (h + 7) / 8;
+  xmss_params xmss_par;
+  if (xmss_set_params(&xmss_par, n, (h/d), w, k)) {
+    return 1;
+  }
+  params->xmss_par = xmss_par;
+  return 0;
+}
+
+/**
+ * Computes a leaf from a WOTS public key using an L-tree.
+ */
+static void l_tree(unsigned char *leaf, unsigned char *wots_pk, const xmss_params *params, const unsigned char *pub_seed, uint32_t addr[8])
+{
+  unsigned int l = params->wots_par.len;
+  unsigned int n = params->n;
+  uint32_t i = 0;
+  uint32_t height = 0;
+  uint32_t bound;
+
+  //ADRS.setTreeHeight(0);
+  setTreeHeight(addr, height);
+  
+  while (l > 1) {
+     bound = l >> 1; //floor(l / 2);
+     for (i = 0; i < bound; i++) {
+       //ADRS.setTreeIndex(i);
+       setTreeIndex(addr, i);
+       //wots_pk[i] = RAND_HASH(pk[2i], pk[2i + 1], SEED, ADRS);
+       hash_h(wots_pk+i*n, wots_pk+i*2*n, pub_seed, addr, n);
+     }
+     //if ( l % 2 == 1 ) {
+     if (l & 1) {
+       //pk[floor(l / 2) + 1] = pk[l];
+       memcpy(wots_pk+(l>>1)*n, wots_pk+(l-1)*n, n);
+       //l = ceil(l / 2);
+       l=(l>>1)+1;
+     }
+     else {
+       //l = ceil(l / 2);
+       l=(l>>1);
+     }
+     //ADRS.setTreeHeight(ADRS.getTreeHeight() + 1);
+     height++;
+     setTreeHeight(addr, height);
+   }
+   //return pk[0];
+   memcpy(leaf, wots_pk, n);
+}
+
+/**
+ * Computes the leaf at a given address. First generates the WOTS key pair, then computes leaf using l_tree. As this happens position independent, we only require that addr encodes the right ltree-address.
+ */
+static void gen_leaf_wots(unsigned char *leaf, const unsigned char *sk_seed, const xmss_params *params, const unsigned char *pub_seed, uint32_t ltree_addr[8], uint32_t ots_addr[8])
+{
+  unsigned char seed[params->n];
+  unsigned char pk[params->wots_par.keysize];
+
+  get_seed(seed, sk_seed, params->n, ots_addr);
+  wots_pkgen(pk, seed, &(params->wots_par), pub_seed, ots_addr);
+
+  l_tree(leaf, pk, params, pub_seed, ltree_addr);
+}
+
+static int treehash_minheight_on_stack(bds_state* state, const xmss_params *params, const treehash_inst *treehash) {
+  unsigned int r = params->h, i;
+  for (i = 0; i < treehash->stackusage; i++) {
+    if (state->stacklevels[state->stackoffset - i - 1] < r) {
+      r = state->stacklevels[state->stackoffset - i - 1];
+    }
+  }
+  return r;
+}
+
+/**
+ * Merkle's TreeHash algorithm. The address only needs to initialize the first 78 bits of addr. Everything else will be set by treehash.
+ * Currently only used for key generation.
+ *
+ */
+static void treehash_setup(unsigned char *node, int height, int index, bds_state *state, const unsigned char *sk_seed, const xmss_params *params, const unsigned char *pub_seed, const uint32_t addr[8])
+{
+  unsigned int idx = index;
+  unsigned int n = params->n;
+  unsigned int h = params->h;
+  unsigned int k = params->k;
+  // use three different addresses because at this point we use all three formats in parallel
+  uint32_t ots_addr[8];
+  uint32_t ltree_addr[8];
+  uint32_t  node_addr[8];
+  // only copy layer and tree address parts
+  memcpy(ots_addr, addr, 12);
+  // type = ots
+  setType(ots_addr, 0);
+  memcpy(ltree_addr, addr, 12);
+  setType(ltree_addr, 1);
+  memcpy(node_addr, addr, 12);
+  setType(node_addr, 2);
+
+  uint32_t lastnode, i;
+  unsigned char stack[(height+1)*n];
+  unsigned int stacklevels[height+1];
+  unsigned int stackoffset=0;
+  unsigned int nodeh;
+
+  lastnode = idx+(1<<height);
+
+  for (i = 0; i < h-k; i++) {
+    state->treehash[i].h = i;
+    state->treehash[i].completed = 1;
+    state->treehash[i].stackusage = 0;
+  }
+
+  i = 0;
+  for (; idx < lastnode; idx++) {
+    setLtreeADRS(ltree_addr, idx);
+    setOTSADRS(ots_addr, idx);
+    gen_leaf_wots(stack+stackoffset*n, sk_seed, params, pub_seed, ltree_addr, ots_addr);
+    stacklevels[stackoffset] = 0;
+    stackoffset++;
+    if (h - k > 0 && i == 3) {
+      memcpy(state->treehash[0].node, stack+stackoffset*n, n);
+    }
+    while (stackoffset>1 && stacklevels[stackoffset-1] == stacklevels[stackoffset-2])
+    {
+      nodeh = stacklevels[stackoffset-1];
+      if (i >> nodeh == 1) {
+        memcpy(state->auth + nodeh*n, stack+(stackoffset-1)*n, n);
+      }
+      else {
+        if (nodeh < h - k && i >> nodeh == 3) {
+          memcpy(state->treehash[nodeh].node, stack+(stackoffset-1)*n, n);
+        }
+        else if (nodeh >= h - k) {
+          memcpy(state->retain + ((1 << (h - 1 - nodeh)) + nodeh - h + (((i >> nodeh) - 3) >> 1)) * n, stack+(stackoffset-1)*n, n);
+        }
+      }
+      setTreeHeight(node_addr, stacklevels[stackoffset-1]);
+      setTreeIndex(node_addr, (idx >> (stacklevels[stackoffset-1]+1)));
+      hash_h(stack+(stackoffset-2)*n, stack+(stackoffset-2)*n, pub_seed,
+          node_addr, n);
+      stacklevels[stackoffset-2]++;
+      stackoffset--;
+    }
+    i++;
+  }
+
+  for (i = 0; i < n; i++)
+    node[i] = stack[i];
+}
+
+static void treehash_update(treehash_inst *treehash, bds_state *state, const unsigned char *sk_seed, const xmss_params *params, const unsigned char *pub_seed, const uint32_t addr[8]) {
+  int n = params->n;
+
+  uint32_t ots_addr[8];
+  uint32_t ltree_addr[8];
+  uint32_t  node_addr[8];
+  // only copy layer and tree address parts
+  memcpy(ots_addr, addr, 12);
+  // type = ots
+  setType(ots_addr, 0);
+  memcpy(ltree_addr, addr, 12);
+  setType(ltree_addr, 1);
+  memcpy(node_addr, addr, 12);
+  setType(node_addr, 2);
+
+  setLtreeADRS(ltree_addr, treehash->next_idx);
+  setOTSADRS(ots_addr, treehash->next_idx);
+
+  unsigned char nodebuffer[2 * n];
+  unsigned int nodeheight = 0;
+  gen_leaf_wots(nodebuffer, sk_seed, params, pub_seed, ltree_addr, ots_addr);
+  while (treehash->stackusage > 0 && state->stacklevels[state->stackoffset-1] == nodeheight) {
+    memcpy(nodebuffer + n, nodebuffer, n);
+    memcpy(nodebuffer, state->stack + (state->stackoffset-1)*n, n);
+    setTreeHeight(node_addr, nodeheight);
+    setTreeIndex(node_addr, (treehash->next_idx >> (nodeheight+1)));
+    hash_h(nodebuffer, nodebuffer, pub_seed, node_addr, n);
+    nodeheight++;
+    treehash->stackusage--;
+    state->stackoffset--;
+  }
+  if (nodeheight == treehash->h) { // this also implies stackusage == 0
+    memcpy(treehash->node, nodebuffer, n);
+    treehash->completed = 1;
+  }
+  else {
+    memcpy(state->stack + state->stackoffset*n, nodebuffer, n);
+    treehash->stackusage++;
+    state->stacklevels[state->stackoffset] = nodeheight;
+    state->stackoffset++;
+    treehash->next_idx++;
+  }
+}
+
+/**
+ * Computes a root node given a leaf and an authapth
+ */
+static void validate_authpath(unsigned char *root, const unsigned char *leaf, unsigned long leafidx, const unsigned char *authpath, const xmss_params *params, const unsigned char *pub_seed, uint32_t addr[8])
+{
+  unsigned int n = params->n;
+
+  uint32_t i, j;
+  unsigned char buffer[2*n];
+
+  // If leafidx is odd (last bit = 1), current path element is a right child and authpath has to go to the left.
+  // Otherwise, it is the other way around
+  if (leafidx & 1) {
+    for (j = 0; j < n; j++)
+      buffer[n+j] = leaf[j];
+    for (j = 0; j < n; j++)
+      buffer[j] = authpath[j];
+  }
+  else {
+    for (j = 0; j < n; j++)
+      buffer[j] = leaf[j];
+    for (j = 0; j < n; j++)
+      buffer[n+j] = authpath[j];
+  }
+  authpath += n;
+
+  for (i=0; i < params->h-1; i++) {
+    setTreeHeight(addr, i);
+    leafidx >>= 1;
+    setTreeIndex(addr, leafidx);
+    if (leafidx&1) {
+      hash_h(buffer+n, buffer, pub_seed, addr, n);
+      for (j = 0; j < n; j++)
+        buffer[j] = authpath[j];
+    }
+    else {
+      hash_h(buffer, buffer, pub_seed, addr, n);
+      for (j = 0; j < n; j++)
+        buffer[j+n] = authpath[j];
+    }
+    authpath += n;
+  }
+  setTreeHeight(addr, (params->h-1));
+  leafidx >>= 1;
+  setTreeIndex(addr, leafidx);
+  hash_h(root, buffer, pub_seed, addr, n);
+}
+
+/**
+ * Performs one treehash update on the instance that needs it the most.
+ * Returns 1 if such an instance was not found
+ **/
+static char bds_treehash_update(bds_state *state, unsigned int updates, const unsigned char *sk_seed, const xmss_params *params, unsigned char *pub_seed, const uint32_t addr[8]) {
+  uint32_t i, j;
+  unsigned int level, l_min, low;
+  unsigned int h = params->h;
+  unsigned int k = params->k;
+  unsigned int used = 0;
+
+  for (j = 0; j < updates; j++) {
+    l_min = h;
+    level = h - k;
+    for (i = 0; i < h - k; i++) {
+      if (state->treehash[i].completed) {
+        low = h;
+      }
+      else if (state->treehash[i].stackusage == 0) {
+        low = i;
+      }
+      else {
+        low = treehash_minheight_on_stack(state, params, &(state->treehash[i]));
+      }
+      if (low < l_min) {
+        level = i;
+        l_min = low;
+      }
+    }
+    if (level == h - k) {
+      break;
+    }
+    treehash_update(&(state->treehash[level]), state, sk_seed, params, pub_seed, addr);
+    used++;
+  }
+  return updates - used;
+}
+
+/**
+ * Updates the state (typically NEXT_i) by adding a leaf and updating the stack
+ * Returns 1 if all leaf nodes have already been processed
+ **/
+static char bds_state_update(bds_state *state, const unsigned char *sk_seed, const xmss_params *params, unsigned char *pub_seed, const uint32_t addr[8]) {
+  uint32_t ltree_addr[8];
+  uint32_t node_addr[8];
+  uint32_t ots_addr[8];
+
+  int n = params->n;
+  int h = params->h;
+  int k = params->k;
+
+  int nodeh;
+  int idx = state->next_leaf;
+  if (idx == 1 << h) {
+    return 1;
+  }
+
+  // only copy layer and tree address parts
+  memcpy(ots_addr, addr, 12);
+  // type = ots
+  setType(ots_addr, 0);
+  memcpy(ltree_addr, addr, 12);
+  setType(ltree_addr, 1);
+  memcpy(node_addr, addr, 12);
+  setType(node_addr, 2);
+  
+  setOTSADRS(ots_addr, idx);
+  setLtreeADRS(ltree_addr, idx);
+
+  gen_leaf_wots(state->stack+state->stackoffset*n, sk_seed, params, pub_seed, ltree_addr, ots_addr);
+
+  state->stacklevels[state->stackoffset] = 0;
+  state->stackoffset++;
+  if (h - k > 0 && idx == 3) {
+    memcpy(state->treehash[0].node, state->stack+state->stackoffset*n, n);
+  }
+  while (state->stackoffset>1 && state->stacklevels[state->stackoffset-1] == state->stacklevels[state->stackoffset-2]) {
+    nodeh = state->stacklevels[state->stackoffset-1];
+    if (idx >> nodeh == 1) {
+      memcpy(state->auth + nodeh*n, state->stack+(state->stackoffset-1)*n, n);
+    }
+    else {
+      if (nodeh < h - k && idx >> nodeh == 3) {
+        memcpy(state->treehash[nodeh].node, state->stack+(state->stackoffset-1)*n, n);
+      }
+      else if (nodeh >= h - k) {
+        memcpy(state->retain + ((1 << (h - 1 - nodeh)) + nodeh - h + (((idx >> nodeh) - 3) >> 1)) * n, state->stack+(state->stackoffset-1)*n, n);
+      }
+    }
+    setTreeHeight(node_addr, state->stacklevels[state->stackoffset-1]);
+    setTreeIndex(node_addr, (idx >> (state->stacklevels[state->stackoffset-1]+1)));
+    hash_h(state->stack+(state->stackoffset-2)*n, state->stack+(state->stackoffset-2)*n, pub_seed, node_addr, n);
+
+    state->stacklevels[state->stackoffset-2]++;
+    state->stackoffset--;
+  }
+  state->next_leaf++;
+  return 0;
+}
+
+/**
+ * Returns the auth path for node leaf_idx and computes the auth path for the
+ * next leaf node, using the algorithm described by Buchmann, Dahmen and Szydlo
+ * in "Post Quantum Cryptography", Springer 2009.
+ */
+static void bds_round(bds_state *state, const unsigned long leaf_idx, const unsigned char *sk_seed, const xmss_params *params, unsigned char *pub_seed, uint32_t addr[8])
+{
+  unsigned int i;
+  unsigned int n = params->n;
+  unsigned int h = params->h;
+  unsigned int k = params->k;
+
+  unsigned int tau = h;
+  unsigned int startidx;
+  unsigned int offset, rowidx;
+  unsigned char buf[2 * n];
+
+  uint32_t ots_addr[8];
+  uint32_t ltree_addr[8];
+  uint32_t  node_addr[8];
+  // only copy layer and tree address parts
+  memcpy(ots_addr, addr, 12);
+  // type = ots
+  setType(ots_addr, 0);
+  memcpy(ltree_addr, addr, 12);
+  setType(ltree_addr, 1);
+  memcpy(node_addr, addr, 12);
+  setType(node_addr, 2);
+
+  for (i = 0; i < h; i++) {
+    if (! ((leaf_idx >> i) & 1)) {
+      tau = i;
+      break;
+    }
+  }
+
+  if (tau > 0) {
+    memcpy(buf,     state->auth + (tau-1) * n, n);
+    // we need to do this before refreshing state->keep to prevent overwriting
+    memcpy(buf + n, state->keep + ((tau-1) >> 1) * n, n);
+  }
+  if (!((leaf_idx >> (tau + 1)) & 1) && (tau < h - 1)) {
+    memcpy(state->keep + (tau >> 1)*n, state->auth + tau*n, n);
+  }
+  if (tau == 0) {
+    setLtreeADRS(ltree_addr, leaf_idx);
+    setOTSADRS(ots_addr, leaf_idx);
+    gen_leaf_wots(state->auth, sk_seed, params, pub_seed, ltree_addr, ots_addr);
+  }
+  else {
+    setTreeHeight(node_addr, (tau-1));
+    setTreeIndex(node_addr, leaf_idx >> tau);
+    hash_h(state->auth + tau * n, buf, pub_seed, node_addr, n);
+    for (i = 0; i < tau; i++) {
+      if (i < h - k) {
+        memcpy(state->auth + i * n, state->treehash[i].node, n);
+      }
+      else {
+        offset = (1 << (h - 1 - i)) + i - h;
+        rowidx = ((leaf_idx >> i) - 1) >> 1;
+        memcpy(state->auth + i * n, state->retain + (offset + rowidx) * n, n);
+      }
+    }
+
+    for (i = 0; i < ((tau < h - k) ? tau : (h - k)); i++) {
+      startidx = leaf_idx + 1 + 3 * (1 << i);
+      if (startidx < 1U << h) {
+        state->treehash[i].h = i;
+        state->treehash[i].next_idx = startidx;
+        state->treehash[i].completed = 0;
+        state->treehash[i].stackusage = 0;
+      }
+    }
+  }
+}
+
+/*
+ * Generates a XMSS key pair for a given parameter set.
+ * Format sk: [(32bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
+ * Format pk: [root || PUB_SEED] omitting algo oid.
+ */
+int xmss_keypair(unsigned char *pk, unsigned char *sk, bds_state *state, xmss_params *params)
+{
+  unsigned int n = params->n;
+  // Set idx = 0
+  sk[0] = 0;
+  sk[1] = 0;
+  sk[2] = 0;
+  sk[3] = 0;
+  // Init SK_SEED (n byte), SK_PRF (n byte), and PUB_SEED (n byte)
+  randombytes(sk+4, 3*n);
+  // Copy PUB_SEED to public key
+  memcpy(pk+n, sk+4+2*n, n);
+
+  uint32_t addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+  // Compute root
+  treehash_setup(pk, params->h, 0, state, sk+4, params, sk+4+2*n, addr);
+  // copy root to sk
+  memcpy(sk+4+3*n, pk, n);
+  return 0;
+}
+
+/**
+ * Signs a message.
+ * Returns
+ * 1. an array containing the signature followed by the message AND
+ * 2. an updated secret key!
+ *
+ */
+int xmss_sign(unsigned char *sk, bds_state *state, unsigned char *sig_msg, unsigned long long *sig_msg_len, const unsigned char *msg, unsigned long long msglen, const xmss_params *params)
+{
+  unsigned int h = params->h;
+  unsigned int n = params->n;
+  unsigned int k = params->k;
+  uint16_t i = 0;
+
+  // Extract SK
+  unsigned long idx = ((unsigned long)sk[0] << 24) | ((unsigned long)sk[1] << 16) | ((unsigned long)sk[2] << 8) | sk[3];
+  unsigned char sk_seed[n];
+  memcpy(sk_seed, sk+4, n);
+  unsigned char sk_prf[n];
+  memcpy(sk_prf, sk+4+n, n);
+  unsigned char pub_seed[n];
+  memcpy(pub_seed, sk+4+2*n, n);
+  
+  // index as 32 bytes string
+  unsigned char idx_bytes_32[32];
+  to_byte(idx_bytes_32, idx, 32);
+  
+  unsigned char hash_key[3*n]; 
+  
+  // Update SK
+  sk[0] = ((idx + 1) >> 24) & 255;
+  sk[1] = ((idx + 1) >> 16) & 255;
+  sk[2] = ((idx + 1) >> 8) & 255;
+  sk[3] = (idx + 1) & 255;
+  // -- Secret key for this non-forward-secure version is now updated.
+  // -- A productive implementation should use a file handle instead and write the updated secret key at this point!
+
+  // Init working params
+  unsigned char R[n];
+  unsigned char msg_h[n];
+  unsigned char ots_seed[n];
+  uint32_t ots_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+  // ---------------------------------
+  // Message Hashing
+  // ---------------------------------
+
+  // Message Hash:
+  // First compute pseudorandom value
+  prf(R, idx_bytes_32, sk_prf, n);
+  // Generate hash key (R || root || idx)
+  memcpy(hash_key, R, n);
+  memcpy(hash_key+n, sk+4+3*n, n);
+  to_byte(hash_key+2*n, idx, n);
+  // Then use it for message digest
+  h_msg(msg_h, msg, msglen, hash_key, 3*n, n);
+
+  // Start collecting signature
+  *sig_msg_len = 0;
+
+  // Copy index to signature
+  sig_msg[0] = (idx >> 24) & 255;
+  sig_msg[1] = (idx >> 16) & 255;
+  sig_msg[2] = (idx >> 8) & 255;
+  sig_msg[3] = idx & 255;
+
+  sig_msg += 4;
+  *sig_msg_len += 4;
+
+  // Copy R to signature
+  for (i = 0; i < n; i++)
+    sig_msg[i] = R[i];
+
+  sig_msg += n;
+  *sig_msg_len += n;
+
+  // ----------------------------------
+  // Now we start to "really sign"
+  // ----------------------------------
+
+  // Prepare Address
+  setType(ots_addr, 0);
+  setOTSADRS(ots_addr, idx);
+
+  // Compute seed for OTS key pair
+  get_seed(ots_seed, sk_seed, n, ots_addr);
+
+  // Compute WOTS signature
+  wots_sign(sig_msg, msg_h, ots_seed, &(params->wots_par), pub_seed, ots_addr);
+
+  sig_msg += params->wots_par.keysize;
+  *sig_msg_len += params->wots_par.keysize;
+
+  // the auth path was already computed during the previous round
+  memcpy(sig_msg, state->auth, h*n);
+
+  if (idx < (1U << h) - 1) {
+    bds_round(state, idx, sk_seed, params, pub_seed, ots_addr);
+    bds_treehash_update(state, (h - k) >> 1, sk_seed, params, pub_seed, ots_addr);
+  }
+
+/* TODO: save key/bds state here! */
+
+  sig_msg += params->h*n;
+  *sig_msg_len += params->h*n;
+
+  //Whipe secret elements?
+  //zerobytes(tsk, CRYPTO_SECRETKEYBYTES);
+
+
+  memcpy(sig_msg, msg, msglen);
+  *sig_msg_len += msglen;
+
+  return 0;
+}
+
+/**
+ * Verifies a given message signature pair under a given public key.
+ */
+int xmss_sign_open(unsigned char *msg, unsigned long long *msglen, const unsigned char *sig_msg, unsigned long long sig_msg_len, const unsigned char *pk, const xmss_params *params)
+{
+  unsigned int n = params->n;
+
+  unsigned long long i, m_len;
+  unsigned long idx=0;
+  unsigned char wots_pk[params->wots_par.keysize];
+  unsigned char pkhash[n];
+  unsigned char root[n];
+  unsigned char msg_h[n];
+  unsigned char hash_key[3*n];
+
+  unsigned char pub_seed[n];
+  memcpy(pub_seed, pk+n, n);
+
+  // Init addresses
+  uint32_t ots_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+  uint32_t ltree_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+  uint32_t node_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+  setType(ots_addr, 0);
+  setType(ltree_addr, 1);
+  setType(node_addr, 2);
+
+  // Extract index
+  idx = ((unsigned long)sig_msg[0] << 24) | ((unsigned long)sig_msg[1] << 16) | ((unsigned long)sig_msg[2] << 8) | sig_msg[3];
+  printf("verify:: idx = %lu\n", idx);
+  
+  // Generate hash key (R || root || idx)
+  memcpy(hash_key, sig_msg+4,n);
+  memcpy(hash_key+n, pk, n);
+  to_byte(hash_key+2*n, idx, n);
+  
+  sig_msg += (n+4);
+  sig_msg_len -= (n+4);
+
+  // hash message 
+  unsigned long long tmp_sig_len = params->wots_par.keysize+params->h*n;
+  m_len = sig_msg_len - tmp_sig_len;
+  h_msg(msg_h, sig_msg + tmp_sig_len, m_len, hash_key, 3*n, n);
+
+  //-----------------------
+  // Verify signature
+  //-----------------------
+
+  // Prepare Address
+  setOTSADRS(ots_addr, idx);
+  // Check WOTS signature
+  wots_pkFromSig(wots_pk, sig_msg, msg_h, &(params->wots_par), pub_seed, ots_addr);
+
+  sig_msg += params->wots_par.keysize;
+  sig_msg_len -= params->wots_par.keysize;
+
+  // Compute Ltree
+  setLtreeADRS(ltree_addr, idx);
+  l_tree(pkhash, wots_pk, params, pub_seed, ltree_addr);
+
+  // Compute root
+  validate_authpath(root, pkhash, idx, sig_msg, params, pub_seed, node_addr);
+
+  sig_msg += params->h*n;
+  sig_msg_len -= params->h*n;
+
+  for (i = 0; i < n; i++)
+    if (root[i] != pk[i])
+      goto fail;
+
+  *msglen = sig_msg_len;
+  for (i = 0; i < *msglen; i++)
+    msg[i] = sig_msg[i];
+
+  return 0;
+
+
+fail:
+  *msglen = sig_msg_len;
+  for (i = 0; i < *msglen; i++)
+    msg[i] = 0;
+  *msglen = -1;
+  return -1;
+}
+
+/*
+ * Generates a XMSSMT key pair for a given parameter set.
+ * Format sk: [(ceil(h/8) bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
+ * Format pk: [root || PUB_SEED] omitting algo oid.
+ */
+int xmssmt_keypair(unsigned char *pk, unsigned char *sk, bds_state *states, unsigned char *wots_sigs, xmssmt_params *params)
+{
+  unsigned int n = params->n;
+  unsigned int i;
+  unsigned char ots_seed[params->n];
+  // Set idx = 0
+  for (i = 0; i < params->index_len; i++) {
+    sk[i] = 0;
+  }
+  // Init SK_SEED (n byte), SK_PRF (n byte), and PUB_SEED (n byte)
+  randombytes(sk+params->index_len, 3*n);
+  // Copy PUB_SEED to public key
+  memcpy(pk+n, sk+params->index_len+2*n, n);
+
+  // Set address to point on the single tree on layer d-1
+  uint32_t addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+  setLayerADRS(addr, (params->d-1));
+  // Set up state and compute wots signatures for all but topmost tree root
+  for (i = 0; i < params->d - 1; i++) {
+    // Compute seed for OTS key pair
+    treehash_setup(pk, params->xmss_par.h, 0, states + i, sk+params->index_len, &(params->xmss_par), pk+n, addr);
+    setLayerADRS(addr, (i+1));
+    get_seed(ots_seed, sk+params->index_len, n, addr);
+    wots_sign(wots_sigs + i*params->xmss_par.wots_par.keysize, pk, ots_seed, &(params->xmss_par.wots_par), pk+n, addr);
+  }
+  treehash_setup(pk, params->xmss_par.h, 0, states + i, sk+params->index_len, &(params->xmss_par), pk+n, addr);
+  memcpy(sk+params->index_len+3*n, pk, n);
+  return 0;
+}
+
+/**
+ * Signs a message.
+ * Returns
+ * 1. an array containing the signature followed by the message AND
+ * 2. an updated secret key!
+ *
+ */
+int xmssmt_sign(unsigned char *sk, bds_state *states, unsigned char *wots_sigs, unsigned char *sig_msg, unsigned long long *sig_msg_len, const unsigned char *msg, unsigned long long msglen, const xmssmt_params *params)
+{
+  unsigned int n = params->n;
+  
+  unsigned int tree_h = params->xmss_par.h;
+  unsigned int h = params->h;
+  unsigned int k = params->xmss_par.k;
+  unsigned int idx_len = params->index_len;
+  uint64_t idx_tree;
+  uint32_t idx_leaf;
+  uint64_t i, j;
+  int needswap_upto = -1;
+  unsigned int updates;
+
+  unsigned char sk_seed[n];
+  unsigned char sk_prf[n];
+  unsigned char pub_seed[n];
+  // Init working params
+  unsigned char R[n];
+  unsigned char msg_h[n];
+  unsigned char hash_key[3*n];
+  unsigned char ots_seed[n];
+  uint32_t addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+  uint32_t ots_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+  unsigned char idx_bytes_32[32];
+  bds_state tmp;
+
+  // Extract SK 
+  unsigned long long idx = 0;
+  for (i = 0; i < idx_len; i++) {
+    idx |= ((unsigned long long)sk[i]) << 8*(idx_len - 1 - i);
+  }
+
+  memcpy(sk_seed, sk+idx_len, n);
+  memcpy(sk_prf, sk+idx_len+n, n);
+  memcpy(pub_seed, sk+idx_len+2*n, n);
+
+  // Update SK
+  for (i = 0; i < idx_len; i++) {
+    sk[i] = ((idx + 1) >> 8*(idx_len - 1 - i)) & 255;
+  }
+  // -- Secret key for this non-forward-secure version is now updated.
+  // -- A productive implementation should use a file handle instead and write the updated secret key at this point!
+
+
+  // ---------------------------------
+  // Message Hashing
+  // ---------------------------------
+
+  // Message Hash:
+  // First compute pseudorandom value
+  to_byte(idx_bytes_32, idx, 32);
+  prf(R, idx_bytes_32, sk_prf, n);
+  // Generate hash key (R || root || idx)
+  memcpy(hash_key, R, n);
+  memcpy(hash_key+n, sk+idx_len+3*n, n);
+  to_byte(hash_key+2*n, idx, n);
+  
+  // Then use it for message digest
+  h_msg(msg_h, msg, msglen, hash_key, 3*n, n);
+
+  // Start collecting signature
+  *sig_msg_len = 0;
+
+  // Copy index to signature
+  for (i = 0; i < idx_len; i++) {
+    sig_msg[i] = (idx >> 8*(idx_len - 1 - i)) & 255;
+  }
+
+  sig_msg += idx_len;
+  *sig_msg_len += idx_len;
+
+  // Copy R to signature
+  for (i = 0; i < n; i++)
+    sig_msg[i] = R[i];
+
+  sig_msg += n;
+  *sig_msg_len += n;
+
+  // ----------------------------------
+  // Now we start to "really sign"
+  // ----------------------------------
+
+  // Handle lowest layer separately as it is slightly different...
+
+  // Prepare Address
+  setType(ots_addr, 0);
+  idx_tree = idx >> tree_h;
+  idx_leaf = (idx & ((1 << tree_h)-1));
+  setLayerADRS(ots_addr, 0);
+  setTreeADRS(ots_addr, idx_tree);
+  setOTSADRS(ots_addr, idx_leaf);
+
+  // Compute seed for OTS key pair
+  get_seed(ots_seed, sk_seed, n, ots_addr);
+
+  // Compute WOTS signature
+  wots_sign(sig_msg, msg_h, ots_seed, &(params->xmss_par.wots_par), pub_seed, ots_addr);
+
+  sig_msg += params->xmss_par.wots_par.keysize;
+  *sig_msg_len += params->xmss_par.wots_par.keysize;
+
+  memcpy(sig_msg, states[0].auth, tree_h*n);
+  sig_msg += tree_h*n;
+  *sig_msg_len += tree_h*n;
+
+  // prepare signature of remaining layers
+  for (i = 1; i < params->d; i++) {
+    // put WOTS signature in place
+    memcpy(sig_msg, wots_sigs + (i-1)*params->xmss_par.wots_par.keysize, params->xmss_par.wots_par.keysize);
+
+    sig_msg += params->xmss_par.wots_par.keysize;
+    *sig_msg_len += params->xmss_par.wots_par.keysize;
+
+    // put AUTH nodes in place
+    memcpy(sig_msg, states[i].auth, tree_h*n);
+    sig_msg += tree_h*n;
+    *sig_msg_len += tree_h*n;
+  }
+
+  updates = (tree_h - k) >> 1;
+
+  setTreeADRS(addr, (idx_tree + 1));
+  // mandatory update for NEXT_0 (does not count towards h-k/2) if NEXT_0 exists
+  if ((1 + idx_tree) * (1 << tree_h) + idx_leaf < (1ULL << h)) {
+    bds_state_update(&states[params->d], sk_seed, &(params->xmss_par), pub_seed, addr);
+  }
+
+  for (i = 0; i < params->d; i++) {
+    // check if we're not at the end of a tree
+    if (! (((idx + 1) & ((1ULL << ((i+1)*tree_h)) - 1)) == 0)) {
+      idx_leaf = (idx >> (tree_h * i)) & ((1 << tree_h)-1);
+      idx_tree = (idx >> (tree_h * (i+1)));
+      setLayerADRS(addr, i);
+      setTreeADRS(addr, idx_tree);
+      if (i == (unsigned int) (needswap_upto + 1)) {
+        bds_round(&states[i], idx_leaf, sk_seed, &(params->xmss_par), pub_seed, addr);
+      }
+      updates = bds_treehash_update(&states[i], updates, sk_seed, &(params->xmss_par), pub_seed, addr);
+      setTreeADRS(addr, (idx_tree + 1));
+      // if a NEXT-tree exists for this level;
+      if ((1 + idx_tree) * (1 << tree_h) + idx_leaf < (1ULL << (h - tree_h * i))) {
+        if (i > 0 && updates > 0 && states[params->d + i].next_leaf < (1ULL << h)) {
+          bds_state_update(&states[params->d + i], sk_seed, &(params->xmss_par), pub_seed, addr);
+          updates--;
+        }
+      }
+    }
+    else if (idx < (1ULL << h) - 1) {
+      memcpy(&tmp, states+params->d + i, sizeof(bds_state));
+      memcpy(states+params->d + i, states + i, sizeof(bds_state));
+      memcpy(states + i, &tmp, sizeof(bds_state));
+
+      setLayerADRS(ots_addr, (i+1));
+      setTreeADRS(ots_addr, ((idx + 1) >> ((i+2) * tree_h)));
+      setOTSADRS(ots_addr, (((idx >> ((i+1) * tree_h)) + 1) & ((1 << tree_h)-1)));
+
+      get_seed(ots_seed, sk+params->index_len, n, ots_addr);
+      wots_sign(wots_sigs + i*params->xmss_par.wots_par.keysize, states[i].stack, ots_seed, &(params->xmss_par.wots_par), pub_seed, ots_addr);
+
+      states[params->d + i].stackoffset = 0;
+      states[params->d + i].next_leaf = 0;
+
+      updates--; // WOTS-signing counts as one update
+      needswap_upto = i;
+      for (j = 0; j < tree_h-k; j++) {
+        states[i].treehash[j].completed = 1;
+      }
+    }
+  }
+
+  //Whipe secret elements?
+  //zerobytes(tsk, CRYPTO_SECRETKEYBYTES);
+
+  memcpy(sig_msg, msg, msglen);
+  *sig_msg_len += msglen;
+
+  return 0;
+}
+
+/**
+ * Verifies a given message signature pair under a given public key.
+ */
+int xmssmt_sign_open(unsigned char *msg, unsigned long long *msglen, const unsigned char *sig_msg, unsigned long long sig_msg_len, const unsigned char *pk, const xmssmt_params *params)
+{
+  unsigned int n = params->n;
+
+  unsigned int tree_h = params->xmss_par.h;
+  unsigned int idx_len = params->index_len;
+  uint64_t idx_tree;
+  uint32_t idx_leaf;
+
+  unsigned long long i, m_len;
+  unsigned long long idx=0;
+  unsigned char wots_pk[params->xmss_par.wots_par.keysize];
+  unsigned char pkhash[n];
+  unsigned char root[n];
+  unsigned char msg_h[n];
+  unsigned char hash_key[3*n];
+
+  unsigned char pub_seed[n];
+  memcpy(pub_seed, pk+n, n);
+
+  // Init addresses
+  uint32_t ots_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+  uint32_t ltree_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+  uint32_t node_addr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+  // Extract index
+  for (i = 0; i < idx_len; i++) {
+    idx |= ((unsigned long long)sig_msg[i]) << (8*(idx_len - 1 - i));
+  }
+  printf("verify:: idx = %llu\n", idx);
+  sig_msg += idx_len;
+  sig_msg_len -= idx_len;
+  
+  // Generate hash key (R || root || idx)
+  memcpy(hash_key, sig_msg,n);
+  memcpy(hash_key+n, pk, n);
+  to_byte(hash_key+2*n, idx, n);
+
+  sig_msg += n;
+  sig_msg_len -= n;
+  
+
+  // hash message (recall, R is now on pole position at sig_msg
+  unsigned long long tmp_sig_len = (params->d * params->xmss_par.wots_par.keysize) + (params->h * n);
+  m_len = sig_msg_len - tmp_sig_len;
+  h_msg(msg_h, sig_msg + tmp_sig_len, m_len, hash_key, 3*n, n);
+
+  
+  //-----------------------
+  // Verify signature
+  //-----------------------
+
+  // Prepare Address
+  idx_tree = idx >> tree_h;
+  idx_leaf = (idx & ((1 << tree_h)-1));
+  setLayerADRS(ots_addr, 0);
+  setTreeADRS(ots_addr, idx_tree);
+  setType(ots_addr, 0);
+
+  memcpy(ltree_addr, ots_addr, 12);
+  setType(ltree_addr, 1);
+
+  memcpy(node_addr, ltree_addr, 12);
+  setType(node_addr, 2);
+  
+  setOTSADRS(ots_addr, idx_leaf);
+
+  // Check WOTS signature
+  wots_pkFromSig(wots_pk, sig_msg, msg_h, &(params->xmss_par.wots_par), pub_seed, ots_addr);
+
+  sig_msg += params->xmss_par.wots_par.keysize;
+  sig_msg_len -= params->xmss_par.wots_par.keysize;
+
+  // Compute Ltree
+  setLtreeADRS(ltree_addr, idx_leaf);
+  l_tree(pkhash, wots_pk, &(params->xmss_par), pub_seed, ltree_addr);
+
+  // Compute root
+  validate_authpath(root, pkhash, idx_leaf, sig_msg, &(params->xmss_par), pub_seed, node_addr);
+
+  sig_msg += tree_h*n;
+  sig_msg_len -= tree_h*n;
+
+  for (i = 1; i < params->d; i++) {
+    // Prepare Address
+    idx_leaf = (idx_tree & ((1 << tree_h)-1));
+    idx_tree = idx_tree >> tree_h;
+
+    setLayerADRS(ots_addr, i);
+    setTreeADRS(ots_addr, idx_tree);
+    setType(ots_addr, 0);
+
+    memcpy(ltree_addr, ots_addr, 12);
+    setType(ltree_addr, 1);
+
+    memcpy(node_addr, ltree_addr, 12);
+    setType(node_addr, 2);
+
+    setOTSADRS(ots_addr, idx_leaf);
+
+    // Check WOTS signature
+    wots_pkFromSig(wots_pk, sig_msg, root, &(params->xmss_par.wots_par), pub_seed, ots_addr);
+
+    sig_msg += params->xmss_par.wots_par.keysize;
+    sig_msg_len -= params->xmss_par.wots_par.keysize;
+
+    // Compute Ltree
+    setLtreeADRS(ltree_addr, idx_leaf);
+    l_tree(pkhash, wots_pk, &(params->xmss_par), pub_seed, ltree_addr);
+
+    // Compute root
+    validate_authpath(root, pkhash, idx_leaf, sig_msg, &(params->xmss_par), pub_seed, node_addr);
+
+    sig_msg += tree_h*n;
+    sig_msg_len -= tree_h*n;
+
+  }
+
+  for (i = 0; i < n; i++)
+    if (root[i] != pk[i])
+      goto fail;
+
+  *msglen = sig_msg_len;
+  for (i = 0; i < *msglen; i++)
+    msg[i] = sig_msg[i];
+
+  return 0;
+
+
+fail:
+  *msglen = sig_msg_len;
+  for (i = 0; i < *msglen; i++)
+    msg[i] = 0;
+  *msglen = -1;
+  return -1;
+}
+#endif /* WITH_XMSS */
diff --git a/xmss_fast.h b/xmss_fast.h
new file mode 100644
index 0000000..2ffba70
--- /dev/null
+++ b/xmss_fast.h
@@ -0,0 +1,111 @@
+#ifdef WITH_XMSS
+/* $OpenBSD: xmss_fast.h,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */
+/*
+xmss_fast.h version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#include "xmss_wots.h"
+
+#ifndef XMSS_H
+#define XMSS_H
+typedef struct{
+  unsigned int level;
+  unsigned long long subtree;
+  unsigned int subleaf;
+} leafaddr;
+
+typedef struct{
+  wots_params wots_par;
+  unsigned int n;
+  unsigned int h;
+  unsigned int k;
+} xmss_params;
+
+typedef struct{
+  xmss_params xmss_par;
+  unsigned int n;
+  unsigned int h;
+  unsigned int d;
+  unsigned int index_len;
+} xmssmt_params;
+
+typedef struct{
+  unsigned int h;
+  unsigned int next_idx;
+  unsigned int stackusage;
+  unsigned char completed;
+  unsigned char *node;
+} treehash_inst;
+
+typedef struct {
+  unsigned char *stack;
+  unsigned int stackoffset;
+  unsigned char *stacklevels;
+  unsigned char *auth;
+  unsigned char *keep;
+  treehash_inst *treehash;
+  unsigned char *retain;
+  unsigned int next_leaf;
+} bds_state;
+
+/**
+ * Initialize BDS state struct
+ * parameter names are the same as used in the description of the BDS traversal
+ */
+void xmss_set_bds_state(bds_state *state, unsigned char *stack, int stackoffset, unsigned char *stacklevels, unsigned char *auth, unsigned char *keep, treehash_inst *treehash, unsigned char *retain, int next_leaf);
+/**
+ * Initializes parameter set.
+ * Needed, for any of the other methods.
+ */
+int xmss_set_params(xmss_params *params, int n, int h, int w, int k);
+/**
+ * Initialize xmssmt_params struct
+ * parameter names are the same as in the draft
+ * 
+ * Especially h is the total tree height, i.e. the XMSS trees have height h/d
+ */
+int xmssmt_set_params(xmssmt_params *params, int n, int h, int d, int w, int k);
+/**
+ * Generates a XMSS key pair for a given parameter set.
+ * Format sk: [(32bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
+ * Format pk: [root || PUB_SEED] omitting algo oid.
+ */
+int xmss_keypair(unsigned char *pk, unsigned char *sk, bds_state *state, xmss_params *params);
+/**
+ * Signs a message.
+ * Returns 
+ * 1. an array containing the signature followed by the message AND
+ * 2. an updated secret key!
+ * 
+ */
+int xmss_sign(unsigned char *sk, bds_state *state, unsigned char *sig_msg, unsigned long long *sig_msg_len, const unsigned char *msg,unsigned long long msglen, const xmss_params *params);
+/**
+ * Verifies a given message signature pair under a given public key.
+ * 
+ * Note: msg and msglen are pure outputs which carry the message in case verification succeeds. The (input) message is assumed to be within sig_msg which has the form (sig||msg). 
+ */
+int xmss_sign_open(unsigned char *msg,unsigned long long *msglen, const unsigned char *sig_msg,unsigned long long sig_msg_len, const unsigned char *pk, const xmss_params *params);
+
+/*
+ * Generates a XMSSMT key pair for a given parameter set.
+ * Format sk: [(ceil(h/8) bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
+ * Format pk: [root || PUB_SEED] omitting algo oid.
+ */
+int xmssmt_keypair(unsigned char *pk, unsigned char *sk, bds_state *states, unsigned char *wots_sigs, xmssmt_params *params);
+/**
+ * Signs a message.
+ * Returns 
+ * 1. an array containing the signature followed by the message AND
+ * 2. an updated secret key!
+ * 
+ */
+int xmssmt_sign(unsigned char *sk, bds_state *state, unsigned char *wots_sigs, unsigned char *sig_msg, unsigned long long *sig_msg_len, const unsigned char *msg, unsigned long long msglen, const xmssmt_params *params);
+/**
+ * Verifies a given message signature pair under a given public key.
+ */
+int xmssmt_sign_open(unsigned char *msg, unsigned long long *msglen, const unsigned char *sig_msg, unsigned long long sig_msg_len, const unsigned char *pk, const xmssmt_params *params);
+#endif
+#endif /* WITH_XMSS */
diff --git a/xmss_hash.c b/xmss_hash.c
new file mode 100644
index 0000000..b9eee7c
--- /dev/null
+++ b/xmss_hash.c
@@ -0,0 +1,140 @@
+/* $OpenBSD: xmss_hash.c,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */
+/*
+hash.c version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#include "includes.h"
+#ifdef WITH_XMSS
+
+#include "xmss_hash_address.h"
+#include "xmss_commons.h"
+#include "xmss_hash.h"
+
+#include <stddef.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include <stdio.h>
+#include <string.h>
+#include <openssl/sha.h>
+#include <openssl/hmac.h>
+#include <openssl/evp.h>
+
+int core_hash_SHA2(unsigned char *, const unsigned int, const unsigned char *,
+    unsigned int, const unsigned char *, unsigned long long, unsigned int);
+
+unsigned char* addr_to_byte(unsigned char *bytes, const uint32_t addr[8]){
+#if IS_LITTLE_ENDIAN==1 
+  int i = 0;
+  for(i=0;i<8;i++)
+    to_byte(bytes+i*4, addr[i],4);
+  return bytes;  
+#else
+  memcpy(bytes, addr, 32);
+  return bytes; 
+#endif   
+}
+
+int core_hash_SHA2(unsigned char *out, const unsigned int type, const unsigned char *key, unsigned int keylen, const unsigned char *in, unsigned long long inlen, unsigned int n){  
+  unsigned long long i = 0;
+  unsigned char buf[inlen + n + keylen];
+  
+  // Input is (toByte(X, 32) || KEY || M) 
+  
+  // set toByte
+  to_byte(buf, type, n);
+  
+  for (i=0; i < keylen; i++) {
+    buf[i+n] = key[i];
+  }
+  
+  for (i=0; i < inlen; i++) {
+    buf[keylen + n + i] = in[i];
+  }
+
+  if (n == 32) {
+    SHA256(buf, inlen + keylen + n, out);
+    return 0;
+  }
+  else {
+    if (n == 64) {
+      SHA512(buf, inlen + keylen + n, out);
+      return 0;
+    }
+  }
+  return 1;
+}
+
+/**
+ * Implements PRF
+ */
+int prf(unsigned char *out, const unsigned char *in, const unsigned char *key, unsigned int keylen)
+{ 
+  return core_hash_SHA2(out, 3, key, keylen, in, 32, keylen);
+}
+
+/*
+ * Implemts H_msg
+ */
+int h_msg(unsigned char *out, const unsigned char *in, unsigned long long inlen, const unsigned char *key, const unsigned int keylen, const unsigned int n)
+{
+  if (keylen != 3*n){
+    // H_msg takes 3n-bit keys, but n does not match the keylength of keylen
+    return -1;
+  }  
+  return core_hash_SHA2(out, 2, key, keylen, in, inlen, n);
+}
+
+/**
+ * We assume the left half is in in[0]...in[n-1]
+ */
+int hash_h(unsigned char *out, const unsigned char *in, const unsigned char *pub_seed, uint32_t addr[8], const unsigned int n)
+{
+
+  unsigned char buf[2*n];
+  unsigned char key[n];
+  unsigned char bitmask[2*n];
+  unsigned char byte_addr[32];
+  unsigned int i;
+
+  setKeyAndMask(addr, 0);
+  addr_to_byte(byte_addr, addr);
+  prf(key, byte_addr, pub_seed, n);
+  // Use MSB order
+  setKeyAndMask(addr, 1);
+  addr_to_byte(byte_addr, addr);
+  prf(bitmask, byte_addr, pub_seed, n);
+  setKeyAndMask(addr, 2);
+  addr_to_byte(byte_addr, addr);
+  prf(bitmask+n, byte_addr, pub_seed, n);
+  for (i = 0; i < 2*n; i++) {
+    buf[i] = in[i] ^ bitmask[i];
+  }
+  return core_hash_SHA2(out, 1, key, n, buf, 2*n, n);
+}
+
+int hash_f(unsigned char *out, const unsigned char *in, const unsigned char *pub_seed, uint32_t addr[8], const unsigned int n)
+{
+  unsigned char buf[n];
+  unsigned char key[n];
+  unsigned char bitmask[n];
+  unsigned char byte_addr[32];
+  unsigned int i;
+
+  setKeyAndMask(addr, 0);  
+  addr_to_byte(byte_addr, addr);  
+  prf(key, byte_addr, pub_seed, n);
+  
+  setKeyAndMask(addr, 1);
+  addr_to_byte(byte_addr, addr);
+  prf(bitmask, byte_addr, pub_seed, n);
+  
+  for (i = 0; i < n; i++) {
+    buf[i] = in[i] ^ bitmask[i];
+  }
+  return core_hash_SHA2(out, 0, key, n, buf, n, n);
+}
+#endif /* WITH_XMSS */
diff --git a/xmss_hash.h b/xmss_hash.h
new file mode 100644
index 0000000..d19c621
--- /dev/null
+++ b/xmss_hash.h
@@ -0,0 +1,22 @@
+#ifdef WITH_XMSS
+/* $OpenBSD: xmss_hash.h,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */
+/*
+hash.h version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#ifndef HASH_H
+#define HASH_H
+
+#define IS_LITTLE_ENDIAN 1
+
+unsigned char* addr_to_byte(unsigned char *bytes, const uint32_t addr[8]);
+int prf(unsigned char *out, const unsigned char *in, const unsigned char *key, unsigned int keylen);
+int h_msg(unsigned char *out,const unsigned char *in,unsigned long long inlen, const unsigned char *key, const unsigned int keylen, const unsigned int n);
+int hash_h(unsigned char *out, const unsigned char *in, const unsigned char *pub_seed, uint32_t addr[8], const unsigned int n);
+int hash_f(unsigned char *out, const unsigned char *in, const unsigned char *pub_seed, uint32_t addr[8], const unsigned int n);
+
+#endif
+#endif /* WITH_XMSS */
diff --git a/xmss_hash_address.c b/xmss_hash_address.c
new file mode 100644
index 0000000..c6c1347
--- /dev/null
+++ b/xmss_hash_address.c
@@ -0,0 +1,66 @@
+/* $OpenBSD: xmss_hash_address.c,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */
+/*
+hash_address.c version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+#include "includes.h"
+#ifdef WITH_XMSS
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include "xmss_hash_address.h"	/* prototypes */
+
+void setLayerADRS(uint32_t adrs[8], uint32_t layer){
+  adrs[0] = layer;
+}
+
+void setTreeADRS(uint32_t adrs[8], uint64_t tree){
+  adrs[1] = (uint32_t) (tree >> 32);
+  adrs[2] = (uint32_t) tree;
+}
+
+void setType(uint32_t adrs[8], uint32_t type){
+  adrs[3] = type;
+  int i;
+  for(i = 4; i < 8; i++){
+    adrs[i] = 0;
+  }
+}
+
+void setKeyAndMask(uint32_t adrs[8], uint32_t keyAndMask){
+  adrs[7] = keyAndMask;
+}
+
+// OTS
+
+void setOTSADRS(uint32_t adrs[8], uint32_t ots){
+  adrs[4] = ots;
+}
+
+void setChainADRS(uint32_t adrs[8], uint32_t chain){
+  adrs[5] = chain;
+}
+
+void setHashADRS(uint32_t adrs[8], uint32_t hash){
+  adrs[6] = hash;
+}
+
+// L-tree
+
+void setLtreeADRS(uint32_t adrs[8], uint32_t ltree){
+  adrs[4] = ltree;
+}
+
+// Hash Tree & L-tree
+
+void setTreeHeight(uint32_t adrs[8], uint32_t treeHeight){
+  adrs[5] = treeHeight;
+}
+
+void setTreeIndex(uint32_t adrs[8], uint32_t treeIndex){
+  adrs[6] = treeIndex;
+}
+#endif /* WITH_XMSS */
diff --git a/xmss_hash_address.h b/xmss_hash_address.h
new file mode 100644
index 0000000..66bb4cc
--- /dev/null
+++ b/xmss_hash_address.h
@@ -0,0 +1,40 @@
+#ifdef WITH_XMSS
+/* $OpenBSD: xmss_hash_address.h,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */
+/*
+hash_address.h version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+void setLayerADRS(uint32_t adrs[8], uint32_t layer);
+
+void setTreeADRS(uint32_t adrs[8], uint64_t tree);
+
+void setType(uint32_t adrs[8], uint32_t type);
+
+void setKeyAndMask(uint32_t adrs[8], uint32_t keyAndMask);
+
+// OTS
+
+void setOTSADRS(uint32_t adrs[8], uint32_t ots);
+
+void setChainADRS(uint32_t adrs[8], uint32_t chain);
+
+void setHashADRS(uint32_t adrs[8], uint32_t hash);
+
+// L-tree
+
+void setLtreeADRS(uint32_t adrs[8], uint32_t ltree);
+
+// Hash Tree & L-tree
+
+void setTreeHeight(uint32_t adrs[8], uint32_t treeHeight);
+
+void setTreeIndex(uint32_t adrs[8], uint32_t treeIndex);
+
+#endif /* WITH_XMSS */
diff --git a/xmss_wots.c b/xmss_wots.c
new file mode 100644
index 0000000..ed904cd
--- /dev/null
+++ b/xmss_wots.c
@@ -0,0 +1,192 @@
+/* $OpenBSD: xmss_wots.c,v 1.3 2018/04/10 00:10:49 djm Exp $ */
+/*
+wots.c version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#include "includes.h"
+#ifdef WITH_XMSS
+
+#include <stdlib.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include <limits.h>
+#include "xmss_commons.h"
+#include "xmss_hash.h"
+#include "xmss_wots.h"
+#include "xmss_hash_address.h"
+
+
+/* libm-free version of log2() for wots */
+static inline int
+wots_log2(uint32_t v)
+{
+  int      b;
+
+  for (b = sizeof (v) * CHAR_BIT - 1; b >= 0; b--) {
+    if ((1U << b) & v) {
+      return b;
+    }
+  }
+  return 0;
+}
+
+void
+wots_set_params(wots_params *params, int n, int w)
+{
+  params->n = n;
+  params->w = w;
+  params->log_w = wots_log2(params->w);
+  params->len_1 = (CHAR_BIT * n) / params->log_w;
+  params->len_2 = (wots_log2(params->len_1 * (w - 1)) / params->log_w) + 1;
+  params->len = params->len_1 + params->len_2;
+  params->keysize = params->len * params->n;
+}
+
+/**
+ * Helper method for pseudorandom key generation
+ * Expands an n-byte array into a len*n byte array
+ * this is done using PRF
+ */
+static void expand_seed(unsigned char *outseeds, const unsigned char *inseed, const wots_params *params)
+{
+  uint32_t i = 0;
+  unsigned char ctr[32];
+  for(i = 0; i < params->len; i++){
+    to_byte(ctr, i, 32);
+    prf((outseeds + (i*params->n)), ctr, inseed, params->n);
+  }
+}
+
+/**
+ * Computes the chaining function.
+ * out and in have to be n-byte arrays
+ *
+ * interprets in as start-th value of the chain
+ * addr has to contain the address of the chain
+ */
+static void gen_chain(unsigned char *out, const unsigned char *in, unsigned int start, unsigned int steps, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8])
+{
+  uint32_t i, j;
+  for (j = 0; j < params->n; j++)
+    out[j] = in[j];
+
+  for (i = start; i < (start+steps) && i < params->w; i++) {
+    setHashADRS(addr, i);
+    hash_f(out, out, pub_seed, addr, params->n);
+  }
+}
+
+/**
+ * base_w algorithm as described in draft.
+ *
+ *
+ */
+static void base_w(int *output, const int out_len, const unsigned char *input, const wots_params *params)
+{
+  int in = 0;
+  int out = 0;
+  uint32_t total = 0;
+  int bits = 0;
+  int consumed = 0;
+
+  for (consumed = 0; consumed < out_len; consumed++) {
+    if (bits == 0) {
+      total = input[in];
+      in++;
+      bits += 8;
+    }
+    bits -= params->log_w;
+    output[out] = (total >> bits) & (params->w - 1);
+    out++;
+  }
+}
+
+void wots_pkgen(unsigned char *pk, const unsigned char *sk, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8])
+{
+  uint32_t i;
+  expand_seed(pk, sk, params);
+  for (i=0; i < params->len; i++) {
+    setChainADRS(addr, i);
+    gen_chain(pk+i*params->n, pk+i*params->n, 0, params->w-1, params, pub_seed, addr);
+  }
+}
+
+
+int wots_sign(unsigned char *sig, const unsigned char *msg, const unsigned char *sk, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8])
+{
+  //int basew[params->len];
+  int csum = 0;
+  uint32_t i = 0;
+  int *basew = calloc(params->len, sizeof(int));
+  if (basew == NULL)
+    return -1;
+
+  base_w(basew, params->len_1, msg, params);
+
+  for (i=0; i < params->len_1; i++) {
+    csum += params->w - 1 - basew[i];
+  }
+
+  csum = csum << (8 - ((params->len_2 * params->log_w) % 8));
+
+  int len_2_bytes = ((params->len_2 * params->log_w) + 7) / 8;
+
+  unsigned char csum_bytes[len_2_bytes];
+  to_byte(csum_bytes, csum, len_2_bytes);
+
+  int csum_basew[params->len_2];
+  base_w(csum_basew, params->len_2, csum_bytes, params);
+
+  for (i = 0; i < params->len_2; i++) {
+    basew[params->len_1 + i] = csum_basew[i];
+  }
+
+  expand_seed(sig, sk, params);
+
+  for (i = 0; i < params->len; i++) {
+    setChainADRS(addr, i);
+    gen_chain(sig+i*params->n, sig+i*params->n, 0, basew[i], params, pub_seed, addr);
+  }
+  free(basew);
+  return 0;
+}
+
+int wots_pkFromSig(unsigned char *pk, const unsigned char *sig, const unsigned char *msg, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8])
+{
+  int csum = 0;
+  uint32_t i = 0;
+  int *basew = calloc(params->len, sizeof(int));
+  if (basew == NULL)
+    return -1;
+
+  base_w(basew, params->len_1, msg, params);
+
+  for (i=0; i < params->len_1; i++) {
+    csum += params->w - 1 - basew[i];
+  }
+
+  csum = csum << (8 - ((params->len_2 * params->log_w) % 8));
+
+  int len_2_bytes = ((params->len_2 * params->log_w) + 7) / 8;
+
+  unsigned char csum_bytes[len_2_bytes];
+  to_byte(csum_bytes, csum, len_2_bytes);
+
+  int csum_basew[params->len_2];
+  base_w(csum_basew, params->len_2, csum_bytes, params);
+
+  for (i = 0; i < params->len_2; i++) {
+    basew[params->len_1 + i] = csum_basew[i];
+  }
+  for (i=0; i < params->len; i++) {
+    setChainADRS(addr, i);
+    gen_chain(pk+i*params->n, sig+i*params->n, basew[i], params->w-1-basew[i], params, pub_seed, addr);
+  }
+  free(basew);
+  return 0;
+}
+#endif /* WITH_XMSS */
diff --git a/xmss_wots.h b/xmss_wots.h
new file mode 100644
index 0000000..1eebf3b
--- /dev/null
+++ b/xmss_wots.h
@@ -0,0 +1,64 @@
+#ifdef WITH_XMSS
+/* $OpenBSD: xmss_wots.h,v 1.3 2018/02/26 12:14:53 dtucker Exp $ */
+/*
+wots.h version 20160722
+Andreas Hülsing
+Joost Rijneveld
+Public domain.
+*/
+
+#ifndef WOTS_H
+#define WOTS_H
+
+#ifdef HAVE_STDINT_H
+#include "stdint.h"
+#endif
+
+/**
+ * WOTS parameter set
+ * 
+ * Meaning as defined in draft-irtf-cfrg-xmss-hash-based-signatures-02
+ */
+typedef struct {
+  uint32_t len_1;
+  uint32_t len_2;
+  uint32_t len;
+  uint32_t n;
+  uint32_t w;
+  uint32_t log_w;
+  uint32_t keysize;
+} wots_params;
+
+/**
+ * Set the WOTS parameters, 
+ * only m, n, w are required as inputs,
+ * len, len_1, and len_2 are computed from those.
+ *
+ * Assumes w is a power of 2
+ */
+void wots_set_params(wots_params *params, int n, int w);
+
+/**
+ * WOTS key generation. Takes a 32byte seed for the secret key, expands it to a full WOTS secret key and computes the corresponding public key. 
+ * For this it takes the seed pub_seed which is used to generate bitmasks and hash keys and the address of this WOTS key pair addr
+ * 
+ * params, must have been initialized before using wots_set params for params ! This is not done in this function
+ * 
+ * Places the computed public key at address pk.
+ */
+void wots_pkgen(unsigned char *pk, const unsigned char *sk, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8]);
+
+/**
+ * Takes a m-byte message and the 32-byte seed for the secret key to compute a signature that is placed at "sig".
+ *  
+ */
+int wots_sign(unsigned char *sig, const unsigned char *msg, const unsigned char *sk, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8]);
+
+/**
+ * Takes a WOTS signature, a m-byte message and computes a WOTS public key that it places at pk.
+ * 
+ */
+int wots_pkFromSig(unsigned char *pk, const unsigned char *sig, const unsigned char *msg, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8]);
+
+#endif
+#endif /* WITH_XMSS */